官网文档
https://docs.docker.com/engine/swarm/
初始化第一个管理节点
关于advertise-addr和listen-addr这两个参数:
- 前者用来指定其他节点连接m0时的地址
- 后者指定承载swarm流量的IP和端口
- 会在本地新建docker网络
docker swarm init --advertise-addr 192.168.198.105:2377 --listen-addr 192.168.198.105:2377
docker node ls
docker network ls
MANAGER STATUS列说明:
- Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
- Reachable 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
- Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
AVAILABILITY列说明:
- Active 意味着调度程序可以将任务分配给节点。
- Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
- Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。
如何加入新的节点
Docker Swarm的新节点加入策略是从管理节点获取一长串命令,被称为join token,任何想加入集群的机器只要自己执行这个join token即可加入Swarm集群;
如果有新的管理节点需要加入,在m0执行命令docker swarm join-token manager即可得到管理manager节点的join token,
如果有新的work节点需要加入,在m0执行命令docker swarm join-token worker即可得到管理work节点的join token
加入worker节点
# 在manager节点执行。可以作为worker节点加入集群
docker swarm join-token worker
在新worker节点执行
在manager节点查看
# 该命令只能在管理节点执行
docker node ls
加入manager节点
# 在manager节点执行。可以作为manager节点加入集群
docker swarm join-token manager
在新manager节点执行
在manager节点查看
# 该命令只能在manager节点执行
docker node ls
验证节点
# master节点:
docker info
# work节点:
docker info
下面图片是worker部分
节点权限提升/降低
# 将manager节点降低为worker节点,在manager节点执行如下命令:
docker node demote work-02
# 该命令只能在manager节点执行
docker node ls
查看
# 将worker节点提升为manager节点,在manager节点执行如下命令:
docker node promote work-01
# 该命令只能在manager节点执行
docker node ls
脱离集群
# 在work-02节点使用命令:
# 此命令必须在要拖里的节点上使用,
# 如果集群只有一个manager,manager节点只能强制退出。命令:docker swarm leave --force。manager退出后意味着整个swarm不复存在。
docker swarm leave
稍微等待几分钟,在manager节点使用命令:docker node ls,发现work-02节点已经脱离集群管理。
删除脱离集群的节点
先使用命令:docker node demote 节点名称。将某一个节点降为worker节点后,再删除。
使用命令:docker node rm 节点名称|节点ID
# 在manager节点上执行
docker node rm work-02
# 该命令只能在manager节点执行
docker node ls
swarm命令
node命令
service命令
service和replicas关系
说明:部署了三个nginx服务;
基础镜像
集群所有节点都需要下载相关镜像
docker pull nginx:1.18.0-alpine
docker pull nginx:1.19.3-alpine
scp nginx.1.18.tar root@192.168.198.106:/data/
scp nginx.1.18.tar root@192.168.198.107:/data/
scp nginx.1.19.3.alpine.tar root@192.168.198.106:/data/
scp nginx.1.19.3.alpine.tar root@192.168.198.107:/data/
# 所有节点执行如下命令:
cd /data
docker load -i nginx.1.18.tar
docker load -i nginx.1.19.3.alpine.tar
rm -rf *
部署nginx服务(5个)
# 在manager节点中创建overlay网络:
docker network create -d overlay nginx-net
# 创建5个nginx:alpines容器的集群:
docker service create --name nginx --network nginx-net -p 80:80 --replicas 5nginx:1.18.0-alpine
# 在manager节点使用docker service ls 命令查看服务情况,worker节点无法查看:
docker service ls
# 在manager或者worker节点都可以执行docker ps命令查看本虚拟机容器情况:
docker ps
# 设置manager节点只用于管理集群,不希望部署服务。master-01为manager节点名称
docker node update --availability drain master-01
# 使用docker service scale nginx=2命令将服务缩减为2个容器:
docker service scale nginx=2
在manager节点
在worker节点
升级nginx版本
# 进入其中一个容器查看nginx的版本信息:
# 注意事项:因nginx是alpine的linux版本。不能使用/bin/bash指令。
docker exec -it 503fe639bb89 sh
nginx -v
1.更新镜像:
docker service update --image nginx:1.19.3-alpine nginx
2.添加或者更新一个对外端口:
docker service update --publish-add 8090:80 nginx
删除服务
docker service rm nginx
docker network rm nginx-net
stack命令
部署nginx服务
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
运行nginx服务
# 在manager节点中创建docker-compose.yml文件。执行如下命令:
docker stack deploy nginx-stack --compose-file=docker-compose.yml 或者是
docker stack deploy nginx-stack -c docker-compose.yml
# 查看stack服务运行情况。执行如下命令:
docker stack services nginx-stack
# 查看5个容器运行在哪个节点中。执行如下命令:
docker service ls 查看到NAME中的服务名为:nginx-stack_nginx-web
docker service ps nginx-stack_nginx-web
# 进行测试:
curl 192.168.0.105
curl 192.168.0.106
curl 192.168.0.107
# 删除stack服务。执行如下命令:
docker stack rm nginx-stack