准备三台主机
- 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》还可以, 书也不厚, 最烦那种外文翻译出来厚厚地书了, 有些真是一半都是废话, 浪费生命啊...
查看节点为例:
- [[email protected] ~]$ 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 追随者
来源: http://www.bubuko.com/infodetail-3258813.html