Docker 容器化

📅 2026/7/27 0:05:04 👁️ 阅读次数 📝 编程学习
Docker 容器化

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(host='0.0.0.0', port=5000, debug=True)### 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.txtflask==3.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(host=redis_host, port=6379, decode_responses=True)@app.route('/')def hello(): return "Hello from Docker Container! 🐳"@app.route('/count')def count(): # 增加计数并返回当前值 visits = r.incr('counter') return f"Visit count: {visits}"if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)更新requirements.txtflask==3.0.0redis==5.0.0### 2. 编写 docker-compose.yml创建docker-compose.ymlyamlversion: '3.8'services: # Web 应用服务 web: build: . # 使用当前目录的 Dockerfile 构建 ports: - "8080:5000" # 端口映射 environment: - REDIS_HOST=redis # 将环境变量设置为 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 --from=builder /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 容器化,意味着你能在任何环境中快速、可靠地部署应用。无论你是前端、后端还是全栈工程师,容器化都将成为你工具箱中不可或缺的一部分。