搭建 Docker Swarm 集群

 
准备三台主机
A:192.168.1.5
B:192.168.1.7
C:192.168.1.10
 
Docker Swarm集群中的节点主机开放如下三个端口
2377端口, 用于集群管理通讯
7946端口, 用于集群节点之间的通讯
4789端口, 用于overlay网络流量
 
 
关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
 
在A上执行
 
建立集群并加入集群
$ docker swarm init --advertise-addr 192.168.1.5:2377 --listen-addr 192.168.1.5:2377
 
initialized: current node (sf4zgbesw21ko536rrgpxspv4) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-3mlkj1pouzqm8mjdqdnj5gw30i4ahjw5aayfu177vzernbzmod-1svbkyjwzhv0swzojp6xh3shm 192.168.1.5:2377
 
查看集群中的节点
$ docker node ls
 
查看 manager 角色的 token
$ docker swarm join-token manager
 
To add a manager to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-3mlkj1pouzqm8mjdqdnj5gw30i4ahjw5aayfu177vzernbzmod-0ib338l48ybx8csrlpr3yn7ug 192.168.1.5:2377
 
 
查看 worker  角色的 token
$ docker swarm join-token worker
 
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-3mlkj1pouzqm8mjdqdnj5gw30i4ahjw5aayfu177vzernbzmod-1svbkyjwzhv0swzojp6xh3shm 192.168.1.5:2377
 
 
在B上执行
 
把 B 以 manager 角色加入集群 (上面的 token 那段命令,再接上当前的监听的IP  )
$ docker swarm join --token SWMTKN-1-3mlkj1pouzqm8mjdqdnj5gw30i4ahjw5aayfu177vzernbzmod-0ib338l48ybx8csrlpr3yn7ug 192.168.1.5:2377  --advertise-addr 192.168.1.7:2377 --listen-addr 192.168.1.7:2377
 
查看一下节点
$ docker node ls
 
 
在C上执行
 
把 C 以 worker 角色加入集群(上面的 token 那段命令,再接上当前的监听的IP  )
$ docker swarm join --token SWMTKN-1-3mlkj1pouzqm8mjdqdnj5gw30i4ahjw5aayfu177vzernbzmod-1svbkyjwzhv0swzojp6xh3shm 192.168.1.5:2377 --advertise-addr 192.168.1.10:2377 --listen-addr 192.168.1.10:2377
 
在 worker 节点查看集群中的节点会报没有权限的错误
$ 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.
 
 
集群建好了,就开始建立服务,能够在任意 manager 角色的主机上建立
这个建立容器几乎同样,--replicas 5 在集群中运行五个实例副本 -p 80:8080 服务绑定 80 端口
$ docker service create --name web-fa  -p 80:8080 --replicas 5 nigelpoulton/pluralsight-docker-ci
k4qpts36rterzzsy0ys0f7rjw
overall progress: 5 out of 5 tasks
1/5: running   [==================================================>]
2/5: running   [==================================================>]
3/5: running   [==================================================>]
4/5: running   [==================================================>]
5/5: running   [==================================================>]
 
打开浏览器,输入 A B C 任意主机的 IP 访问一下,看看可否打开一个web页面
 
查看服务列表
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                                       PORTS
k4qpts36rter        web-fa              replicated          5/5                 nigelpoulton/pluralsight-docker-ci:latest   *:80->8080/tcp
 
查看具体服务中运行的任务
$ docker service ps web-fa
ID                  NAME                IMAGE                                       NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
94thjgudevf0        web-fa.1            nigelpoulton/pluralsight-docker-ci:latest   host                Running             Running 7 minutes ago                       
o0ll8yuo5w0x        web-fa.2            nigelpoulton/pluralsight-docker-ci:latest   host                Running             Running 7 minutes ago                       
nkonamy3qa97        web-fa.3            nigelpoulton/pluralsight-docker-ci:latest   host                Running             Running 7 minutes ago                       
k311fuxvvz0c        web-fa.4            nigelpoulton/pluralsight-docker-ci:latest   aaa                 Running             Running 7 minutes ago                       
sttj7tt70k99        web-fa.5            nigelpoulton/pluralsight-docker-ci:latest   host                Running             Running 7 minutes ago  
 
查看服务的详细信息
docker service inspect --pretty web-fa
 
 
 
还有一些实用命令
退出集群: docker swarm leave -f 
删除服务: docker service rm <service-name>
 
总结一下,当任务副本数大于集群中的节点数时,势必有节点得运行两个容器实例。经过 docker ps 能够看到多个容器实例并无绑定到宿主机的端口,若是绑定同一个端口,势必会冲突。
建议,若是想学得深刻点,仍是得买书呀,网上都是教程都近似于笔记,不少细节没有讲。《深刻浅出 Docker》还能够,书也不厚,最烦那种外文翻译出来厚厚地书了,有些真是一半都是废话,浪费生命啊。。。
 
查看节点为例:
[zbseoag@host ~]$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ioi5usennpdgjpb6ehxmkifgm     host                Down                Active                                  19.03.4
ozeybjcrl9z913qtx2xqkexiq     host                Ready               Active              Reachable           19.03.4
sf4zgbesw21ko536rrgpxspv4 *   host                Ready               Active              Leader              19.03.4
x5yvbr44s6294qjf1bx9fhcro     host                Ready               Active              Reachable           19.03.4

说明:
sf4zgbesw21ko536rrgpxspv4 * : 这个 * 表示当前执行命令的主机
HOSTNAME:因为我是虚拟机副本建立的,都是同样的名字。你能够在其中一台上用 sodu hostname aaa 来临时改变主机名,而后再运行一下 docker node ls 会看到列表中主机名变了
MANAGER STATUS:直译就叫管理员状态,这一栏为空就表示 worker 节点, Leader 领导者,Reachable 追随者  
相关文章
相关标签/搜索