温馨提示×

Docker在CentOS上的自动化部署策略

小樊
42
2025-12-27 04:44:29
栏目: 智能运维

整体架构与流程

  • 基础环境:在 CentOS 上安装并启动 Docker CE,建议使用官方仓库并配置镜像加速,便于后续拉取与构建镜像。
  • 应用交付物:为应用编写 Dockerfile,通过多阶段构建减小镜像体积并固化运行环境。
  • 编排与配置:单机或少量服务用 Docker Compose 管理;多机/多环境用 Jenkins/GitHub ActionsCI/CD 编排构建、测试、推送与部署。
  • 交付与回滚:镜像以 标签(如 Git SHA/语义版本) 管理,生产环境采用“先拉取新镜像→切换服务→健康检查→必要时回滚”的策略。
  • 安全与合规:镜像与仓库凭据受控,服务器最小权限运行,日志与审计到位。

在 CentOS 上落地步骤

  • 安装 Docker(推荐官方仓库)
    • 安装依赖与仓库:sudo yum update -y && sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    • 添加仓库:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    • 安装并启动:sudo yum install -y docker-ce docker-ce-cli containerd.io && sudo systemctl start docker && sudo systemctl enable docker
    • 验证:docker --version
  • 配置镜像加速(可选)
    • 编辑 /etc/docker/daemon.json:{“registry-mirrors”: [“https://”]}
    • 重启 Docker:sudo systemctl restart docker
  • 编写示例 Dockerfile(Node.js)
    • FROM node:18-alpine
    • WORKDIR /usr/src/app
    • COPY package*.json ./
    • RUN npm ci --only=production
    • COPY . .
    • EXPOSE 3000
    • CMD [“node”,“server.js”]
  • 构建与本地验证
    • 构建:docker build -t your-app:latest .
    • 运行:docker run -d -p 3000:3000 --name app your-app:latest
    • 校验:curl http://localhost:3000 或 docker logs -f app

自动化部署方案对比与选型

方案 适用场景 关键工具/配置 优点 注意点
Shell 脚本 单机快速交付 deploy.sh、docker build/run 简单直观、门槛低 需自行处理幂等、回滚与并发
Docker Compose 单机/少量服务 docker-compose.yml 多容器编排、配置集中 主要面向单机,生产高可用需额外方案
Jenkins 内网自托管 CI/CD Jenkinsfile、Docker Pipeline 插件 可编排复杂流程、与内网系统集成 需维护 Jenkins 与权限
GitHub Actions 托管 CI/CD actions/checkout、docker/login-action、docker/build-push-action 与仓库深度集成、开箱即用 需妥善管理 Secrets 与 Runner 环境
Ansible 批量主机交付 Playbook、docker_image/docker_container 模块 无侵入 SSH、可批量执行 需编写与维护 Playbook

示例流水线

  • GitHub Actions(推送到 main 分支即构建并部署到 CentOS 服务器)
    • 在仓库创建 .github/workflows/deploy.yml:
      name: Deploy to Docker
      on:
      push:
      branches: [ main ]
      jobs:
      build-and-deploy:
      runs-on: ubuntu-latest
      steps:
      - name: Checkout
      uses: actions/checkout@v4
      - name: Login to Docker Hub
      uses: docker/login-action@v3
      with:
      username: ${{ secrets.DOCKER_HUB_USERNAME }}
      password: ${{ secrets.DOCKER_HUB_TOKEN }}
      - name: Build and push
      uses: docker/build-push-action@v5
      with:
      context: .
      push: true
      tags: ${{ secrets.DOCKER_HUB_USERNAME }}/your-app:${{ github.sha }}
      - name: Deploy to CentOS
      uses: appleboy/ssh-action@master
      with:
      host: ${{ secrets.SERVER_HOST }}
      username: ${{ secrets.SERVER_USER }}
      key: ${{ secrets.SSH_PRIVATE_KEY }}
      script: |
      docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/your-app:${{ github.sha }}
      docker stop app || true && docker rm app || true
      docker run -d --name app -p 3000:3000 ${{ secrets.DOCKER_HUB_USERNAME }}/your-app:${{ github.sha }}
  • Jenkins Pipeline(内网环境)
    • 安装 Jenkins 与插件(Docker Pipeline、Git),将 jenkins 用户加入 docker 组并重启 Jenkins。
    • 在 Jenkinsfile 中定义 stages:Checkout → Build Image → Push → Deploy(SSH 到目标 CentOS 执行拉取与滚动更新)。
    • 通过 Webhook 或轮询触发构建,实现代码提交即自动部署。

生产级最佳实践与安全加固

  • 镜像与版本管理:使用 不可变标签(Git SHA/语义版本),避免直接覆盖 latest;为回滚预留历史标签。
  • 零停机部署:在 Compose/Swarm/K8s 中使用滚动更新;若用裸 Docker,先启动新容器做健康检查,再切换别名或停止旧容器。
  • 最小权限:CI Runner/部署账号最小权限;服务器上以非 root 运行 Docker(必要时通过 sudo 授权特定命令)。
  • 凭据治理:镜像仓库与服务器登录信息使用 Secrets 管理,禁止硬编码;SSH 使用密钥并限制可登录用户与命令。
  • 日志与监控:集中采集容器日志(如 JSON 文件驱动 + 日志收集器),监控容器与主机资源,设置告警。
  • 网络与数据:使用自定义桥接网络隔离服务;持久化数据用 卷(Volume) 或外部存储,避免数据落在容器层。
  • 安全基线:启用 Content Trust、定期扫描镜像漏洞;精简镜像层数并移除调试工具;限制容器资源与系统调用。

0