写在前面的话

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

至此,docker 的基础知识已经了解的差不多了,接下来就来谈谈对于 docker 容器,我们如何来管理它。

 

 

docker swarm

 

在学习 docker swarm 之前,得先知道容器编排工具的作用:提供了基于容器调度和集群的技术,并编排容器之间如何进行交互。

docker swarm 不是唯一的容器编排工具,但却是 docker 自带的容器编排工具。

可以看看它的主要结构(图片来自互联网):

【09】循序渐进学 docker:docker swarm 随笔 第1张

docker swarm 以集群的形式运行,包括两个角色:Manager 和 worker。

Manager 是 swarm 的集群的核心,所以一般会有多个,而且建议是奇数个,避免出现脑裂的情况。

多个 Manager 之间通过 Raft 协议进行信息同步。

Worker 就是干活的节点,节点之间通过 GOSS 网络进行信息同步。

Service 和 Replicas:每一个应用就是一个 Service,而每一次该应用的运行就是 Replicas。

 

 

创建 docker swarm

 

准备 3 台虚拟机:

IP 主机名 说明
192.168.100.100 docker-node1 Manager
192.168.100.101 docker-node2 Worker
192.168.100.102 docker-node3 Worker

初始化 Manager 节点并将两个 Worker 节点加入:

node1 执行:

docker swarm init --advertise-addr=192.168.100.100

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第2张

复制红色部分到另外两个节点执行!

 

node2 和 node3 执行:

docker swarm join --token SWMTKN-1-4423bymu0axfzp7cr1df6jjq36d5errbhetzlg3zz722lzt2j5-4nopnics4j267mh1gidf8z7nm 192.168.100.100:2377

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第3张

 

在 node1 节点上查看 Swarm 信息:

docker node ls

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第4张

类似相关集群的命令在 Worker 节点上执行一般都会报错:

This node is not a swarm manager

 

常见错误:

1. 初始化或者加错了节点想退出:

docker swarm leave --force

 

2. node2 和 node3 加入 swarm 时候报错:

Error response from daemon: error while validating Root CA Certificate: x509: certificate has expired or is not yet valid

这种问题一般是几台服务器的时间不一致,同步下时间一般就好了:

yum -y install ntp
ntpdate -u ntp.api.bz

 

3. node2 和 node3 加入 swam 很久没反应,报错: 

connect: no route to host

这种问题一般是防火墙原因,关闭服务器的防火墙即可:

systemctl stop firewalld.service
systemctl disable firewalld.service

 

 

操作 docker swarm 

 

在 docker swarm 中,命令都是基于 service 运行,而且所有服务都是运行在 Manager 节点。

【1】创建运行容器:

docker service create --name demo busybox sh -c "while true;do sleep 300; done"

 

【2】查看运行信息:

docker service ls

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第5张

 

【3】查看该容器运行在哪个节点:

docker service ps demo

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第6张

通过 create 时候的名字查找,但这个名字并不是容器名字。

 

【4】将容器运行多个节点:

docker service scale demo=3

查看:

docker service ps demo

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第7张

可以看到,3个容器被平均分配到了各个节点。

 

【5】删除容器:

docker container rm -f a98aad768cb9

先随便删除一个容器,再查看,结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第8张

可以发现,容器在短时间内会少掉一个节点,但是随即再度恢复成 3 个节点。

docker service ps demo

查看详细信息,结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第9张

可以看到一个被 Shutdown 的容器。值得注意的是,这个容器并不存在了已经。

【09】循序渐进学 docker:docker swarm 随笔 第10张

 

【6】删除整个 Service:

docker service rm demo

结果如图,啥都不剩:

【09】循序渐进学 docker:docker swarm 随笔 第11张

 

 

实战 - docker swarm 部署 wordpress

 

注意:在做这个实战之前,最好将 3 个节点的 docker 都重启一下,确保每个节点都存在:docker_gwbridge 和 ingress 网络。

 

【1】在 Manager 节点创建 overlay 网络和 MySQL:

network create -d overlay demo

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第12张

该创建只存在于 Manager 节点。

docker service create --name mysql --env MYSQL_ROOT_PASSWORD=123456 --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql_data,destination=/var/lib/mysql mysql:5.7

和直接 docker run 有着明显的不同,-e 参数变成了 --env,-v 参数变成了 --mount。

查看创建结果:

docker service ls
docker service ps mysql

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第13张

 

【2】创建 wordpress:

docker service create --name wordpress -p 8888:80 --network demo --env WORDPRESS_DB_PASSWORD=123456 --env WORDPRESS_DB_HOST=mysql wordpress

查看结果:

【09】循序渐进学 docker:docker swarm 随笔 第14张

 

【3】访问测试:

【09】循序渐进学 docker:docker swarm 随笔 第15张

这里使用 Manager 节点的 IP 进行访问的,你也可以使用 Worker 节点的 IP 访问,三个 IP 都是没问题的。基于这一点,就可以实现很多骚操作。

同样,可以启动多个节点:

docker service scale wordpress=3

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第16张

 

 

Routing Mesh

 

为啥同一 overlay 网络中的多个容器之间能够互相通信,切访问的时候每个 IP 都能访问?

这就是 Routing Mesh,其主要的两种体现:Internal 和 Ingress。

 

Internal:容器与容器之间访问通过 overlay 网络

【1】通过创建两个容器进行测试,分别是 busybox 和 jwilder/whoami:

# 创建测试 overlay 网络
docker network create -d overlay ov-demo1

# 创建两个容器
docker service create --name busybox --network ov-demo1 busybox sh -c "while true;do sleep 3000;done"
docker service create --name whoami --network ov-demo1 -p 8000:8000 -d jwilder/whoami

# 将 whoami 创建成多个节点
docker service scale whoami=3

 

【2】进入 busybox 测试:

docker exec -it 1e68d97b6cda sh

结果如图:

【09】循序渐进学 docker:docker swarm 随笔 第17张

记住上面这个 IP。然后去查看几个 whoami 容器的 IP,都不是这个 IP。

那这个 IP 是啥?

学过 LVS 的就知道有个东西叫做 VIP,也就是虚拟 IP,而这里的原理就是 LVS 实现,而这个 IP 就是 VIP,所有才会有访问哪个 IP 都行的结果,而且负载均衡

 

Ingress: 如果服务有绑定端口,则可以通过任意节点的这个端口访问。

原理在于:当问们访问指定端口的时候,请求被 gwbridge 转发带 ingress-sbox 的 namespace 中,然后让 LVS 调度给了任意一台机器。

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄