Docker 09 容器编排
一、什么是容器编排
就是针对容器生命周期的管理,对容器的生命周期进行更改快方便的方式进行管理。
二、为什么需要容器编排?
-
依赖管理 , 当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理
eg: java 项目依赖mysql、redis,所以需要先运行 mysql、redis,然后再运行java。 -
副本数控制 ,容器有时候也需要集群,那么运行集群的服务时,docker run ,自己写的话运行 10个节点就得写10遍docker run, 那么命令管理很不方便,不好控制。可以快速的对容器集群进行弹性伸缩。
-
配置共享 , 通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务。
让我们可以更见的的使用容器
三、Docker Compose(单机)
学完docker compse后基本上就不用再去记原来的docker那些命令了。只需要学会docker-compose.yml的配置怎么写即可。
compose官方doc介绍文档
https://docs.docker.com/compose/
compose命令集
https://docs.docker.com/reference/cli/docker/compose/
Docker Engine官方文档(包括最新版下载)
https://docs.docker.com/engine/
3.1 compose单词释义
[kəmˈpoʊz]
- v.组成;构成(一个整体);创作(音乐);作曲;撰写(信函、讲稿、诗歌等);使镇静;
例句
- Leo can compose and arrange music for the school band. (利奥可以为学校乐队作曲和编曲。)
基本释义: 指将多个部分组合成整体,或创作音乐、文字作品,也可表示使情绪镇静。
常见搭配: compose music(作曲)、compose a letter(写信)、be composed of(由…组成)。
用法示例:
- The committee is composed of five members.(委员会由五名成员组成)/
- She took a moment to compose herself before the speech.(她在演讲前花了一点时间让自己镇静下来)。
3.2 版本简述
3.2.1 docker-compose-plugin 与 docker-compose 的区别
网友总结:https://devpress.csdn.net/awstech/6a9183b93bda720d4b34cdb0.html
3.2.2 安装docker-ce的docker 和docker-compose版本
-
yum install -y docker-ce 中已经安装了docker-compose-plugin,是新版本的docker compose,参见阿里云docker-ce安装: https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.5eca1b11ZIidVl
-
老版本的docker-compose中间带横杠,在center-os中yun install -y docker-compose下载的是老版本的这个(但我们不需要这个老版本了)。
-
截止到2026-09-21, 腾讯云服务器 centos-7.9, 通过腾通云安装的docker-ce或阿里云安装的docker Engine的版本都是26.1.4。Docker Compose version v2.27.1
3.2.3 2025-09-21 最新Docker版本介绍
- 而百度搜索最新Docker版本给出的是:29.6.2(2026 年 7 月 16 日发布)。
3.2.3 2025-09-21 最新Docker compose 版本介绍
docker compose最新版本:5.5.1 : https://github.com/docker/compose/releases
3.2.4 Docker compose V5 版本介绍
Docker 在 2025 年底调整了版本命名策略,直接跳过了 v3 和 v4,从 v2 系列跨越到了 v5.0.0(内部代号 “Mont Blanc”),其主要目的是为了彻底区分“Compose 文件格式版本(如 v2/v3)”与“Compose CLI 工具版本”。
以下是关于 v5.0.1 的关键信息:
1. 主要变化与特性
版本跳跃:为了避免与旧的 version: ‘3’ 这种 YAML 文件格式混淆,官方决定将工具版本直接提升至 5.x。
性能提升:v5 引入了官方 Go SDK,允许开发者更方便地在其他 Go 应用中集成 Compose 功能。
构建引擎优化:内部构建逻辑进一步与 docker buildx 和 docker bake 深度集成,提供了更一致的构建体验。
更好的 UI:优化了进度条显示和终端输出体验。
2. 兼容性
文件格式:它完全兼容现有的 compose.yaml(即所谓的 Compose Specification)。你不再需要在 YAML 文件顶部写 version: ‘3.x’。
运行环境:它需要较新版本的 Docker Engine(建议 27.0 或更高版本)以获得最佳支持。
3.3 配置文件

服务 services
需要运行的容器配置,可以理解为原先用docker run命令后面跟的一系列配置信息,都配置在这个下面
网络 netwroks
docker compose 公共的自定义网络管理,配置好以后可以直接在services中去引用该网络配置。这个配置可以被多个service使用。
数据卷 volumes
在docker compose 下的统一数据卷管理,可以提供给多个service使用
将如下docker容器 启动命令转换成compose.yaml
docker run -d --restart=always --name nginx-demo-service --net xxx -v /www/wolfcode.cn:/usr/share/nginx/html -e APP_ENV=dev nginx
compose.yaml
version: "2.1"
services:
nginx-demo:
image: "nginx:latest"
# container_name: "nginx-compose"
restart: "always"
networks:
- wolfcode_net
volumes:
- /www/wolfcode.cn:/usr/share/nginx/html
environment:
APP_ENV: dev
dns:
- 114.114.115.115
ports:
- 80
networks:
wolfcode_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 188.18.0.0/16
gateway: 188.18.0.1
常用命令
构建服务
vim compose.yaml
# 保存上面的compose.yml内容
# docker compose config
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
name: compose-demo
services:
nginx-demo:
dns:
- 114.114.115.115
environment:
APP_ENV: dev
image: nginx:latest
networks:
wolfcode_net: null
ports:
- mode: ingress
target: 80
protocol: tcp
restart: always
volumes:
- type: bind
source: /www/wolfcode.cn
target: /usr/share/nginx/html
bind:
create_host_path: true
networks:
wolfcode_net:
name: compose-demo_wolfcode_net
driver: bridge
ipam:
driver: default
config:
- subnet: 172.21.0.0/16
gateway: 172.21.0.1
# 有上面这大段输出,证明配置OK,没问题
# 创建nginx-demo服务
# docker compose create nginx-demo
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
[+] Creating 2/0
✔ Network compose-demo_wolfcode_net Created 0.0s
✔ Container nginx-compose Created 0.0s
# 但是检查发现此时服务没有启动
# docker compose ps
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
# 但是 -a 能看到
# docker compose ps -a
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
nginx-compose nginx:latest "/docker-entrypoint.…" nginx-demo 23 seconds ago Created
# 启动服务 不带具体名字就是启动所有的service
# docker compose up -d
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
[+] Running 1/1
✔ Container nginx-compose Started 0.1s
# 这回就可以查到了
# docker compose ps
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
nginx-compose nginx:latest "/docker-entrypoint.…" nginx-demo About a minute ago Up 12 seconds 80/tcp
# 修改配置文件后,直接运行下面这命令即可重启
# docker compose up -d
# 启动3个节点
# docker compose scale nginx-demo=3
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
WARNING: The "nginx-demo" service is using the custom container name "nginx-compose". Docker requires each container to have a unique name. Remove the custom name to scale the service.
# 将配置文件中的container_name: "nginx-compose" 注释掉
# 再次运行扩容命令
# docker compose scale nginx-demo=3
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
[+] Running 4/4
✔ Container compose-demo-nginx-demo-3 Started 0.3s
✔ Container nginx-compose Recreated 0.2s
✔ Container compose-demo-nginx-demo-2 Started 0.6s
✔ Container compose-demo-nginx-demo-1 Started 0.2s
# 检查运行中的容器
# docker compose ps
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
compose-demo-nginx-demo-1 nginx:latest "/docker-entrypoint.…" nginx-demo 16 seconds ago Up 15 seconds 0.0.0.0:32769->80/tcp, :::32769->80/tcp
compose-demo-nginx-demo-2 nginx:latest "/docker-entrypoint.…" nginx-demo 16 seconds ago Up 14 seconds 0.0.0.0:32770->80/tcp, :::32770->80/tcp
compose-demo-nginx-demo-3 nginx:latest "/docker-entrypoint.…" nginx-demo 16 seconds ago Up 15 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp
#扩容到5个节点
# docker compose scale nginx-demo=5
# 缩容到3个节点
# docker compose scale nginx-demo=3
#缩容到1个节点
# docker compose scale nginx-demo=1
[root@VM-0-16-centos compose-demo]# docker compose scale nginx-demo=5
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
[+] Running 5/5
✔ Container compose-demo-nginx-demo-1 Running 0.0s
✔ Container compose-demo-nginx-demo-2 Running 0.0s
✔ Container compose-demo-nginx-demo-3 Running 0.0s
✔ Container compose-demo-nginx-demo-5 Started 0.3s
✔ Container compose-demo-nginx-demo-4 Started 0.2s
[root@VM-0-16-centos compose-demo]# docker compose ps
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
compose-demo-nginx-demo-1 nginx:latest "/docker-entrypoint.…" nginx-demo 15 minutes ago Up 15 minutes 0.0.0.0:32769->80/tcp, :::32769->80/tcp
compose-demo-nginx-demo-2 nginx:latest "/docker-entrypoint.…" nginx-demo 15 minutes ago Up 15 minutes 0.0.0.0:32770->80/tcp, :::32770->80/tcp
compose-demo-nginx-demo-3 nginx:latest "/docker-entrypoint.…" nginx-demo 15 minutes ago Up 15 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp
compose-demo-nginx-demo-4 nginx:latest "/docker-entrypoint.…" nginx-demo 16 seconds ago Up 15 seconds 0.0.0.0:32771->80/tcp, :::32771->80/tcp
compose-demo-nginx-demo-5 nginx:latest "/docker-entrypoint.…" nginx-demo 16 seconds ago Up 15 seconds 0.0.0.0:32772->80/tcp, :::32772->80/tcp
[root@VM-0-16-centos compose-demo]#
[root@VM-0-16-centos compose-demo]#
[root@VM-0-16-centos compose-demo]# docker compose scale nginx-demo=3
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
[+] Running 5/5
✔ Container compose-demo-nginx-demo-1 Running 0.0s
✔ Container compose-demo-nginx-demo-2 Running 0.0s
✔ Container compose-demo-nginx-demo-3 Running 0.0s
✔ Container compose-demo-nginx-demo-5 Removed 0.2s
✔ Container compose-demo-nginx-demo-4 Removed 0.2s
[root@VM-0-16-centos compose-demo]# docker compose ps
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
compose-demo-nginx-demo-1 nginx:latest "/docker-entrypoint.…" nginx-demo 15 minutes ago Up 15 minutes 0.0.0.0:32769->80/tcp, :::32769->80/tcp
compose-demo-nginx-demo-2 nginx:latest "/docker-entrypoint.…" nginx-demo 15 minutes ago Up 15 minutes 0.0.0.0:32770->80/tcp, :::32770->80/tcp
compose-demo-nginx-demo-3 nginx:latest "/docker-entrypoint.…" nginx-demo 15 minutes ago Up 15 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp
[root@VM-0-16-centos compose-demo]#
[root@VM-0-16-centos compose-demo]#
[root@VM-0-16-centos compose-demo]# docker compose scale nginx-demo=1
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
[+] Running 3/3
✔ Container compose-demo-nginx-demo-1 Running 0.0s
✔ Container compose-demo-nginx-demo-3 Removed 0.2s
✔ Container compose-demo-nginx-demo-2 Removed 0.2s
[root@VM-0-16-centos compose-demo]# docker compose ps
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
compose-demo-nginx-demo-1 nginx:latest "/docker-entrypoint.…" nginx-demo 15 minutes ago Up 15 minutes 0.0.0.0:32769->80/tcp, :::32769->80/tcp
创建服务
拉取镜像
容器的运行/启动/停止
查看管理的容器列表
查看日志
docker compose logs 查询所有服务的日志
docker compose logs -f nginx-demo 只看nginx-demo服务的log
四、Swarm ([swɔːm]集群)
单词释义
- n.一大群(蜜蜂等昆虫);一大批(向同方向移动的人);
- vi.成群地来回移动;成群地飞来飞去;
实用例句:
- A swarm of bees flew out of the hive.(一大群蜜蜂从蜂巢飞了出来。)。
- A swarm of people encircled the hotel.(一大群人包围了这家酒店。)。
- Tourists swarm the little beachside town during the summer.(夏季游客纷纷涌向这个海滨小镇。)。
- The capital city is now swarming with police.(首都现在到处是警察。)。
官方文档
https://docs.docker.com/engine/swarm/
swarm 概述
集群的管理和编排是使用嵌入docker 引擎的SwacmKit, 可以在docker初始化时启动swarm模式或者加入已存在的swarm
swarm集群节点的管理命令:
docker swarm --help
- 初始化集群节点
- 加入节点
- 退出节点
Node
-
运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点(Node)。
-
节点分为管理(Manager)节点和工作(Worker)节点。
-
管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。一个Swarm集群可以有多个管理节点,但只有一个管理节点可以成为领导者,领导者通过Raft协议实现。通常,第一个启用Docker Swarm的节点将成为领导者,后来加入的都是跟随者。当前的领导者如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
-
工作节点是任务执行节点,管理节点将服务(service)下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。
来自Docker官网的这张图片形象的展示了集群中管理节点与工作节点的关系。


Task
任务(Task)是Swarm中的最小调度单位,目前来说就是一个单一的容器。
Service
服务 (Services)是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services: 按照一定规则在各个工作节点上运行指定个数的任务。
global services: 每个工作节点上运行一个任务
两种模式通过docker service create 的--mode参数指定。


初始化集群
登录管理节点,并执行如下命令
docker swarm init --advertise-addr.192.168.113.120
使用 docker info可以查看 swarm集群状态
docker node ls可以查看集群节点信息
查看集群
进入主节点,输入命令: dockernodes
[root@VM-0-16-centos ~]# docker swarm
Usage: docker swarm COMMAND
Manage Swarm
Commands:
init Initialize a swarm
join Join a swarm as a node and/or manager
Run 'docker swarm COMMAND --help' for more information on a command.
[root@VM-0-16-centos ~]# docker swarm init --help
Usage: docker swarm init [OPTIONS]
Initialize a swarm
Options:
--advertise-addr string Advertised address (format: "<ip|interface>[:port]")
--autolock Enable manager autolocking (requiring an unlock key to start a stopped manager)
--availability string Availability of the node ("active", "pause", "drain") (default "active")
--cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic (format: "<ip|interface>")
--data-path-port uint32 Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca Specifications of one or more certificate signing endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: "<ip|interface>[:port]") (default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots (default 10000)
--task-history-limit int Task history retention limit (default 5)
[root@VM-0-16-centos ~]# docker swarm init --advertise-addr 172.21.0.16
Swarm initialized: current node (q1g9l0olsahysfioopn48s89d) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4o8h033w8o3zfx751gault30y903pqk6f4118m5nkng3lmupi4-62kxpn21wt36scemyw2ls8a29 172.21.0.16:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
登录另一台服务器
# ping 一下swarm manager节点是否能通
ping 172.21.0.16
#执行上面的加入swarm集群命令
docker swarm join --token SWMTKN-1-4o8h033w8o3zfx751gault30y903pqk6f4118m5nkng3lmupi4-62kxpn21wt36scemyw2ls8a29 172.21.0.16:2377
This node joined a swarm as a worker.
# 如果添加不成功,可能是Manager主机的防火墙拦截了,检查防火墙状态
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
# 禁用防火墙
systemctl diaable firewalld
# manager主机查看docker 集群节点
[root@VM-0-16-centos ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
9cgom19ugv8ctzcfkumsttch7 VM-0-9-centos Ready Active 26.1.4
q1g9l0olsahysfioopn48s89d * VM-0-16-centos Ready Active Leader 26.1.4
删除之前的compose 启动的服务
[root@VM-0-16-centos ~]# docker compose ls
NAME STATUS CONFIG FILES
compose-demo running(1) /opt/docker/compose-demo/compose.yaml
harbor running(9) /opt/docker/harbor/docker-compose.yml
[root@VM-0-16-centos ~]# docker compose stop nginx-demo
no configuration file provided: not found
[root@VM-0-16-centos ~]# cd /opt/docker/compose-demo/
[root@VM-0-16-centos compose-demo]# ll
总用量 4
-rw-r--r-- 1 root root 465 9月 21 15:33 compose.yaml
[root@VM-0-16-centos compose-demo]# docker compose stop nginx-demo
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
[+] Stopping 1/1
✔ Container compose-demo-nginx-demo-1 Stopped 0.1s
[root@VM-0-16-centos compose-demo]# docker compose rm nginx-demo
WARN[0000] /opt/docker/compose-demo/compose.yaml: `version` is obsolete
? Going to remove compose-demo-nginx-demo-1 Yes
[+] Removing 1/0
✔ Container compose-demo-nginx-demo-1 Removed 0.0s
[root@VM-0-16-centos compose-demo]#
部署服务
查看服务操作命令:
docker service --help
新建服务
docker service create --replicas 2 -p 80:80 --name nginx_swarm nginx
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
svq79iueq2ss nginx_swarm replicated 2/2 nginx:latest *:8765->80/tcp
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5640e808b850 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp nginx_swarm.1.0kkfz9rrxg0j3cjeglf0yo96t
04f4e032e4a4 nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp nginx_swarm.2.q5mq1fj846ceyfz9c18exnrjt
2个replicate都在manager node里了,去 join来的docker主机去docker ps ,没有服务
会查看到一个服务
健康集群状态
查看服务信息:
docker service inspect --pretty <service id | container_name>
--pretty参数可以简化输出内容
docker service ps
进入工作节点通过docker ps可以查看容器运行状态
弹性伸缩
调整实例个数
更新服务的实例个数
docker service update --replicas <num> <service id/name>
调整集群大小
添加新的Docker 节点,执行docker swarm join命令可以加入集群
执行docker swarm leave 可以退出集群,也可以带上--force参数强制退出集群
# 管理节点执行查看所有node节点
[root@VM-0-16-centos compose-demo]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
9cgom19ugv8ctzcfkumsttch7 VM-0-9-centos Ready Active 26.1.4
q1g9l0olsahysfioopn48s89d * VM-0-16-centos Ready Active Leader 26.1.4
# 子节点退出
[root@VM-0-9-centos ~]# docker swarm leave
Node left the swarm.
# 此时查询服务依然存在,不会因为leave而停掉呢
[root@VM-0-9-centos ~]# docker ps
# 主节点查看node, 节点还在,状态变成了Down
[root@VM-0-16-centos compose-demo]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
9cgom19ugv8ctzcfkumsttch7 VM-0-9-centos Down Active 26.1.4
q1g9l0olsahysfioopn48s89d * VM-0-16-centos Ready Active Leader 26.1.4
[root@VM-0-16-centos compose-demo]# docker node --help
docker node rm ID
五、portainer(以管理界面的方式操作docker)
docker search portainer搜索 portainer,选择自己需要的版本进
基于docker运行
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
基于swarm运行
docker service create -p 9000:9000 --replicas 1 --mounttype=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock --mount type=volume,src=portainer_data,dst=/data

浙公网安备 33010602011771号