Docker自动化部署实战:多阶段构建与镜像自动推送方案

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/

(0)
小编小编
上一篇 9小时前
下一篇 9小时前

相关推荐