1、基础环境配置

主机名   master     node1     node2

IP地址  192.168.***.1  192.168.***.2  192.168.***.3

角色      管理节点    工作节点    工作节点

2、修改主机名

2.1 管理节点

  1. 1 [root@localhost ~]# hostnamectl set-hostname master
  2. 2 [root@localhost ~]# bash
  3. 3 [root@master ~]#

2.2 工作节点

  1. 1 [root@localhost ~]# hostnamectl set-hostname node1
  2. 2 [root@localhost ~]# bash
  3. 3 [root@node1 ~]#

2.3 工作节点

  1. 1 [root@localhost ~]# hostnamectl set-hostname node2
  2. 2 [root@localhost ~]# bash
  3. 3 [root@node2 ~]#

3、在master、node1和node2主机上均需正确安装docker并配置镜像加速器

请点击:安装Docker - H_one - 博客园 (cnblogs.com)

4、设置时间同步

  1. 1 [root@master ~]# ntpdate 0.centos.pool.ntp.org
  2. 2 [root@node1 ~]# ntpdate 0.centos.pool.ntp.org
  3. 3 [root@node2 ~]# ntpdate 0.centos.pool.ntp.org

5、在master节点上编辑docker.service文件,修改如下参数信息,并启动docker服务 

  1. 1 [root@master ~]# vim /lib/systemd/system/docker.service

修改如下:

  1. 1 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
  2. 2 [root@dmaster ~]# systemctl daemon-reload
  3. 3 [root@master ~]# systemctl restart docker
  4. 4 [root@master ~]# systemctl status docker

6、通过netstat -tunlp命令,可以查看到2375端口的信息,该端口默认为DockerHTTPAPI的端口

  1. 1 [root@master ~]# netstat -tunlp

7、在各主机节点上获取swarm镜像

  1. 1 [root@master ~]# docker pull swarm
  2. 2 [root@node1 ~]# docker pull swarm
  3. 3 [root@node2 ~]# docker pull swarm

8、创建集群

  1. 1 [root@master ~]# docker swarm init --advertise-addr 192.168.6.3
  2. 2 Swarm initialized: current node (zo03btaffpxok5wncx2wzzov9) is now a manager.
  3. 3
  4. 4 To add a worker to this swarm, run the following command:
  5. 5
  6. 6 docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
  7. 7
  8. 8 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

9、将node1和node2加入集群,在node1和node2节点上执行以下命令

  1. 1 [root@node1 ~]# docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
  2. 2 This node joined a swarm as a worker.
  3. 3 [root@node2 ~]# docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
  4. 4 This node joined a swarm as a worker.

在做这一步的时候我遇到了这样一个问题,它说来自守护程序的错误,意思就是我没有关闭防火墙所以导致如下错误。

  1. [root@node2 ~]# docker swarm join --token SWMTKN-1-2gihzazr59zifqwldezv9zvivyti52xoo873xklvg0ppkkzjb0-2zacafl4mm7477ra9zjcskw98 192.168.6.3:2377
  2. Error response from daemon: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 192.168.6.3:2377: connect: no route to host"

解决方法:

  1. 1 [root@node2 ~]# systemctl stop firewalld
  2. 2 [root@node2 ~]# systemctl disable firewalld
  3. 3 Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
  4. 4 Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
  5. 5 [root@node2 ~]# vi /etc/selinux/config
  6. 6 SELINUX=disabled

10、查看集群个节点的信息

  1. 1 [root@master ~]# docker node ls
  2. 2 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  3. 3 zo03btaffpxok5wncx2wzzov9 * master Ready Active Leader 20.10.14
  4. 4 kk7zblnmk9f57p2ynvd0yn8ca node1 Ready Active 20.10.14
  5. 5 ymfjjqococ8t6im8wlq4f1ws7 node2 Ready Active 20.10.14

# 若节点的status为up和down之间闪烁,原因,docker swarm 节点间通信默认超时时间为 5s,在虚拟化环境下或者网络不太好的情况下有时候会超时,导致节点重启。

# 解决方案,调高swarm心跳检测时间。

docker swarm update --dispatcher-heartbeat 60s  #设置docker swarm的心跳检测时间为1分钟,在manages节点执行。

11、在swarm中部署服务,本任务以部署nginx服务为例进行介绍

  1. 1 [root@master ~]# docker pull nginx
  2. 2 [root@node1 ~]# docker pull nginx
  3. 3 [root@node2 ~]# docker pull nginx

12、在master节点中创建一个网络“nginx_net”,用于使不同的主机上的容器网络互通

  1. 1 [root@master ~]# docker network ls
  2. 2 NETWORK ID NAME DRIVER SCOPE
  3. 3 18c93bfdcbec bridge bridge local
  4. 4 2e947a5f0ac8 docker_gwbridge bridge local
  5. 5 5de49e00ddbc host host local
  6. 6 kye8igzym4vu ingress overlay swarm
  7. 7 s7fk3dqm1yty nginx_net overlay swarm
  8. 8 a5604f0fa6a0 none null local

13、在master节点上创建一个副本为1的nginx容器

  1. 1 [root@master ~]# docker service create --replicas 1 --network nginx_net --name my-test -p 9999:80 nginx
  2. 2 y87k6dc1wa9a39hq6grgitsob
  3. 3 overall progress: 1 out of 1 tasks
  4. 4 1/1: running [==================================================>]
  5. 5 verify: Service converged
  6. 6 [root@master ~]# docker service ls
  7. 7 ID NAME MODE REPLICAS IMAGE PORTS
  8. 8 y87k6dc1wa9a my-test replicated 1/1 nginx:latest *:9999->80/tcp
  9. 9 [root@master ~]# docker service inspect --pretty my-test docker service inspect my-test # 两条命令其中一条

# 参数说明:

# --format, -f 使用给定的Go模板格式化输出

# --pretty  默认为false 以人性化的格式打印信息

14、使用docker service ps命令查询在哪个节点运行my-test容器

  1. 1 [root@master ~]# docker service ps my-test
  2. 2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
  3. 3 kcyvzcqwtzcl my-test.1 nginx:latest master Running Running 51 seconds ago

15、伸缩容器,将my-test容器扩展到6个,在master节点上执行以下命令

  1. 1 [root@master ~]# docker service scale my-test=6

# 查看这6个服务运行在哪些节点上

  1. 2 [root@master ~]# docker service ps my-test

17、swarm可以缩容,如将my-test容器缩容为1个,代码如下

  1. 1 [root@master ~]# docker service scale my-test=1
  2. 2 # 将my-test容器缩容为1个后,利用docker service ps my-test命令进行查看,可以发现其它节点上的my-test容器状态为remove。
  3. 3 [root@master ~]# docker service ps my-test

18、节点宕机处理

# 如果一个节点出现了宕机情况,则该节点会从swarm集群中被移除,利用docker node ls命令进行查看,此时,在宕机节点上运行的容器会被调度到其他节点上,以满足指定数量的副本保持运行状态。

例如:在node2上把docker服务关闭,或者关机重启,在manage节点上查看swarm集群中各节点的状态。

  1. 1 [root@node2 ~]#
  2. 2 [root@node2 ~]# systemctl stop docker
  3. 3 Warning: Stopping docker.service, but it can still be activated by:
  4. 4 docker.socket
  5. 5 [root@node2 ~]# systemctl stop docker.socket
  6. 6 [root@node2 ~]# systemctl stop docker
  7. 7 [root@node2 ~]# systemctl status docker

# 需要等待一会儿,在master进行查看

  1. 1 [root@master ~]# docker node ls
  2. 2 ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  3. 3 zo03btaffpxok5wncx2wzzov9 * master Ready Active Leader 20.10.14
  4. 4 kk7zblnmk9f57p2ynvd0yn8ca node1 Ready Active 20.10.14
  5. 5 ymfjjqococ8t6im8wlq4f1ws7 node2 Down Active 20.10.14

# 此时node2节点状态为down,node2节点上的容器被调度到其他节点上

  1. 1 [root@master ~]# docker service ps my-test
  2. 2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
  3. 3 tdgpbytpu4ex my-test.1 nginx:latest master Running Running 4 minutes ago
  4. 4 kcyvzcqwtzcl \_ my-test.1 nginx:latest master Shutdown Complete 4 minutes ago

# 当node2节点重新启动docker服务后,node2节点原有的容器不会自动调度到node2节点上只能等到其他节点出现故障或手动终止容器后,再根据内部算法重新转移task实例到其他节点上

  1. 1 [root@master ~]# docker node ls
  2. 2 [root@master ~]# docker service ps my-test

18、在swarm中使用数据卷,在个主机节点上创建数据卷,数据卷名为volume-test。三台节点都要创建数据卷。

  1. 1 [root@master ~]# docker volume create --name volume-test
  2. 2 volume-test
  3. 3 [root@master ~]# docker volume ls
  4. 4 [root@master ~]# docker volume inspect volume-test
  1. 1 [root@node1 ~]# docker volume create --name volume-test
  2. 2 volume-test
  3. 3 [root@node1 ~]# docker volume ls
  4. 4 [root@node1 ~]# docker volume inspect volume-test
  1. 1 [root@node2 ~]# docker volume create --name volume-test
  2. 2 volume-test
  3. 3 [root@node2 ~]# docker volume ls
  4. 4 [root@node2 ~]# docker volume inspect volume-test

19、在各主机节点的/var/lib/docker/volumes/volume-test/_data目录中新增index.html文件。由于该目录建立的是本地卷,即在各主机节点上建立数据卷目录(如果采用网络存储,则可以直接挂载到_data目录中),因此,新增index.html文件时只需操作一次

  1. 1 [root@master ~]# cd /var/lib/docker/volumes/volume-test/_data
  2. 2 [root@master _data]# echo "this is nginx-test in master" > index.html
  1. 1 [root@node1 ~]# cd /var/lib/docker/volumes/volume-test/_data
  2. 2 [root@node1 _data]# echo "this is nginx-test in node1" > index.html
  1. [root@node2 ~]# cd /var/lib/docker/volumes/volume-test/_data
  2. [root@node2 _data]# echo "this is nginx-test in node1" > index.html

20、创建一个副本数为3的容器swarm-nginx,挂载volume-test到容器的/usr/share/nginx/html目录中,并映射端口

  1. 1 [root@master _data]# docker service create --replicas 3 --mount type=volume,src=volume-test,dst=/usr/share/nginx/html --name swarm-nginx -p 8001:80 nginx
  2. 2 bjpef3epus72i1uxikkmwy9l9
  3. 3 overall progress: 3 out of 3 tasks
  4. 4 1/3: running [==================================================>]
  5. 5 2/3: running [==================================================>]
  6. 6 3/3: running [==================================================>]
  7. 7 verify: Service converged

# docker service create --replicas 3 --mount type=volume,src=创建的volume名字,dst=容器内目录 --name 自定义名字 -p 80:80 容器名

# src=source   dst=target

21、验证效果

  1. 1 [root@master _data]# for i in {1..10};do curl 192.168.6.3:8001;done
  2. 2 this is nginx-test in node2
  3. 3 this is nginx-test in master
  4. 4 this is nginx-test in node1
  5. 5 this is nginx-test in node2
  6. 6 this is nginx-test in master
  7. 7 this is nginx-test in node1
  8. 8 this is nginx-test in node2
  9. 9 this is nginx-test in master
  10. 10 this is nginx-test in node1
  11. 11 this is nginx-test in node2

# 至此,swarm的负载均衡功能已经启动完成。

创建swarm集群并自动编排的更多相关文章

  1. 095、如何创建Swarm集群?(Swarm02)

    参考https://www.cnblogs.com/CloudMan6/p/7862254.html   本节我们将创建三节点的swarm集群(操作系统Ubuntu 16.04 ,Docker 版本均 ...

  2. 如何创建 Swarm 集群?- 每天5分钟玩转 Docker 容器技术(95)

    本节我们将创建三节点的 swarm 集群. swarm-manager 是 manager node,swarm-worker1 和 swarm-worker2 是 worker node. 所有节点 ...

  3. Docker Swarm Mode 学习笔记(创建 Swarm 集群)

    Swarm 集群由管理节点与工作节点组成. 初始化集群 使用命令:docker swarm init 如果你的 Docker 主机有多个网卡, 拥有多个 IP 地址, 必须使用 --advertise ...

  4. docker swarm创建swarm集群

    三台linux主机 manager:192.168.100.151 work1:192.168.100.156 work2:192.168.100.157 manager docker swarm i ...

  5. centos7下安装docker(21docker swarm集群创建)

    创建swarm集群: 实验环境:盗图 swarm-manager是manager node,swarm-worker1和swarm-worker2是worker node. 所有节点的docker版本 ...

  6. Docker Swarm 集群(十七)

    目录 一.Docker Swarm 概念 1.集群 2.Docker Swarm 3.重要概念 swarm node service 二.创建 Swarm 集群 1.环境准备 2.创建 swarm 3 ...

  7. Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例

    目录 [TOC] 1.环境准备 ​ 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...

  8. 基于zookeeper的Swarm集群搭建

    简介 Swarm:docker原生的集群管理工具,将一组docker主机作为一个虚拟的docker主机来管理. 对客户端而言,Swarm集群就像是另一台普通的docker主机. Swarm集群中的每台 ...

  9. Docker Swarm——集群管理

    前言 之前在总结docker machine的时候,当时对docker理解还不够深入,甚至还不知道 docker machine 与 docker swarm 的区别. 在查阅资料以及官方文档之后,今 ...

随机推荐

  1. 在Visual C++ 6.0中无法使用gets()函数的解决办法

    问题 昨晚遇到一个有意思的问题,明明在Visual Studio 2019运行好好的C语言代码,Copy到Visual C++ 6.0中就无法编译通过了,错误提示信息如下: error C2143: ...

  2. SAP 动态选择屏幕实例

    DATA:BEGIN OF gs_sel, werks TYPE marc-werks, "工厂 matnr TYPE mara-matnr, "物料 mtart TYPE mar ...

  3. Error: $controller:ctrlreg A controller with this name is not registered.

    The controller with the name 'SomeController' is not registered.名称为'SomeController'的控制器没注册 : Descrip ...

  4. Linux远程连接工具和运行级别

    常用的Linux远程连接工具: xshell MobaXterm windows的命令行工具 Linux的运行级别 linux有七个运行级别 0----所有的服务都不开启,代表的式关机 1---代表的 ...

  5. Python教程:随机验证码生成和join 字符串

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...

  6. 一切皆为字节和字节输出流_OutputStream类&FileOutputStream类介绍

    一切皆为字节 一切文件数据(文本.图片.视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此.所以,字节流可以传输任意文件数据.在操作流的时候,我们要时刻明确,无论使用什 ...

  7. linux 运行.sh出现 Permission denied

    执行.sh脚本时提示如下错误: [root@Dolen2021 redis]# ./startRedis.sh -bash: ./startRedis.sh: Permission denied [r ...

  8. HTTPS 如何保证数据传输安全

    引言 为什么把这个作为选题. 大概也是2年前,我的同事,在面试某宇宙大厂遇到的问题与我一起探讨.这个时候我发现,虽然TLS(https)这个东西大部分时候可能不会被直接用到,但很容易被作为考察的目标范 ...

  9. Java对接拼多多开放平台API(加密上云等全流程)

    前言 本文为[小小赫下士 blog]原创,搬运请保留本段,或请在醒目位置设置原文地址和原作者. 作者:小小赫下士 原文地址:Java对接拼多多开放平台API(加密上云等全流程) 本文章为企业ERP(I ...

  10. Note -「模拟退火」

    随机化算法属于省选芝士体系 0x01 前置芝士 你只需要会 rand 就可以啦! 当然如果你想理解的更透彻也可以先看看 爬山算法 0x02 关于退火 退火是一种金属热处理工艺,指的是将金属缓慢加热到一 ...