返回资源中心

Docker 容器化部署

工作流
DevOps
0 次浏览
0 个赞
Docker容器化部署DevOps

资源描述

本工作流详细讲解 Docker 容器化部署的标准化流程,涵盖从 Dockerfile 编写、镜像构建、Docker Compose 编排到生产环境最佳实践。适用于 DevOps 工程师及后端开发者,帮助您快速实现应用的容器化改造与自动化部署,提升交付效率与环境一致性,是构建现代化 CI/CD 流水线的必备指南。

详细内容

## Docker 容器化部署工作流 ### 工作流概述 本工作流提供了一套标准化的 Docker 容器化部署指南,帮助开发者将本地应用无缝迁移至容器环境。通过规范化的 Dockerfile 编写与 Docker Compose 编排,实现“一次构建,到处运行”,确保开发、测试与生产环境的高度一致性。 ### 分步骤操作说明 #### 步骤 1:环境准备与项目分析 1. 确认宿主机已安装 Docker 和 Docker Compose,并检查版本:`docker -v` 和 `docker compose version`。 2. 分析项目依赖,确定基础镜像版本(如 Node.js、Python、Java 等),并梳理应用运行所需的端口、环境变量及外部依赖(如数据库、缓存)。 #### 步骤 2:编写与优化 Dockerfile 在项目根目录创建 `Dockerfile`。采用多阶段构建和非 root 用户运行以提升安全性和减小镜像体积。以 Node.js 应用为例: ```dockerfile # 阶段 1:构建依赖 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # 阶段 2:运行环境 FROM node:18-alpine WORKDIR /app # 复制构建阶段的依赖 COPY --from=builder /app/node_modules ./node_modules COPY . . # 安全最佳实践:切换到非 root 用户 USER node EXPOSE 3000 CMD ["node", "server.js"] ``` #### 步骤 3:配置 .dockerignore 并构建镜像 1. 创建 `.dockerignore` 文件,排除无关文件以减小上下文体积并防止敏感信息泄露: ```text node_modules npm-debug.log .git .env Dockerfile .dockerignore ``` 2. 执行构建命令,为镜像打上语义化标签:`docker build -t myapp:1.0.0 .` #### 步骤 4:使用 Docker Compose 编排多容器服务 对于包含数据库等依赖的应用,使用 `docker-compose.yml` 进行服务编排: ```yaml version: "3.8" services: app: build: . image: myapp:1.0.0 ports: - "3000:3000" environment: - NODE_ENV=production - DB_HOST=db depends_on: db: condition: service_healthy restart: unless-stopped db: image: postgres:14-alpine environment: POSTGRES_PASSWORD: example POSTGRES_DB: myappdb volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 volumes: pgdata: ``` #### 步骤 5:部署运行与日志监控 1. 启动所有服务(后台运行):`docker compose up -d` 2. 查看实时日志以排查启动问题:`docker compose logs -f app` 3. 验证服务状态与健康检查:`docker compose ps` 4. 停止并清理资源(如需重新部署):`docker compose down -v`(注意 `-v` 会删除数据卷)。 ### 注意事项与最佳实践 - **镜像瘦身**:优先使用 `alpine` 或 `slim` 版本的基础镜像;合并 `RUN` 指令以减少镜像层数;及时清理构建缓存(如 `npm cache clean --force`)。 - **安全性**:切勿在 Dockerfile 中硬编码密码或密钥,应通过环境变量或 Secrets 注入;始终使用非 root 用户运行容器进程。 - **利用缓存**:将不常变动的依赖安装指令(如 `COPY package.json` 和 `RUN npm install`)放在 `COPY . .` 之前,充分利用 Docker 的构建缓存机制。 - **健康检查**:在 Compose 中配置 `healthcheck`,确保依赖服务(如数据库)完全就绪后,应用容器再启动。 ### 常见问题提示 (FAQ) **Q1: 容器启动后立即退出 (Exited) 怎么办?** A: 使用 `docker logs <container_name_or_id>` 查看容器的标准输出和错误日志。常见原因包括:端口被占用、环境变量缺失、数据库连接失败或启动命令错误。 **Q2: 构建镜像时提示 `COPY failed: file not found`?** A: 检查 `.dockerignore` 文件是否误删了必要的文件(如 `package.json`),或者确认 `COPY` 指令的源路径相对于构建上下文(Context)是否正确。 **Q3: Docker Compose 提示 `port is already allocated`?** A: 宿主机的 3000 端口已被其他进程占用。可通过 `lsof -i :3000` 查找并停止占用进程,或在 `docker-compose.yml` 中修改左侧的宿主机映射端口(如 `3001:3000`)。