Docker 容器编排全指南:从 Compose 到 Swarm,一文吃透实践与原理


容器编排是什么?

容器编排是让多容器应用像一个整体一样被部署、扩缩、更新和监控的技术集合,包括生命周期管理、资源调度、网络互联、配置与密钥分发等功能。主流方案有:

  • Docker Compose:更轻量,面向单机或开发测试环境
  • Docker Swarm:Docker 原生集群,学习曲线低
  • Kubernetes:功能最全、生态最广,但复杂度最高

单节点编排:Docker Compose

1 | 安装与版本

# 二进制安装(v2 插件模式)
wget -O docker-compose https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64
sudo mv docker-compose /usr/local/bin/ && sudo chmod +x /usr/local/bin/docker-compose
docker compose version

> ⚠️ v2 已集成为 docker compose 子命令,旧版 docker-compose 可并存,但官方建议迁移。

2 | Compose 文件语法全解析

关键块作用高级要点
services定义容器depends_on, healthcheck, deploy.*
volumes数据持久化driver_opts, labels
networks虚拟网络ipv4_address, attachable
configs / secrets分发只读配置 & 机密Swarm 专用,Compose 本地通过挂载模拟
profiles场景化启停用于本地调试与 CI 区分

版本选择version: "3.9" 兼顾向前兼容与 Swarm 支持;若仅本地开发可用 "2.4" 保留 container_name 等特性。

3 | 常用命令与全局 flags

  • 常用命令(节选)up, down, build, logs, exec, ps, cp

  • 全局 flags

    • --ansi 控制彩色输出
    • --env-file 加载额外环境文件
    • -f/--file 指定配置文件
    • --profile 按需启用配置分组
    • --parallel 并发度(镜像多阶段构建加速)

> 技巧:在 CI 中用 docker compose config 先做语法校验;用 docker compose convert 观察生成的低阶 JSON,利于故障排查。

4 | 实战:三服务微服务栈

version: "3.9"
services:
  web:
    image: nginx:1.25-alpine
    ports: [ "80:80" ]
    volumes: [ "./html:/usr/share/nginx/html:ro" ]
    depends_on: [ api ]
    deploy:
      resources:
        limits: { cpus: "0.5", memory: 256M }

  api:
    build: ./api
    environment:
      - DB_URL=mysql://root:${MYSQL_ROOT_PASSWORD}@db/demo
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
    deploy:
      replicas: 2
      update_config: { order: start-first }

  db:
    image: mysql:8.4
    volumes: [ "db-data:/var/lib/mysql" ]
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    command: --default-authentication-plugin=mysql_native_password

volumes:
  db-data:

亮点解读

  • 使用 .env 管理 MYSQL_ROOT_PASSWORD
  • deploy.replicas 让本地也能模拟多实例
  • update_config 配合蓝绿 / 灰度发布
  • 数据目录持久化到命名卷 db-data

5 | 生产硬核技巧

场景建议
日志整合logging.driver: "json-file" 改为 local,或挂到 Fluent Bit。
BuildKitDOCKER_BUILDKIT=1 + build.cache-from 做增量缓存,加速 CI。
故障调试docker compose run --rm service sh 进入干净容器;exec 用于已运行实例。
资源隔离deploy.resources.limits/reservations,防止单服务“吃爆”主机。
安全最小权限镜像(distroless / alpine),并及时 docker scan

多节点编排:Docker Swarm

1 | 核心架构

角色说明
Manager维护 Raft 状态、调度任务,推荐奇数节点构成高可用。
Worker只负责运行任务,默认无调度权。
Task具体的容器实例,隶属于 Service
Service声明式期望状态:镜像、环境、副本数、约束等。
Overlay Network跨主机虚拟网,服务自动获得 VIP+DNS。

2 | Swarm 操作命令大全

维度关键命令(节选)
集群docker swarm init, join, join-token, leave, unlock, update
节点docker node ls/inspect/update, promote/demote, ps, rm
服务docker service create/update/scale/rollback/logs
docker stack deploy/ps/rm,支持直接使用 Compose 文件

> TIPS:在 Swarm 里执行 docker stack deploy -c docker-compose.yml mystack,Compose 文件会自动转为 Swarm service,不需要任何改动。

3 | 高可用与滚动更新

  • Raft 日志复制:最多允许 floor(N/2) 节点故障仍可写入。
  • 服务更新策略
docker service update \
  --image api:2.0 \
  --update-parallelism 2 \
  --update-delay 10s \
  mystack_api
  • 回滚docker service rollback mystack_api
  • 节点维护docker node update --availability drain worker-1 把任务迁走后再升级内核。

4 | 实战:从 Compose 迁移到 Swarm

# 1. 初始化集群
docker swarm init --advertise-addr 192.168.31.10

# 2. 把之前的 compose 文件直接部署
docker stack deploy -c docker-compose.yml mystack

# 3. 查看全局状态
docker stack ps mystack
docker service ls
docker node ls

> 对比 K8s,需要写 Deployment/Service/YAML;Swarm 几乎零学习成本即可上线。


Compose vs Swarm vs K8s

维度ComposeSwarmKubernetes
复杂度★★★★★★
学习资料海量
横向扩缩本机 scalereplicas,自动负载Deployment 自动
高可用依赖主机本身Raft 多管理节点etcd + 控制面
生态插件丰富(Ingress、Operators)
典型场景本地、CI、单机服务中小规模生产大规模云原生

CI/CD、监控与故障排查

  1. CI/CD

    • GitLab Runner 内置 Docker 执行器,services: 字段可直接拉起数据库做集成测试。

    • 部署阶段:

      script:
        - docker compose pull
        - docker compose up -d --remove-orphans
      
    • 对 Swarm :docker stack deploy -c docker-compose.yml --prune mystack 确保灰度升级。

  2. 监控与日志

    • cadvisor + Prometheus + Grafana 抓主机及容器指标
    • 集群层面:docker node lsdocker service ps → 与 Alertmanager 联动
    • 日志:推荐 Loki / Elasticsearch 收集 json-file 流,或直接输出到 stdout
  3. 常见排错套路

问题步骤
拉取镜像超慢--registry-mirror 配置国内加速;用私有 Harbor + proxy cache。
容器重启循环docker compose logs -f service + healthcheck 日志;看 Restarting (1) 原因。
Swarm 服务 Pendingdocker service ps 查看 REJECTED 原因;多为端口/资源/调度约束冲突。
卷数据丢失检查 bind vs volume,确认 ro/rw 权限以及 SELinux/AppArmor。

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值