Docker 容器化部署与 CI/CD 自动化运维实战指南

为什么使用 Docker 进行运维

传统部署方式依赖手动配置环境,容易出现环境不一致的问题。Docker通过容器化技术将应用及其依赖打包为标准化单元,确保开发、测试、生产环境的一致性,大幅简化部署和运维流程。

Docker 基础命令

# 拉取镜像
docker pull nginx:alpine

# 构建镜像
docker build -t myapp:v1 .

# 运行容器
docker run -d --name myapp -p 80:3000 -v /data/app:/app/data myapp:v1

# 查看运行中的容器
docker ps

# 查看容器日志
docker logs -f myapp

# 进入容器
docker exec -it myapp /bin/sh

Dockerfile 多阶段构建

# 阶段1:构建
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# 阶段2:运行
FROM node:18-alpine AS runner
WORKDIR /app
RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
USER appuser
EXPOSE 3000
CMD ["node", "dist/server.js"]

多阶段构建可以将最终镜像体积从数百MB减小到几十MB。

Docker Compose 多容器编排

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
      - cache
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    restart: unless-stopped

  cache:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  pgdata:
# 一键启动所有服务
docker compose up -d

GitHub Actions CI/CD 流水线

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to Server
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: deploy
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd /var/www/myapp
            git pull origin main
            docker compose build
            docker compose up -d
            docker image prune -f

容器日志管理

# 查看日志
docker compose logs -f --tail=100 web

# 配置日志驱动
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

总结

Docker + CI/CD的自动化运维方案可以将部署时间从小时级缩短到分钟级,同时保证部署的一致性和可重复性。建议从小项目开始实践,逐步建立完整的自动化运维体系。