在 Debian 上用 Docker 实现自动化部署
一 架构与流程
- 代码托管与触发:将应用托管在 Git(GitHub/GitLab),通过 push/合并请求触发流水线。
- CI 构建与推送:在 CI 中执行 docker build 与 docker push,产出带版本标签的镜像(如 yourname/app:latest、yourname/app:1.2.3)。
- 目标机器部署:在 Debian 生产/测试机上通过 SSH 拉取镜像并运行容器,建议使用 Docker Compose 管理服务编排与回滚。
- 可选编排:多服务用 docker-compose.yml 定义网络、卷与重启策略,实现一键启停与滚动更新。
二 在 Debian 上准备环境
- 安装 Docker 与 Docker Compose(推荐插件方式)
- 更新索引并安装依赖
- sudo apt-get update
- sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common
- 添加 Docker 官方 GPG 密钥与 APT 源(使用 keyring 更安全)
- curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- echo “deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装并验证
- sudo apt-get update
- sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- sudo docker run --rm hello-world
- 非 root 使用与开机自启
- sudo usermod -aG docker $USER
- sudo systemctl enable --now docker
- 如需在 CI 中远程部署,建议为目标机器配置 SSH 免密登录(将 CI 的公钥加入目标机 ~/.ssh/authorized_keys)。
三 方案一 GitHub Actions 云端构建与远程部署
- 在仓库创建 .github/workflows/deploy-docker.yml,示例要点:
- 触发分支:如 main
- 步骤:拉取代码 → 登录镜像仓库 → 构建并推送镜像(带 BUILD_NUMBER 或 git sha 标签)→ 通过 SSH 在 Debian 目标机执行部署脚本
- 示例工作流(精简版)
- name: Deploy Docker
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ secrets.DOCKERHUB_USERNAME }}/myapp:${{ github.sha }},${{ secrets.DOCKERHUB_USERNAME }}/myapp:latest
- name: Deploy to Debian server
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.PROD_HOST }}
username: ${{ secrets.PROD_USER }}
key: ${{ secrets.PROD_SSH_KEY }}
script: |
cd /opt/myapp
docker compose pull
docker compose up -d --force-recreate
- 要点
- 在仓库 Settings → Secrets 中配置 DOCKERHUB_USERNAME、DOCKERHUB_TOKEN、PROD_HOST、PROD_USER、PROD_SSH_KEY。
- 目标机建议预置 /opt/myapp/docker-compose.yml,由 CI 只负责 pull 与 up(减少在 CI 中传递敏感配置)。
四 方案二 Jenkins 在 Debian 上编排全流程
- 安装与权限
- 安装 Jenkins(Debian 示例)
- sudo apt-get update
- sudo apt-get install -y openjdk-11-jdk
- wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
- sudo sh -c ‘echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list’
- sudo apt-get update && sudo apt-get install -y jenkins
- sudo systemctl enable --now jenkins
- 授权 Jenkins 使用 Docker
- sudo usermod -aG docker jenkins
- sudo systemctl restart jenkins
- Pipeline 示例(Jenkinsfile)
- pipeline {
agent any
environment {
IMAGE = “yourname/myapp:${env.BUILD_NUMBER}”
REGISTRY = “https://registry.hub.docker.com”
CRED_REGISTRY = ‘dockerhub-cred-id’
REMOTE = “deploy@${{ secrets.PROD_HOST }}”
COMPOSE_FILE = “/opt/myapp/docker-compose.yml”
}
stages {
stage(‘Checkout’) { steps { git branch: ‘main’, url: ‘https://github.com/your/repo.git’ } }
stage(‘Build’) { steps { sh “docker build -t $IMAGE .” } }
stage(‘Push’) {
steps { script {
docker.withRegistry(REGISTRY, CRED_REGISTRY) { docker.image(IMAGE).push() }
docker.image(IMAGE).push(‘latest’)
} }
}
stage(‘Deploy’) {
steps { sshagent([‘ssh-cred-id’]) {
sh “”"
ssh $REMOTE ‘cd /opt/myapp && docker compose pull’
ssh $REMOTE ‘docker compose -f $COMPOSE_FILE up -d --force-recreate’
“”"
} }
}
}
}
- 要点
- 在 Manage Jenkins → Plugins 安装 Docker Pipeline、Pipeline、SSH Pipeline Steps。
- 在 Manage Jenkins → Credentials 添加 Docker Hub 与 SSH 私钥 凭据,并在 Pipeline 中引用对应 ID。
五 生产可用的最佳实践
- 镜像与标签
- 避免使用 latest 作为发布标签,使用 git sha 或 语义化版本;CI 同时打 latest 仅作便捷拉取。
- 部署策略
- 优先使用 Docker Compose 管理服务;在部署脚本中使用 pull + up -d --force-recreate 或 docker compose up -d --no-deps 做滚动更新;必要时增加 healthcheck 与回滚流程。
- 安全
- 禁止在镜像中硬编码 密钥/密码;通过 Secrets 注入或使用 Docker Secrets/外部配置中心;SSH 使用 密钥 且最小权限。
- 可观测性
- 容器设置 restart=unless-stopped;统一日志驱动(如 json-file 或对接 ELK/Fluentd);为关键路径添加 健康检查 与 超时。
- 回滚与演练
- 保留最近 N 个镜像标签;在 CI/CD 中提供 手动回滚 选项(如部署前记录当前 digest,回滚时指定该 digest 重新部署)。
- 多机与编排
- 多实例/多环境建议引入 Swarm/Kubernetes;若仅单机多服务,使用 Compose 的 profiles 与 depends_on 管理依赖与启动顺序。