如果文章内容看不懂,最后有个小实验可以了解一下

docker swarm集群:三剑客之一

准备:

docker01 docker02 docker03
192.168.1.10 192.168.1.20 192.168.1.30
myvisualizer.tar nginx.tar nginx.tar
nginx.tar

关闭防火墙,禁用selinux,3台dockerhost区别主机名,时间同步

[root@docker01 ~]# systemctl stop firewalld

[root@docker01 ~]# systemctl disable firewalld

[root@docker01 ~]# setenforce 0

时间同步:

mv /etc/localtime/etc/localtime. bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime

docker版本必须是:v1.12版本开始。

[root@docker01 ~]# docker -v
Docker version 18.09.0, build 4d60db4

每台添加域名解析:

[root@docker01 ~]# vim /etc/hosts

192.168.1.10 docker01
192.168.1.20 docker02
192.168.1.30 docker03

Swarm:作用运行docker engin(引擎)的多个主机组成的集群。

node:每一个docker engin都是一个(node)节点,分为manager和worker。

​ manager node:负责执行编排和集群的管理工作,保持并维护swarm处于期望的状态。swram可以有多个manager node,他们会自动协商并选举一个Leader执行编排任务。但相反,不能没有manager node。

​ worker node:接受并执行manager node派发的任务,并且默认manager node也是一个worker node,不过可以将它设置为manager-only node,让它只负责编排和管理工作。

service:用来定义worker上执行的命令。

1)初始化集群

docker初始化:

[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.10 

//--advertis-addr:指定其他node通信的地址。

Dcoker swarm_第1张图片

上面返回的结果告诉我们:初始化成功,并且,如果想要添加work节点运行下面的命令

docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-e6onamnuj4nck4bw8k294ujnn 192.168.1.10:2377

PS:这里注意,token只有24小时的有效期。

如果想要添加manager节点,运行下边的命令:

docker swarm join-token manager

docker02和docker03运行:

[root@docker02 ~]# docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-e6onamnuj4nck4bw8k294ujnn 192.168.1.10:2377

当其他两个节点加入成功之后,我们可以用 docker node ls查看节点信息

docker01查看:

[root@docker01 ~]# docker node ls

Dcoker swarm_第2张图片

PS:

*:当前所在终端

Ready:准备报,可以进行工作

Active:正在运行中

dokcer02和docker03操作:

docker swarm leave :申请离开一个集群(自动离职),之后查看节点状态会变成down,然后可以通过manager node将其删除。

自动离职:

[root@docker02 ~]# docker swarm leave 
Node left the swarm.

docker01上操作:

docker node rm xxx:删除某个节点(开除)。

开除:

[root@docker01 ~]# docker node  rm docker02
docker02
[root@docker01 ~]# docker node  rm docker03
docker03

基本操作命令:

docker swarm join-token [manager| worker]:生成令牌,可以是manager身份或worker身份。

[root@docker01 ~]# docker swarm join-token manager 
To add a manager to this swarm, run the following command:

docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-ca100vimkqxp3d2ka30o2y0fi 192.168.1.10:2377

docker02和docker03上操作:

[root@docker03 ~]#     docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-ca100vimkqxp3d2ka30o2y0fi 192.168.1.10:2377
This node joined a swarm as a manager.

docker node demote (降职):将此swram节点的manager

降级为work.

docker node promote (升职):将swarm节点的work升级为manager.

docker01上操作:

[root@docker01 ~]# docker node demote docker02
Manager docker02 demoted in the swarm.
[root@docker01 ~]# docker node demote docker03
Manager docker03 demoted in the swarm.
[root@docker01 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
kzwsrnrij3gauh9kkzio2ktab *   docker01            Ready               Active              Leader              18.09.0
c39620kukfj2lgjm53yw7srq5     docker02            Ready               Active                                  18.09.0
mtghji5h1muwrxrb1j174u66p     docker03            Ready               Active                                  18.09.0

2)部署docker swarm集群网络

overlay:覆盖型网络。

docker01操作:

[root@docker01 ~]# docker network create -d overlay --attachable docker
sfot05jf5hkjjdx1el56ffc9e

//attachble:这个参数必须要加,否则不能用于容器。

在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因为docker swarm自带存储。

3)部署一个图形化webUI界面。

docker01导入myvisualizer.tar镜像

[root@docker01 ~]# docker load < myvisualizer.tar 

[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer

然后可以通过浏览器访问验证:

Dcoker swarm_第3张图片

如果网页访问不到,需要开启路由转发:

[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 

[root@docker01 ~]# sysctl -p
net.ipv4.ip_forward = 1

4)创建service

三台docker都操作

[root@docker01 ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx:latest

//--replicas:副本数量。

大概可以理解为:一个副本等于一个容器。

//查看service:

[root@docker01 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ivihvmk98bz5        web1                replicated          1/1                 nginx:latest        *:80->80/tcp

//查看service信息:

[root@docker01 ~]# docker service ps web1 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
w9u7bun0cg1f        web1.1              nginx:latest        docker03            Running             Running 4 minutes ago    

//创建5个容器:

[root@docker01 ~]# docker service create --replicas 5 --network docker --name web -p 80 nginx:latest

Dcoker swarm_第4张图片

将docker02挂起后:

Dcoker swarm_第5张图片

将docker03挂起后:都到docker01上

Dcoker swarm_第6张图片

但是当docker02和docker03启动后,工作也回不去

Dcoker swarm_第7张图片

//删除容器:

[root@docker01 ~]# docker service rm web1
web1

//增加或减少容器:

[root@docker01 ~]# docker service scale web=8

//设置manager node不参加工作:

[root@docker01 ~]# docker node update --availability drain docker01
docker01

5)搭建私有仓库

docker pull registry:2

docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2 

docker pull busybox

docker tag busybox:latest 192.168.1.10:5000/busybox

vim /usr/lib/systemd/system/docker.service 

13行:

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.10:5000

systemctl daemon-reload 

systemctl restart docker

 docker push 192.168.1.10:5000/busybox:latest 

6)自定义镜像

要求:基于httpd镜像,更改主访问界面内容,镜像tag版本为v1,v2,v3,对应主机面内容为111,222,333.

[root@docker01 ~]# mkdir {v1,v2,v3}
[root@docker01 v1]# cd
[root@docker01 ~]# cd v1/
[root@docker01 v1]# cat index.html 
1111111111111111111                          ##另外v2,v3为222 222
[root@docker01 v1]# cat Dockerfile 
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html
[root@docker01 v1]# docker build -t 192.168.1.10:5000/httpd:v1 .
[root@docker01 v1]# docker push 192.168.1.10:5000/httpd:v1

7)发布一个服务,基于上述镜像

要求:副本数量为3个。服务的名称为:bdqn.

[root@docker01 v1]# docker service create --replicas 3 --name bdqn -p 80:80 192.168.1.10:5000/httpd:v1

PS:到docker02和docker03用docker service ls查看一下,是否一共有三台bdqn!!!

互联网访问都是这个界面:
Dcoker swarm_第8张图片

docker02:

[root@docker02 ~]# docker exec -it 915bb2da7d43 /bin/bash
root@915bb2da7d43:/usr/local/apache2# cd htdocs/
root@915bb2da7d43:/usr/local/apache2/htdocs# echo 12345 > index.html 

[root@docker02 ~]# curl 127.0.0.1
54321

docker03:

[root@docker03 ~]# docker exec -it bdqn.1.kaksxkdur0fhypukm8q2zms3i /bin/bash
root@31c5f6af1259:/usr/local/apache2# cd htdocs/
root@31c5f6af1259:/usr/local/apache2/htdocs# echo 54321 > index.html 
root@31c5f6af1259:/usr/local/apache2/htdocs# exit
exit
[root@docker03 ~]# curl 127.0.0.1
54321

之后验证:

[root@docker01 ~]# curl 127.0.0.1
1111111111111111111
[root@docker01 ~]# curl 127.0.0.1
12345
[root@docker01 ~]# curl 127.0.0.1
54321

默认的ingress网络,包括创建的自定义overlay网络,为后端真正为用户提供服务的container,提供了一个统一的入口。

服务的扩容与缩容

[root@docker01 ~]# docker service create --replicas 3 --name test -p 80 192.168.1.10:5000/httpd:v1

随即映射端口范围30000-32767

[root@docker01 ~]# docker service scale bdqn=6

扩容与缩容可以直接通过scale进行设置副本数量。

服务的升级与回滚

升级操作

[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd:v2 bdqn

//平滑的更新。

[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd:v3 --update-parallelism 2 --update-delay 1m bdqn

PS:默认情况下,swarm一次只更新一个副本,并且两个副本之间没有等待时间,我们可以通过--update-parallelism设置并行更新的副本数量。

--update-delay:指定滚动更新的时间间隔。

回滚操作

[root@docker01 ~]# docker service rollback bdqn 

PS:注意docker swarm的回滚操作,默认只能回滚到上一次操作的状态,并不能连续回滚操作。

小实验:
3台docker:
docker01 docker02 docker03
192.168.1.10 192.168.1.20 192.168.1.30
193.
部署一个swarm集群,要求3台dockerhost,docker01为manager node,02和03为worker node.
三台docker都做:
DNS域名解析
[root@docker01 ~]# vim /etc/hosts

192.168.1.10 docker01
192.168.1.20 docker02
192.168.1.30 docker03

初始化:
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.10

docker02加入群集:
[root@docker02 ~]# docker swarm join --token SWMTKN-1-3rtvbfgl70u9fndd02kazcne3ib7zqzfhrx7v1ty2ebmod4ex6-2xe4chwto2m04mcwcn601zn54 192.168.1.10:2377

docker03加入群集:
[root@docker03 ~]# docker swarm join --token SWMTKN-1-3rtvbfgl70u9fndd02kazcne3ib7zqzfhrx7v1ty2ebmod4ex6-2xe4chwto2m04mcwcn601zn54 192.168.1.10:2377

[root@docker01 ~]# docker node ls
Dcoker swarm_第9张图片

需要myvisualizer.tar镜像,可以从网上找
将myvisualizer.tar导入docker镜像:
[root@docker01 ~]# docker load < myvisualizer.tar

运行myvisualizer.tar
[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer

访问验证:
Dcoker swarm_第10张图片

部署一个servcie服务,要求使用httpd镜像,名称为test.要求8个副本数量。并且swarm集群要求:manager 节点不参加工作。

需要httpd.tar包,可从网上下载
将httpd.tar导入docker镜像:
[root@docker01 ~]# docker load < httpd.tar

创建一个名叫docker,网卡类型为overlay的网卡:
[root@docker01 ~]# docker network create -d overlay --attachable docker

使用httpd镜像创建8台网卡为docker的test容器:
[root@docker01 ~]# docker service create --replicas 8 --network docker --name test -p 80 httpd:latest
验证
Dcoker swarm_第11张图片

使docker01不参加工作
[root@docker01 ~]# docker node update --availability drain docker01
docker01
验证:
Dcoker swarm_第12张图片