Docker 容器化部署实战:从镜像构建到生产环境
## Docker 容器化部署实战:从镜像构建到生产环境 Docker 已经成为现代软件开发和部署的标准工具。它通过容器化技术,解决了"在我机器上能跑"的经典问题。本文从实际项目出发,梳理 Docker 容器化部署的完整流程。 ## 为什么需要容器化 传统部署方式直接在服务器上安装应用和依赖,容易产生环境冲突和版本不一致。容器化的核心优势: - **环境隔离**:每个容器有独立的文件系统和进程空间,互不影响 - **一致性**:开发、测试、生产环境使用同一个镜像,消除环境差异 - **快速部署**:镜像启动秒级完成,比虚拟机快得多 - **资源高效**:容器共享宿主机内核,内存和 CPU 开销远低于虚拟机 ## Dockerfile 编写规范 一个生产可用的 Dockerfile 需要注意以下几点: ```dockerfile # 使用官方轻量级基础镜像 FROM python:3.12-slim # 设置工作目录 WORKDIR /app # 先复制依赖文件,利用 Docker 层缓存 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 再复制源代码 COPY . . # 以非 root 用户运行 RUN useradd -m appuser USER appuser # 暴露端口 EXPOSE 8000 # 启动命令 CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"] ``` 关键要点: 1. 基础镜像选 slim 或 alpine 版本,减小体积 2. 按变更频率排序指令,依赖文件放前面,利用层缓存 3. 永远不要以 root 运行应用,创建专用用户 4. 用 `.dockerignore` 排除不需要的文件 ## Docker Compose 编排多容器 实际项目通常包含 Web 服务、数据库、缓存等多个组件。Docker Compose 用一个 YAML 文件管理: ```yaml version: "3.9" services: web: build: . ports: - "8000:8000" depends_on: - db - redis environment: - DATABASE_URL=postgres://user:pass@db:5432/app restart: unless-stopped db: image: postgres:16-alpine environment: - POSTGRES_DB=app - POSTGRES_USER=user - POSTGRES_PASSWORD=pass volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped redis: image: redis:7-alpine restart: unless-stopped volumes: pgdata: ``` 启动命令:`docker compose up -d`,停止:`docker compose down`。 ## 生产环境注意事项 ### 镜像安全 - 定期扫描漏洞:`docker scan myimage` - 使用多阶段构建减小镜像体积 - 不把密钥和凭证打包进镜像 ### 日志管理 容器日志默认写入宿主机文件,生产环境应配置日志驱动: ```bash docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 ... ``` ### 资源限制 为容器设置 CPU 和内存限制,防止单个服务耗尽宿主机资源: ```bash docker run --cpus="1.5" --memory="512m" ... ``` ### 健康检查 在 Dockerfile 中定义 HEALTHCHECK,让编排器能自动检测服务状态: ```dockerfile HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -f http://localhost:8000/health || exit 1 ``` ### 网络配置 生产环境应使用自定义网络,容器间通过服务名通信: ```bash docker network create app-net docker run --network app-net ... ``` ## 总结 Docker 容器化部署的核心流程是:编写 Dockerfile → 构建镜像 → 用 Compose 编排 → 部署到服务器。掌握 Dockerfile 编写规范、Compose 编排、生产环境的安全配置,就能覆盖大部分项目的部署需求。关键是要始终考虑安全(非 root 运行、资源限制、日志管理)和可维护性(层缓存、健康检查、网络隔离)。
- 点赞
- 收藏
- 关注作者
评论(0)