
Docker 容器化从零到实战的全栈指南什么是 Docker 容器化Docker 是一种开源的容器化平台它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。与传统的虚拟机不同Docker 容器共享宿主机的操作系统内核因此启动速度更快、资源占用更少。容器化技术解决了“在我机器上能运行”的经典问题让开发、测试和生产环境保持一致。## 为什么选择 Docker-环境一致性开发、测试、生产环境完全一致避免“水土不服”。-快速部署容器秒级启动比虚拟机快数倍。-资源隔离每个容器拥有独立的文件系统、网络和进程空间。-可移植性一次构建随处运行Linux、Windows、macOS。## 核心概念速览-镜像Image只读模板包含应用及其依赖。例如nginx:latest。-容器Container镜像的运行实例可读写、可启动、可停止。-Dockerfile构建镜像的脚本文件。-Docker Compose定义和运行多容器应用的工具。## 实战一构建一个 Python Web 应用容器### 1. 创建项目结构bashmkdir docker-python-appcd docker-python-app### 2. 编写 Python 应用创建app.pypythonfrom flask import Flask# 初始化 Flask 应用app Flask(__name__)app.route(/)def hello(): return Hello from Docker Container! # 如果直接运行此脚本启动开发服务器if __name__ __main__: # 监听 0.0.0.0:5000允许外部访问 app.run(host0.0.0.0, port5000, debugTrue)### 3. 编写 Dockerfile创建Dockerfiledockerfile# 使用官方 Python 3.11 镜像作为基础FROM python:3.11-slim# 设置工作目录WORKDIR /app# 将当前目录下的 requirements.txt 复制到容器中# 注意这个文件后面会创建COPY requirements.txt .# 安装 Python 依赖RUN pip install --no-cache-dir -r requirements.txt# 将应用代码复制到容器COPY app.py .# 暴露容器端口 5000EXPOSE 5000# 容器启动时运行的命令CMD [python, app.py]### 4. 创建依赖文件创建requirements.txtflask3.0.0### 5. 构建并运行容器bash# 构建镜像标签为 my-python-app:v1docker build -t my-python-app:v1 .# 运行容器将宿主机 8080 端口映射到容器 5000 端口docker run -d -p 8080:5000 --name my-app my-python-app:v1# 查看运行中的容器docker ps# 测试应用curl http://localhost:8080# 输出Hello from Docker Container! 代码注释说明--d表示后台运行容器。--p 8080:5000将宿主机 8080 端口映射到容器的 5000 端口。---name给容器命名方便管理。## 实战二使用 Docker Compose 管理多服务假设我们需要一个 Python Web 应用 Redis 缓存的组合。Docker Compose 可以一键启动多个容器。### 1. 更新 Python 应用修改app.py加入 Redis 计数功能pythonfrom flask import Flaskimport redisimport os# 初始化 Flask 应用app Flask(__name__)# 从环境变量获取 Redis 主机地址默认 localhostredis_host os.getenv(REDIS_HOST, localhost)# 连接 Redis 服务器r redis.Redis(hostredis_host, port6379, decode_responsesTrue)app.route(/)def hello(): return Hello from Docker Container! app.route(/count)def count(): # 增加计数并返回当前值 visits r.incr(counter) return fVisit count: {visits}if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)更新requirements.txtflask3.0.0redis5.0.0### 2. 编写 docker-compose.yml创建docker-compose.ymlyamlversion: 3.8services: # Web 应用服务 web: build: . # 使用当前目录的 Dockerfile 构建 ports: - 8080:5000 # 端口映射 environment: - REDIS_HOSTredis # 将环境变量设置为 Redis 服务名 depends_on: - redis # 确保 Redis 先启动 # Redis 缓存服务 redis: image: redis:7-alpine # 使用官方 Redis 镜像 ports: - 6379:6379 # 暴露 Redis 端口可选 volumes: - redis-data:/data # 持久化 Redis 数据# 定义命名卷volumes: redis-data:### 3. 启动多容器应用bash# 启动所有服务后台运行docker-compose up -d# 查看运行状态docker-compose ps# 测试应用curl http://localhost:8080/count# 输出Visit count: 1curl http://localhost:8080/count# 输出Visit count: 2# 查看日志docker-compose logs -f# 停止并移除所有容器docker-compose down代码注释说明-build: .表示使用当前目录的 Dockerfile 构建镜像。-environment设置环境变量让 Web 应用知道 Redis 的主机名。-depends_on确保 Redis 容器在 Web 容器之前启动。-volumes实现数据持久化防止容器删除后数据丢失。## 高级技巧与最佳实践### 1. 优化 Dockerfile 减少镜像大小dockerfile# 多阶段构建示例FROM python:3.11-slim AS builderWORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtFROM python:3.11-slimWORKDIR /appCOPY --frombuilder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packagesCOPY app.py .EXPOSE 5000CMD [python, app.py]### 2. 使用 .dockerignore 文件创建.dockerignore排除不必要的文件__pycache__.git*.pyc.env*.md### 3. 常用 Docker 命令速查bash# 镜像管理docker images # 列出镜像docker rmi image_id # 删除镜像docker pull image # 拉取远程镜像# 容器管理docker stop container # 停止容器docker start container # 启动已停止的容器docker rm container # 删除容器docker exec -it container /bin/bash # 进入容器终端# 日志与监控docker logs container # 查看日志docker stats # 查看资源占用## 总结Docker 容器化是现代 DevOps 的基石它通过标准化的打包和运行方式彻底改变了应用的交付和部署流程。本文通过两个实战示例展示了从单个 Python Web 应用到多服务组合Web Redis的完整容器化过程。关键要点-Dockerfile是构建镜像的蓝图需要优化以减少层数和体积。-Docker Compose是管理多容器应用的利器适合微服务架构。-环境变量和卷挂载是实现配置灵活性和数据持久化的关键。- 容器化不仅仅是“打包”更是对开发、测试、运维全流程的重新思考。掌握 Docker 容器化意味着你能在任何环境中快速、可靠地部署应用。无论你是前端、后端还是全栈工程师容器化都将成为你工具箱中不可或缺的一部分。