核心是jenkins驱动“代码提交→构建镜像→推送镜像→启动/更新容器”全链路自动化,需通过dockerfile定义解耦镜像、dind或socket安全调用docker、凭证集中管理、幂等部署及错误中断机制保障可靠性。

要实现 Docker 容器的自动化部署流程,核心是把“代码提交 → 构建镜像 → 推送镜像 → 启动/更新容器”这一整条链路串起来,且无需人工干预。关键不在于单个命令怎么写,而在于各环节如何可靠衔接、权限如何安全配置、失败如何及时反馈。
让 Jenkins 成为自动部署的调度中心
Jenkins 是最常用也最成熟的 CI/CD 引擎,它能监听 Git 提交、拉取代码、执行构建脚本、调用 Docker 命令,并最终完成容器更新。部署不是靠手动敲 docker run,而是由 Jenkins 流水线(Pipeline)驱动整个过程。
Docker 镜像必须提前定义好,且与运行环境解耦
不能在 Jenkins 服务器上直接 npm install && npm run build 再复制文件——这会导致环境不一致。正确做法是:
- 在项目根目录写好
Dockerfile,明确指定 Node 版本、构建命令、静态资源路径、暴露端口等; - 利用多阶段构建(如
node:16-alpine AS builder+nginx:alpine),让最终镜像只含运行时所需内容,体积小、启动快、攻击面小; - 镜像标签建议用
git commit SHA或BUILD_NUMBER,避免覆盖,便于回滚。
Jenkins 必须具备调用 Docker 的能力,且权限隔离
Jenkins 容器默认无法执行 docker 命令。常见两种方案:
- 挂载宿主机的
/var/run/docker.sock:简单但有安全风险(容器可操作宿主机所有容器); - 使用 Docker-in-Docker(DinD):启动一个专用的
dockerd守护进程容器,Jenkins 通过 TCP 连接它,完全隔离,推荐用于生产环境; - 无论哪种,都要确保 Jenkins 用户属于
docker组,并验证docker info能正常返回。
部署动作要幂等,避免重复启停引发服务中断
直接 docker stop && docker run 会短暂中断服务。更稳妥的方式是:
- 用
docker-compose up -d --force-recreate --remove-orphans替代单容器命令,支持滚动更新; - 或采用 Nginx + 多版本容器 + 反向代理切换的方式(先启新容器,再切流量,最后删旧容器);
- 所有命令应加错误判断,比如
|| exit 1,确保某步失败时流水线终止,不继续误操作。
凭证和敏感信息必须集中管理,禁止硬编码
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- Git 拉取要用 SSH 私钥,私钥存 Jenkins 凭证库,公钥配到代码平台;
- 镜像仓库登录信息(如 Harbor、阿里云 ACR)也走 Jenkins Credential,Pipeline 中用
withCredentials注入; - 环境变量(如数据库地址、API Key)同样通过凭证或配置文件挂载方式注入,不写死在
Dockerfile或Jenkinsfile里。
不复杂但容易忽略。










