1.准备工作。
- 准备好主机,我测试准备了3台主机。
IP:192.168.43.28 担任角色:swarm manager
IP:192.168.43.182 担任角色:swarm node
IP:192.168.43.110 担任角色:swarm node
- 安装好Docker Engine
CentOS Docker安装:
yum -y install docker
树莓派安装Docker可以参考:https://yeasy.gitbook.io/docker_practice/install/raspberry-pi
Windows安装Docker:直接官网下载安装即可。https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe
- 设置防火墙
关闭三台机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377
/tcp
(管理端口)、7946
/udp
(节点间通信端口)、4789
/udp
(overlay 网络端口)端口。
2.创建Swarm并加入节点。
1)创建Swarm,在192.168.43.28 中执行
docker swarm init --advertise-addr 192.168.43.28 执行结果: Swarm initialized: current node (1lptx3e7syne0b6pnrm987xun) is now a manager. To add a worker to this swarm, run the following command: # 这就是添加节点的方式(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥) docker swarm join --token SWMTKN-1-4xb3dz6kg3bexpxz5eeifss2dtsmucf74nsixstyin3q169ona-9cwtdkjtdjwlwnsfeloxja6ug 192.168.43.28:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2)其他节点加入集群,
- 获取加入工作节点的token
docker swarm join-token worker 执行结果: To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4xb3dz6kg3bexpxz5eeifss2dtsmucf74nsixstyin3q169ona-9cwtdkjtdjwlwnsfeloxja6ug 192.168.43.28:2377
如果想加入管理节点,获取管理节点token命令
docker swarm join-token manager
- 加入集群,执行:
docker swarm join --token SWMTKN-1-4xb3dz6kg3bexpxz5eeifss2dtsmucf74nsixstyin3q169ona-9cwtdkjtdjwlwnsfeloxja6ug 192.168.43.28:2377
- 查看集群中机器及状态
docker node ls 执行结果: ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION v02i9sn3yet34o4twq7ir7ek6 docker-desktop Ready Active 19.03.8 vqevr5pamsiv155x2ccuxg6eg docker-desktop Ready Active 19.03.8 1lptx3e7syne0b6pnrm987xun * raspberrypi Ready Active Leader 19.03.12
- 修改节点availablity状态
设置节点不可用: docker node update --availability drain v02i9sn3yet34o4twq7ir7ek6 设置节点可用: docker node update --availability active v02i9sn3yet34o4twq7ir7ek6
- 删除节点
docker node rm --force v02i9sn3yet34o4twq7ir7ek6
3.在swarm中部署服务(nginx为例)
1)创建网络在部署服务,在管理节点(192.168.43.28 )运行命令,
- 在管理节点(192.168.43.28 )运行命令,创建网络
docker network create -d overlay nginx_net 查看网络 docker network ls | grep nginx_net
- 在管理节点(192.168.43.28 )运行命令,部署服务
docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx # 只创建了一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx 运行结果: olexfmtdf94sxyeetkchwhehg overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged
注意:不需要提前在节点上下载nginx镜像,这个命令执行后会自动下载这个容器镜像
- 使用 docker service ls 查看正在运行服务的列表
docker service ls 执行结果: ID NAME MODE REPLICAS IMAGE PORTS olexfmtdf94s my_nginx replicated 1/1 nginx:latest *:80->80/tcp
2)查询Swarm中服务的信息(在管理节点上运行)
- 查看swarm
docker service inspect --pretty my_nginx 运行结果: ID: 8nx16idy6eystnelu2214tnjj Name: my_nginx Service Mode: Replicated Replicas: 5 Placement: UpdateConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Update order: stop-first RollbackConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Rollback order: stop-first ContainerSpec: Image: nginx:latest@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa Init: false Resources: Networks: nginx_net Endpoint Mode: vip Ports: PublishedPort = 80 Protocol = tcp TargetPort = 80 PublishMode = ingress
- 查询到哪个节点正在运行该服务
docker service ps my_nginx 运行结果: ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 2xjblebabprw my_nginx.1 nginx:latest raspberrypi Running Running 7 hours ago 92qra1x9nmsn my_nginx.2 nginx:latest docker-desktop Running Running 6 hours ago 6my8umxa19nb \_ my_nginx.2 nginx:latest docker-desktop Shutdown Rejected 7 hours ago "No such image: nginx:latest@s…" 9r9yp00mku5w my_nginx.3 nginx:latest docker-desktop Running Running 4 hours ago kxkw4zofnzu9 \_ my_nginx.3 nginx:latest docker-desktop Shutdown Shutdown 3 hours ago q39bye7fexwo \_ my_nginx.3 nginx:latest docker-desktop Shutdown Rejected 6 hours ago "No such image: nginx:latest@s…" r5p344468c2h my_nginx.4 nginx:latest raspberrypi Running Running about an hour ago v7un0150x9o7 \_ my_nginx.4 nginx:latest docker-desktop Shutdown Shutdown about an hour ago 1h8l0yrokdcz \_ my_nginx.4 nginx:latest docker-desktop Shutdown Shutdown 3 hours ago mkx7uh745rfl my_nginx.5 nginx:latest raspberrypi Running Running about an hour ago murmvfdqn3kk \_ my_nginx.5 nginx:latest docker-desktop Shutdown Shutdown about an hour ago
4.在Swarm中动态扩展服务(scale)
docker service scale my_nginx=4 运行结果: my_nginx scaled to 4 overall progress: 4 out of 4 tasks 1/4: running [==================================================>] 2/4: running [==================================================>] 3/4: running [==================================================>] 4/4: verify: Service converged
5.其他操作
1)将要离开的节点停止工作(管理节点上执行)
docker node update --availability drain v02i9sn3yet34o4twq7ir7ek6
2)工作节点离开集群(在工作节点执行)
docker swarm leave -f 运行结果: Node left the swarm.
3)移除节点(管理节点上执行)
docker node rm v02i9sn3yet34o4twq7ir7ek6
docker node rm vqevr5pamsiv155x2ccuxg6eg
4)删除服务,my_nginx
docker service rm my_nginx
这样就会把所有节点上的所有容器(task任务实例)全部删除了
5)管理节点离开(管理节点上执行)
docker swarm leave -f