目录
容器编排是什么?
容器编排是让多容器应用像一个整体一样被部署、扩缩、更新和监控的技术集合,包括生命周期管理、资源调度、网络互联、配置与密钥分发等功能。主流方案有:
- 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。 |
| BuildKit | DOCKER_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
| 维度 | Compose | Swarm | Kubernetes |
|---|---|---|---|
| 复杂度 | ★ | ★★ | ★★★★ |
| 学习资料 | 多 | 少 | 海量 |
| 横向扩缩 | 本机 scale | replicas,自动负载 | Deployment 自动 |
| 高可用 | 依赖主机本身 | Raft 多管理节点 | etcd + 控制面 |
| 生态插件 | 限 | 中 | 丰富(Ingress、Operators) |
| 典型场景 | 本地、CI、单机服务 | 中小规模生产 | 大规模云原生 |
CI/CD、监控与故障排查
-
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确保灰度升级。
-
-
监控与日志
cadvisor + Prometheus + Grafana抓主机及容器指标- 集群层面:
docker node ls、docker service ps→ 与 Alertmanager 联动 - 日志:推荐 Loki / Elasticsearch 收集
json-file流,或直接输出到stdout。
-
常见排错套路
| 问题 | 步骤 |
|---|---|
| 拉取镜像超慢 | --registry-mirror 配置国内加速;用私有 Harbor + proxy cache。 |
| 容器重启循环 | docker compose logs -f service + healthcheck 日志;看 Restarting (1) 原因。 |
| Swarm 服务 Pending | docker service ps 查看 REJECTED 原因;多为端口/资源/调度约束冲突。 |
| 卷数据丢失 | 检查 bind vs volume,确认 ro/rw 权限以及 SELinux/AppArmor。 |
参考:
6万+

被折叠的 条评论
为什么被折叠?



