集群部署
说明
Docker swarm集群中的角色分为:Manager和Worker
- Manager:管理角色,可发布、移除服务等,拥有对集群的所有操作权限;
- Worker:工作者角色,仅能执行管理者发布的服务。
Manager节点
启动Manager节点
使用该命令可初始化一个节点主机
docker swarm init
也可以添加--advertise-addr
参数来指定当前的广播地址,另一个命令如下所示:
docker swarm init --advertise-addr 192.168.1.102
当上述步骤操作完成后,在终端会弹出类似如下的提示,其中docker swarm join --token xxx
部分的内容是Worker
角色的加入命令;docker swarm init
的主机默认是Manager
角色,至此Manager
节点创建完毕。
Swarm initialized: current node (60lq1tnx1m1slwms8vayowzam) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0dls4k1vfysytqd1wbmshnxhy8m2bteayjly6e3vvjpxsolxkb-64urqgxyqndpiqq1tvakl1re7 172.17.0.14:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
以Manager角色加入已有集群
我们需要在已有的Manager
角色机器上,执行如下命令:
docker swarm join-token manager
此命令的回显也会出现类似docker swarm join --token
的内容,我们需要在需要以Manager
加入集群的机器上执行该命令即可。
Worker节点
如果我们已有Worker
角色的加入命令后,则直接在Worker
节点执行加入命令即可,倘若没有?请往下看:
我们需要在Manager
节点执行如下命令:
docker swarm join-token worker
此命令的回显也会出现类似docker swarm join --token
的内容,我们需要在需要以Worker
加入集群的机器上执行该命令即可。
集群网络创建
创建
为了确保项目之间可以互相通信,我们需要建立一个公共的网络驱动,首先我们使用:
docker network create -d overlay --attachable sgc-network
其中overlay
是指覆盖型网络,attachable
参数为驱动的名称
当我们执行上述命令后,我们可以在整个集群中任意一个机器上看到这个网络驱动:
[[email protected] ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
168a0d9e3cc5 bridge bridge local
15c26085cf5b docker_gwbridge bridge local
d8512dcac02c host host local
qxtnrunu84s3 ingress overlay swarm
2f5f6cc51a89 none null local
3hseiw5rhg0c sgc-network overlay swarm
[[email protected] ~]$
可以看到id为3hseiw5rhg0c
的驱动是我们刚才创建的网络驱动
使用
要想加入该集群网络,需要在启动时指定网络驱动为sgc-network
,下面将会例出两种使用方式。
命令启动
例如,我们同时在两台不同的机器上使用该命令
[root@server1]$ docker run -d --network=sgc-network --name=web1 nginx
[root@server2]$ docker run -d --network=sgc-network --name=web2 nginx
注意:其中,关键的参数在于network
,它指定了一个网络驱动,就是我们的sgc-network
我们在server1
中可以通过服务名访问web2
,例如:
[[email protected]]$ docker exec web1 curl web2
我们通过对web1
的容器进行操作,让它连接发送http请求
到web2
,此时server1
的终端会正常显示web2
的nginx欢迎页信息
yml配置
version: '3.9'
services:
# nginx网关
image: nginx:latest
container_name: sgc-nginx
restart: always
networks:
- sgc-network
...
networks:
sgc-network:
external: true
对于yaml
配置文件来说,我们需要在服务中添加networks
的配置节点,并在services
同级配置项中添加networks
的配置,external: true
意为已存在的驱动,该配置项主要说明了服务在启动时自动连接至已存在的sgc-network
网络驱动。
集群可视化
此功能没有特殊的配置,直接执行如下命令在manager
节点即可
docker run -it -d -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock dockersamples/visualizer
退出节点
当遇到需要使某台服务器退出节点时,我们需要在这个节点上使用如下命令:
docker swarm leave
上述命令在Worker
节点中使用时可直接退出集群,但在Manager
节点使用时,会提示如下错误:
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` to ignore this message.
所以要使Manager
退出集群,则必须在集群中有其他Manager
节点在服务,否则Manager
节点的退出会使整个集群不可用。
若满足上述需求,则可使用如下命令使Manager
退出集群:
docker swarm leave --force
注意:所有的退出集群命令都没有交互式确认机制,请想好再操作!
批量操作
各服务器镜像拉取
镜像的拉取离不开项目中的docker-pull.sh
文件,这是一个镜像批量拉取脚本,用法如下:
# 参数说明
sh docker-pull.sh [docker镜像仓库] [用户名] [密码] [项目名称] [拉取的tag]
sh docker-pull.sh registry.cn-hangzhou.aliyuncs.com username password sgc-server latest
执行该脚本需要一些时间,等待执行完毕后,可以使用docker images
命令查看已拉取的docker
项目依赖分发
项目配置和依赖的分发需要使用SSH
客户端工具进行批量操作服务器;这里配置文件放在git仓库中,我们使用SecureCRT
客户端中的发送命令到所有会话
将git拉取命令发布至所有服务器中
git pull [仓库地址]
然后确保所有的配置文件都在相同的目录下,当Manager
发布任务时,这些Worker
节点也会以同样的方式去读取这些配置。