目录

一、准备三台虚拟机,并安装docker

二、在三台主机分别开启以下端口:

三、在主节点上执行swarm命令

四、在从节点上执行join命令

五、创建共享网络

1、查看集群节点

2、查看网络信息

六、各个节点离开集群


背景:容器节点部署在不同的主机上,实现高可用

SwarmDocker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。

一、准备三台虚拟机,并安装docker

如果不知道怎么安装,可以参考我的这篇文章

Docker镜像、容器和数据管理

另外,如果是新启的虚拟机,不能联通网络的话,可以尝试看看网络配置有没有指定网关。

二、在三台主机分别开启以下端口:

这个不能偷懒,三台都要执行,或者嫌麻烦的话,直接关闭防火墙也行,但是生产环境不建议这样做

firewall-cmd --add-port=2377/tcp --permanent #TCP端口2377用于集群管理通信 
firewall-cmd --add-port=7946/tcp --permanent #TCP和UDP端口7946用于节点之间的通信 
firewall-cmd --add-port=7946/udp --permanent 
firewall-cmd --add-port=4789/udp --permanent #UDP端口4789用于覆盖网络流量 
firewall-cmd --reload                        #重新载入刷新修改
firewall-cmd --zone=public --list-ports      #查看开通的端口

当然liunx也可以使用命令拼接的方式去执行,看这篇文章

shell 多个命令一起执行的几种方法

https://www.cnblogs.com/chenlifan/p/13810640.html

三、在主节点上执行swarm命令

选择一台服务器作为主节点,创建swarm集群

docker swarm init

此时会输出如下结果

[root@localhost etc]# docker swarm init
Swarm initialized: current node (vkkl57cihhvxip10dlh9391pd) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-0k2r5mh4ddq63ambeicd40v2opw0pi8yes0tr3bn77cbgwiu2r-ae1fgnl2q2p2pnn6aonl993me \
    192.168.1.18:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@localhost etc]# 

四、在从节点上执行join命令

在输出结果中,我们可以拿到以worker身份加入集群的命令,只需要把以下命令分别在加入集群的docker容器的服务器里边执行即可

docker swarm join \
    --token SWMTKN-1-0k2r5mh4ddq63ambeicd40v2opw0pi8yes0tr3bn77cbgwiu2r-ae1fgnl2q2p2pnn6aonl993me \
    192.168.1.18:2377

注意:执行命令时,docker必须是启动状态。

执行完成后会提示,该节点以工作节点的状态加入集群。

[root@localhost ~]# docker swarm join \
>     --token SWMTKN-1-0k2r5mh4ddq63ambeicd40v2opw0pi8yes0tr3bn77cbgwiu2r-ae1fgnl2q2p2pnn6aonl993me \
>     192.168.1.18:2377
This node joined a swarm as a worker.
[root@localhost ~]# 

五、创建共享网络

1、查看集群节点

在主节点上输入以下命令

docker node ls

可以看到上边加入节点的两台docker

[root@localhost etc]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
7wqt60k83sf3jixjexfcv2dpu    localhost.localdomain  Ready   Active        
cbqjwsb40smyg01qn3914sdap    localhost.localdomain  Ready   Active        
vkkl57cihhvxip10dlh9391pd *  localhost.localdomain  Ready   Active        Leader
[root@localhost etc]# 

注意,只能在主节点上查看,在从节点上会出现以下错误

[root@localhost ~]# docker node ls
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
[root@localhost ~]# 

2、查看网络信息

docker network ls

输出结果

[root@localhost etc]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
e4c4cb1988ca        bridge              bridge              local
26ca69744e63        docker_gwbridge     bridge              local
40f1bce14fe3        host                host                local
g37dv3lqrxd7        ingress             overlay             swarm
#swarm集群创建出来的共享网络,不是用来给容器与容器之间通信的,是swarm用来管理集群的
91a440523949        none                null                local
[root@localhost etc]# 

因此,如果要实现容器与容器之间通信,我们还需要创建一个共享网络:

在主节点的容器中执行以下命令

docker network create -d overlay --attachable sharednet
  • -d:网络驱动类型 
  • --attachable:声明当前创建的overlay网络可以被容器加入
  • sharednet:自定义的网络名称

测试举例:

每个容器中下载tomcat:7的镜像,并指定共享网络运行

docker run -d --name node1 --net=sharednet tomcat:7 
docker run -d --name node2 --net=sharednet tomcat:7 
docker run -d --name node3 --net=sharednet tomcat:7

进入任何一个容器,看能不能ping通其中任意两台(可以使用docker容器的名字,也可以使用docker内置ip,如-10.0.0.2),如果能够ping通,说明集群搭建成功:

[root@localhost ~]# docker exec -it node2 /bin/bash
root@38248553fe52:/usr/local/tomcat# ping node1
PING node1 (10.0.0.2) 56(84) bytes of data.
64 bytes from node1.sharednet (10.0.0.2): icmp_seq=1 ttl=64 time=0.349 ms
64 bytes from node1.sharednet (10.0.0.2): icmp_seq=2 ttl=64 time=0.374 ms
64 bytes from node1.sharednet (10.0.0.2): icmp_seq=3 ttl=64 time=0.445 ms
^C
--- node1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 0.349/0.389/0.445/0.043 ms
root@38248553fe52:/usr/local/tomcat# ping node3
PING node3 (10.0.0.4) 56(84) bytes of data.
64 bytes from node3.sharednet (10.0.0.4): icmp_seq=1 ttl=64 time=0.562 ms
64 bytes from node3.sharednet (10.0.0.4): icmp_seq=2 ttl=64 time=2.02 ms
^C
--- node3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 6ms
rtt min/avg/max/mdev = 0.562/1.293/2.024/0.731 ms
root@38248553fe52:/usr/local/tomcat# 

六、各个节点离开集群

管理节点离开集群前,因该把管理节点降级为工作节点再离开,或者是该集群上还有其他Manager节点

注意:如果只有一个Manager节点,而该Manager节点在还有其他工作节点的情况下离开集群,该集群在没有Manager节点的情况下仍然存活,只有把所有工作节点离群后,原Manager节点所在服务器才能创建新的集群

# 工作节点离开集群
docker swarm leave

# 管理节点离开集群
docker swarm leave --force #必须使用参数--force,强制离开集群,否则会报错

如果想在一个集群中添加Manager节点,在Manager节点输入以下命令,生成对应的token

docker swarm join-token manager

删除失效节点-docker node rm

[root@localhost ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
4nzf0ken1fpaapo9mqyzw0yl5    localhost.localdomain  Down    Active        
k0qkclnoeixja2ctak2c13n2j *  localhost.localdomain  Ready   Active        Leader
nb1cf8v8cxnw1h32bos6f6t2x    localhost.localdomain  Ready   Active        
[root@localhost ~]# docker node rm 4nzf0ken1fpaapo9mqyzw0yl5 
4nzf0ken1fpaapo9mqyzw0yl5
[root@localhost ~]# docker node ls
ID                           HOSTNAME               STATUS  AVAILABILITY  MANAGER STATUS
k0qkclnoeixja2ctak2c13n2j *  localhost.localdomain  Ready   Active        Leader
nb1cf8v8cxnw1h32bos6f6t2x    localhost.localdomain  Ready   Active        
[root@localhost ~]# 

更多详细内容,请看官方文档

https://docs.docker.com/engine/reference/commandline/swarm_init/

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐