MENU

Docker swarm集群部署

集群部署

说明

Docker swarm集群中的角色分为:ManagerWorker

  • 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,下面将会例出两种使用方式。

命令启动

例如,我们同时在两台不同的机器上使用该命令

[[email protected]]$ docker run -d --network=sgc-network --name=web1 nginx
[[email protected]]$ 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 15670178936 123 sgc-server latest

执行该脚本需要一些时间,等待执行完毕后,可以使用docker images命令查看已拉取的docker

项目依赖分发

项目配置和依赖的分发需要使用SSH客户端工具进行批量操作服务器;这里配置文件放在git仓库中,我们使用SecureCRT客户端中的发送命令到所有会话将git拉取命令发布至所有服务器中

git pull [仓库地址]

然后确保所有的配置文件都在相同的目录下,当Manager发布任务时,这些Worker节点也会以同样的方式去读取这些配置。