在 Debian 上用 Docker 简化应用部署的实操方案
一 标准化环境与一键部署
- 安装 Docker 与 Docker Compose(推荐插件方式)
- 更新索引并安装依赖:sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gnupg software-properties-common
- 添加官方 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 > /devref
- 安装并验证:sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 非 root 使用与开机自启:sudo usermod -aG docker $USER && sudo systemctl enable --now docker
- 目标机准备
- 建议预置应用目录(如 /opt/myapp)与 docker-compose.yml,CI 只负责 pull 与 up,减少在 CI 中传递敏感配置
- 如需在 CI 中远程部署,为目标机配置 SSH 免密登录(将 CI 的公钥加入目标机 ~/.ssh/authorized_keys)
二 极简应用模板与 Compose 编排
- 单容器示例 Dockerfile(基于 Debian 的 Nginx)
- FROM debian:bookworm-slim
- RUN apt-get update && apt-get install -y --no-install-recommends nginx && rm -rf /var/lib/apt/lists/*
- EXPOSE 80
- CMD [“nginx”, “-g”, “daemon off;”]
- 构建与运行
- 构建:docker build -t my-debian-nginx .
- 运行:docker run -d -p 8080:80 --name my-nginx my-debian-nginx
- 多容器示例 docker-compose.yml(Flask + PostgreSQL)
- version: ‘3.8’
- services:
- web:
- build: .
- ports: [“5000:5000”]
- depends_on: [db]
- environment: [“DATABASE_URL=postgresql://user:password@db:5432/mydb”]
- db:
- image: postgres:15-alpine
- environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
- volumes: [“postgres_data:/var/lib/postgresql/data”]
- volumes:
- 部署与更新
- 启动:docker compose up -d
- 更新:在 CI 或目标机执行 docker compose pull && docker compose up -d --force-recreate
三 CI/CD 自动化部署
- GitHub Actions 云端构建与远程部署
- 触发分支:如 main
- 关键步骤:拉取代码 → 登录镜像仓库(DOCKERHUB_USERNAME / DOCKERHUB_TOKEN)→ 构建并推送镜像(带 git sha 与 latest 标签)→ 通过 SSH 在 Debian 目标机执行部署脚本
- 示例工作流要点(精简版)
- name: Deploy Docker
- on: push: branches: [ main ]
- jobs:
- build-and-deploy:
- runs-on: ubuntu-latest
- steps:
- uses: actions/checkout@v4
- uses: docker/login-action@v3(登录 Docker Hub)
- uses: docker/build-push-action@v5(推送 ${{ secrets.DOCKERHUB_USERNAME }}/myapp:${{ github.sha }} 与 latest)
- uses: appleboy/ssh-action@v1(在目标机执行:cd /opt/myapp && docker compose pull && docker compose up -d --force-recreate)
- 仓库 Secrets:DOCKERHUB_USERNAME、DOCKERHUB_TOKEN、PROD_HOST、PROD_USER、PROD_SSH_KEY
- Jenkins 在 Debian 上编排全流程
- 安装与权限:sudo apt-get install -y openjdk-11-jdk;按官方源安装 Jenkins;sudo usermod -aG docker jenkins;sudo systemctl enable --now jenkins
- Pipeline 要点:Checkout → Build(docker build -t $IMAGE) → Push(使用 withRegistry 推送 BUILD_NUMBER 与 latest) → Deploy(SSH 执行:cd /opt/myapp && docker compose pull && docker compose up -d --force-recreate)
四 生产可用的最佳实践
- 镜像与标签
- 避免使用 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 管理依赖与启动顺序