Docker-Docker Swarm
1.1 购买服务器
购买3台服务器,所有主机都安装docker
和docker-compose
1.2 Swarm集群产生
compose、machine 和 swarm 是docker 原生提供的三大编排工具。简称docker三剑客。
1、服务器硬件要求
硬件资源 | 最小配置 | 推荐配置 |
---|---|---|
CPU | 1 CPU | 2CPU |
内存 | 1GB | 2~4GB |
硬盘 | 20 GB | 40GB |
2、节点信息
主机名 | IP地址 | 具体说明 |
---|---|---|
docker01 | 8.134.122.252 | swarm-manager节点 |
docker02 | 8.134.114.8 | swarm-work01节点 |
docker03 | 8.134.123.77 | swarm-work02节点 |
3、当前服务器应用状态
4、容器化部署存在问题
- 怎么保证数据完整性,怎么去管很多微服容器,怎么去更新容器而不影响客户的业务?
- 如果容器down掉了。怎么自动恢复?
=》解决以上问题,docker-swarm横空出世!!!。==
1.3 安装docker-swarm
1、基本概述
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,可以将组成某个应该的多个docker容器编排在一起,同时管理。而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口(docker stack)统一管理这些Docker主机上的各种Docker资源。
stack 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每个服务。stack file 是一种 yaml 格式的文件,类似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。
2、官方文档:https://docs.docker.com/engine/swarm/
3、Docker Swarm由两部分组成
- Docker集群:将一个或多个Docker节点组织起来,用户就能以集群的方式进行管理。
- 应用编排:有一套API用来部署和管理容器。
1.4 管理节点
1、初始化第一个管理节点
advertise-addr和listen-addr这两个参数注解:
- 前者用来指定其他节点连接m0时的地址。
- 后者指定承载swarm流量的IP和端口。
- 创建管理节点,会在本地新建docker网络。
2、manager节点说明
MANAGER STATUS列:
- Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
- Reachable 意味着节点是管理者节点正在参与Raft共识。如果管理节点不可用,则该节点有资格被选为新的管理节点。
- Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
AVAILABILITY列:
- Active 意味着调度程序可以将任务分配给节点。
- Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
- Drain 意味着调度程序不会向节点分配新任务,调度程序关闭所有现有任务并在可用节点上调度它们。
docker01服务器
注意:IP地址选择的是阿里云服务器的私服!!!
[root@guardwhy01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
44443742f9b7 bridge bridge local
5f09756231c5 host host local
9d85ae8a4d3d none null local
[root@guardwhy01 ~]# docker swarm init --advertise-addr 172.21.251.249:2377 --listen-addr 172.21.251.249:2377
Swarm initialized: current node (ujswj6ys93qhtji45oxszv4zr) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2js986t4enexu18fpn5dnticbmx0df9qni5nsfsn6ngykl931s-1tattfxbp5ahqz7wk1ha7ycfh 172.21.251.249:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@guardwhy01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
44443742f9b7 bridge bridge local
c372c3473958 docker_gwbridge bridge local
5f09756231c5 host host local
jh4ohdal24uo ingress overlay swarm
9d85ae8a4d3d none null local
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Leader 20.10.7
[root@guardwhy01 ~]#
3、加入新的节点
Docker Swarm的新节点加入是从管理节点(docker01服务器
)获取一长串命令,称为join token
,任何加入集群只要执行join token
即可加入Swarm集群。
docker02服务器
[root@guardwhy02 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
475d6f0e7633 bridge bridge local
4212954a0f4f host host local
7fb6fab37bee none null local
[root@guardwhy02 ~]# docker swarm join --token SWMTKN-1-2js986t4enexu18fpn5dnticbmx0df9qni5nsfsn6ngykl931s-1tattfxbp5ahqz7wk1ha7ycfh 172.21.251.249:2377
This node joined a swarm as a worker.
[root@guardwhy02 ~]#
如果有新的work节点需要加入,在m0执行命令docker swarm join-token worker
即可得到管理work节点的join token
。
docker01服务器
[root@guardwhy01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2js986t4enexu18fpn5dnticbmx0df9qni5nsfsn6ngykl931s-1tattfxbp5ahqz7wk1ha7ycfh 172.21.251.249:2377
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Leader 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active 20.10.7
[root@guardwhy01 ~]#
如果有新的管理节点需要加入,在m0执行命令docker swarm join-token manager
即可得到管理manager节点的join token
。
docker01服务器
[root@guardwhy01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2js986t4enexu18fpn5dnticbmx0df9qni5nsfsn6ngykl931s-aw4p1x4xwul0iw1ma2aid49cg 172.21.251.249:2377
[root@guardwhy01 ~]#
docker03服务器
[root@guardwhy03 ~]# docker swarm join --token SWMTKN-1-2js986t4enexu18fpn5dnticbmx0df9qni5nsfsn6ngykl931s-aw4p1x4xwul0iw1ma2aid49cg 172.21.251.249:2377
This node joined a swarm as a manager.
[root@guardwhy03 ~]#
在manager查看所有节点。
docker01服务器
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Leader 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active 20.10.7
25wan9kvxtew5m48hvkng8jr5 guardwhy03 Ready Active Reachable 20.10.7
[root@guardwhy01 ~]#
1.5 节点相关操作
1、验证节点
master节点
[root@guardwhy01 ~]# docker info
work节点
[root@guardwhy02 ~]# docker info
2、节点权限提升/降低
将manager
节点降低为worker
节点,在manager
节点执行如下命令
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Reachable 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active 20.10.7
25wan9kvxtew5m48hvkng8jr5 guardwhy03 Ready Active Leader 20.10.7
[root@guardwhy01 ~]# docker node demote guardwhy03
Manager guardwhy03 demoted in the swarm.
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Leader 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active 20.10.7
25wan9kvxtew5m48hvkng8jr5 guardwhy03 Unknown Active 20.10.7
[root@guardwhy01 ~]#
将worker节点提升为manager节点,在manager节点执行如下命令
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Leader 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active 20.10.7
25wan9kvxtew5m48hvkng8jr5 guardwhy03 Ready Active 20.10.7
[root@guardwhy01 ~]# docker node promote guardwhy02
Node guardwhy02 promoted to a manager in the swarm.
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Leader 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active Reachable 20.10.7
25wan9kvxtew5m48hvkng8jr5 guardwhy03 Ready Active 20.10.7
[root@guardwhy01 ~]#
3、节点脱离集群
docker03服务器
在docker03
服务器中,使用以下命令
[root@guardwhy03 ~]# docker swarm leave
Node left the swarm.
[root@guardwhy03 ~]#
docker01服务器
在docker01
服务器中,使用以下命令
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Reachable 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active Leader 20.10.7
25wan9kvxtew5m48hvkng8jr5 guardwhy03 Down Active 20.10.7
[root@guardwhy01 ~]#
4、删除脱离集群的节点
删除节点命令: docker node rm 节点名称|节点ID
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Reachable 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active Leader 20.10.7
25wan9kvxtew5m48hvkng8jr5 guardwhy03 Down Active 20.10.7
[root@guardwhy01 ~]# docker node rm guardwhy03
guardwhy03
[root@guardwhy01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Reachable 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active Leader 20.10.7
[root@guardwhy01 ~]#
在manager
中重新添加worker
节点
[root@guardwhy01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2js986t4enexu18fpn5dnticbmx0df9qni5nsfsn6ngykl931s-1tattfxbp5ahqz7wk1ha7ycfh 172.21.251.249:2377
[root@guardwhy01 ~]#
[root@guardwhy03 ~]# docker swarm join --token SWMTKN-1-2js986t4enexu18fpn5dnticbmx0df9qni5nsfsn6ngykl931s-1tattfxbp5ahqz7wk1ha7ycfh 172.21.251.249:2377
This node joined a swarm as a worker.
[root@guardwhy03 ~]#
添加成功!!!
5、安装图形界面
docker官方地址: https://hub.docker.com/r/dockersamples/visualizer
拉取基础镜像
注意:要在manager
服务器创建容器!!!
docker pull dockersamples/visualizer:latest
运行图形界面镜像
docker run -itd --name visualizer -p 8091:8080 \
-e HOST=8.134.122.252 \
-e PORT=8080 \
-v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer:latest
查看运行结果
打开浏览器,点击链接: http://8.134.122.252:8091/
6、Swarm命令小结
常用命令 | 具体作用 |
---|---|
docker swarm init | 初始化一个 swarm 群集 |
docker swarm join | 加入群集作为节点或管理器 |
docker swarm join-token | 管理用于加入群集的令牌 |
docker swarm leave | 离开 swarm 群集 |
docker swarm unlock | 解锁 swarm 群集 |
docker swarm unlock-key | 管理解锁钥匙 |
docker swarm update | 更新 swarm 群集 |
7、node命令小结
常用命令 | 具体作用 |
---|---|
docker node demote | 从 swarm 群集管理器中降级一个或多个节点 |
docker node inspect | 显示一个或多个节点的详细信息 |
docker node ls | 列出 swarm 群集中的节点 |
docker node promote | 将一个或多个节点推入到群集管理器中 |
docker node ps | 列出在一个或多个节点上运行的任务,默认为当前节点。 |
docker node rm | 从 swarm 群集删除一个或多个节点 |
docker node update | 更新一个节点 |
1.6 Docker service
1、docker service命令小结
常用命令 | 具体作用 |
---|---|
docker service create | 创建服务 |
docker service inspect | 显示一个或多个服务的详细信息 |
docker service logs | 获取服务的日志 |
docker service ls | 列出服务 |
docker service rm | 删除一个或多个服务 |
docker service scale | 设置服务的实例数量 |
docker service update | 更新服务 |
docker service rollback | 恢复服务至update之前的配置 |
2、需求实现
2、集群所有的节点都下载nginx
基础镜像
docker pull nginx:1.18.0-alpine
docker pull nginx:1.19.3-alpine
3、在docker01服务器(manager节点
)中创建overlay
网络。
[root@guardwhy01 data]# docker network ls
NETWORK ID NAME DRIVER SCOPE
0eb90cd90de7 bridge bridge local
c372c3473958 docker_gwbridge bridge local
5f09756231c5 host host local
jh4ohdal24uo ingress overlay swarm
9d85ae8a4d3d none null local
[root@guardwhy01 data]# docker network create -d overlay nginx-net
yoyo8isxn654fmkeygfsi3nlw
[root@guardwhy01 data]#
4、创建5个nginx
容器的集群
[root@guardwhy01 data]# docker service create --name nginx --network nginx-net -p 80:80 --replicas 5 nginx:1.18.0-alpine
u0etuzildau4h931nybmjbgtx
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
[root@guardwhy01 data]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ujswj6ys93qhtji45oxszv4zr * guardwhy01 Ready Active Leader 20.10.7
sq9x6zrg7u2izo4tzmrffbyz1 guardwhy02 Ready Active 20.10.7
pu1ykn1mnx0ptbiw7bjwltrq6 guardwhy03 Ready Active 20.10.7
[root@guardwhy01 data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f42ef1d0c1e5 nginx:1.18.0-alpine "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp nginx.4.qc3yxnwk3zpeurfg3cj6kfy3t
d4c2fa9dbab0 nginx:1.18.0-alpine "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp nginx.2.d89kask69omz214ivu14fduo4
3d648fc53506 dockersamples/visualizer:latest "/sbin/tini -- node …" 6 hours ago Up 4 seconds (health: starting) 0.0.0.0:8091->8080/tcp, :::8091->8080/tcp visualizer
[root@guardwhy01 data]#
访问链接: http://8.134.122.252:8091/
5、命令查看服务情况。
[root@guardwhy01 data]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
u0etuzildau4 nginx replicated 5/5 nginx:1.18.0-alpine *:80->80/tcp
[root@guardwhy01 data]#
注意: docker service ls
命令只能在manager节点使用,在worker节点无法查看
6、查看服务器容器情况
[root@guardwhy02 home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a77fba3447f0 nginx:1.18.0-alpine "/docker-entrypoint.…" 14 minutes ago Up 14 minutes 80/tcp nginx.3.haruvjy8v68otk1cxdkc4rs90
e13fb38a0602 nginx:1.18.0-alpine "/docker-entrypoint.…" 14 minutes ago Up 14 minutes 80/tcp nginx.1.hwedkhibak90mzvh7jt9oaaau
[root@guardwhy02 home]#
注意: 在manager或者worker节点都可以执行docker ps
命令。
7、manager节点只用于管理集群,不部署服务。
[root@guardwhy01 data]# docker node update --availability drain guardwhy01
guardwhy01
[root@guardwhy01 data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d648fc53506 dockersamples/visualizer:latest "/sbin/tini -- node …" 6 hours ago Up 14 minutes (healthy) 0.0.0.0:8091->8080/tcp, :::8091->8080/tcp visualizer
[root@guardwhy01 data]#
访问链接: http://8.134.122.252:8091/
8、将服务缩减为3个容器
[root@guardwhy01 data]# docker service scale nginx=3
nginx scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3:
verify: Service converged
[root@guardwhy01 data]#
访问链接: http://8.134.122.252:8091/
9、升级nginx版本
进入其中一个容器查看nginx的版本信息。
[root@guardwhy02 home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18.0-alpine 684dbf9f01f3 2 months ago 21.9MB
nginx 1.19.3-alpine 4efb29ff172a 8 months ago 21.8MB
[root@guardwhy02 home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a77fba3447f0 nginx:1.18.0-alpine "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 80/tcp nginx.3.haruvjy8v68otk1cxdkc4rs90
e13fb38a0602 nginx:1.18.0-alpine "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 80/tcp nginx.1.hwedkhibak90mzvh7jt9oaaau
[root@guardwhy02 home]# docker exec -it e13fb38a0602 sh
/ # nginx -v
nginx version: nginx/1.18.0
nginx version: nginx/1.18.0
/ # exit
[root@guardwhy02 home]#
更新镜像
注意:更新镜像只能在manager节点
使用。
[root@guardwhy01 data]# docker service update --image nginx:1.19.3-alpine nginx
nginx
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
[root@guardwhy01 data]#
更新镜像以后,查看结果!!!
添加或者更新一个对外端口
[root@guardwhy01 data]# docker service update --publish-add 8087:80 nginx
nginx
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
[root@guardwhy01 data]#
访问链接: http://8.134.122.252:8087/
10、删除服务
[root@guardwhy01 data]# docker network ls
NETWORK ID NAME DRIVER SCOPE
0eb90cd90de7 bridge bridge local
c372c3473958 docker_gwbridge bridge local
5f09756231c5 host host local
jh4ohdal24uo ingress overlay swarm
yoyo8isxn654 nginx-net overlay swarm
9d85ae8a4d3d none null local
[root@guardwhy01 data]# docker service rm nginx
nginx
[root@guardwhy01 data]# docker network rm nginx-net
nginx-net
[root@guardwhy01 data]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
[root@guardwhy01 data]#
1.7 Docker stack
1、docker stack命令小结
常用命令 | 具体作用 |
---|---|
docker stack deploy | 部署新的堆栈或更新现有堆栈 |
docker stack ls | 列出现有堆栈 |
docker stack ps | 列出堆栈中的任务 |
docker stack rm | 删除一个或多个堆栈 |
docker stack services | 列出堆栈中的服务 |
2、在manager
节点中创建docker-compose.yml
文件
version: '3'
services:
nginx-web:
image: nginx:1.19.3-alpine
container_name: nginx
networks:
- nginx-net
restart: always
ports:
- 80:80
deploy:
replicas: 5
networks:
nginx-net:
driver: overlay
3、运行nginx
[root@guardwhy01 data]# docker stack deploy nginx-stack -c docker-compose.yml
Ignoring unsupported options: restart
Ignoring deprecated options:
container_name: Setting the container name is not supported.
Creating service nginx-stack_nginx-web
[root@guardwhy01 data]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
i8nabdgwztf0 nginx-stack_nginx-web replicated 5/5 nginx:1.19.3-alpine *:80->80/tcp
[root@guardwhy01 data]#
访问链接: http://8.134.122.252:8091/
4、查看NAME中的服务名为:nginx-stack_nginx-web
所有容器
[root@guardwhy01 data]# docker service ps nginx-stack_nginx-web
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j91t0720gitm nginx-stack_nginx-web.1 nginx:1.19.3-alpine guardwhy02 Running Running 11 minutes ago
5qooi8nxt1xb nginx-stack_nginx-web.2 nginx:1.19.3-alpine guardwhy02 Running Running 11 minutes ago
r8cdsibuwsec nginx-stack_nginx-web.3 nginx:1.19.3-alpine guardwhy03 Running Running 11 minutes ago
ze7d0p8m8wx6 nginx-stack_nginx-web.4 nginx:1.19.3-alpine guardwhy02 Running Running 11 minutes ago
itzy9fa87v50 nginx-stack_nginx-web.5 nginx:1.19.3-alpine guardwhy03 Running Running 11 minutes ago
[root@guardwhy01 data]#
5、删除stack服务,执行以下命令
[root@guardwhy01 data]# docker stack rm nginx-stack
Removing service nginx-stack_nginx-web
Removing network nginx-stack_nginx-net
[root@guardwhy01 data]#
6、小结
- networks中也可以不指定
driver:overlay
,因为docker swarm默认网络类型是overlay。 - 整个networks都可以不用配置,stack部署时会默认创建网络。定义网络在docker stack deploy时,会先默认创建一个网络。
- 注意一定要把镜像先拉取到本地然后再执行。
1.8 Stack和Compose区别
- Docker stack会忽略了构建指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的。 所以
docker-compose
更适合于开发场景。 - Docker Compose是一个Python项目,它使用Docker API规范来操作容器。所以需要安装Docker -compose,以便与Docker一起在计算机上使用。
- Docker Stack功能包含在Docker引擎中,不需要安装额外的包来使用它。docker stacks 只是swarm mode的一部分。
- Docker stack不支持基于第2版写的
docker-compose.yml
,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理。 - docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果是Docker新手,或正在选择用于新项目的技术,请使用docker stack