Docker自动化部署把开发、构建、发布串成一条可重复的流水线:代码合入后自动构建镜像、推送私有仓库、目标服务器拉取新镜像滚动更新。本文按完整链路拆解Docker自动化部署的关键环节,包含多阶段构建、镜像推送、Compose编排与健康检查回滚,全部配置可直接套用。
Docker自动化部署的整体链路
一条标准链路是:Git提交触发CI → 流水线多阶段构建镜像 → 推送私有镜像仓库 → 目标服务器Webhook通知 → 拉取新镜像滚动重启 → 健康检查 → 失败自动回滚。CI平台选GitLab CI或GitHub Actions均可,核心动作都是docker build与docker push。
多阶段构建压缩镜像体积
多阶段构建用多个FROM,编译阶段负责产出二进制与静态资源,运行阶段只拷贝产物和运行时依赖,镜像体积能从GB级压到百MB级,同时避免构建工具与密钥泄漏进运行镜像。
# Dockerfile:Go服务多阶段构建
FROM golang:1.24-alpine AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app/server ./cmd/server
FROM alpine:3.20
RUN apk add --no-cache ca-certificates tzdata
COPY --from=builder /app/server /usr/local/bin/server
EXPOSE 8080
ENTRYPOINT ["server"]
前端项目同理:node阶段执行构建,nginx阶段只拷贝dist目录。生产镜像里既没有源码也没有包管理器,攻击面大幅收窄。
镜像构建与私有仓库自动推送
私有仓库推荐Harbor,支持镜像扫描、不可变tag与多租户权限。流水线内用docker buildx构建多架构镜像,一次push同时覆盖amd64和arm64。
# 登录私有仓库
docker login registry.example.com -u ci-bot -p $REGISTRY_TOKEN
# 多架构构建并推送(GitLab CI / GitHub Actions中执行)
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t registry.example.com/app/web:v1.2.0 \
-t registry.example.com/app/web:latest \
--push .
# 目标服务器拉取并滚动替换
docker pull registry.example.com/app/web:v1.2.0
docker rm -f web
docker run -d --name web -p 8080:8080 \
--restart unless-stopped \
registry.example.com/app/web:v1.2.0
tag用版本号加commit短哈希,保证可回滚;latest只作入口,不要在生产依赖latest。
Compose编排多服务依赖
应用依赖数据库和缓存时用docker compose定义整组服务,通过depends_on加healthcheck控制启动顺序,数据库就绪后应用才启动。
# docker-compose.yml
services:
app:
image: registry.example.com/app/web:v1.2.0
ports:
- "8080:8080"
depends_on:
db:
condition: service_healthy
environment:
DB_DSN: postgres://app:pass@db:5432/app
restart: unless-stopped
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 10s
timeout: 5s
retries: 5
volumes:
pgdata:
发布后的健康检查与自动回滚
新容器启动后先探测健康接口,连续失败则自动回滚到上一个版本tag,避免故障扩散到线上用户。
#!/bin/bash
# deploy.sh:健康检查失败自动回滚
NEW_TAG="v1.2.0"
OLD_TAG="v1.1.9"
docker run -d --name web-new -p 8081:8080 \
registry.example.com/app/web:$NEW_TAG
sleep 30
if curl -sf http://127.0.0.1:8081/health > /dev/null; then
docker rm -f web && docker rename web-new web
echo "部署成功: $NEW_TAG"
else
docker rm -f web-new
docker run -d --name web -p 8080:8080 \
registry.example.com/app/web:$OLD_TAG
echo "健康检查失败,回滚: $OLD_TAG"
fi
单机Compose适合中小规模业务,多节点上线之后应切到Kubernetes,由Deployment的滚动更新策略接管版本切换与回滚。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/docker-zi-dong-hua-bu-shu-shi-zhan-duo-jie-duan-gou-jian-yu/