1. Docker Swarm简介

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。

Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。

Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。

docker和wsl效率 docker swarm 网络性能_Docker

Docker Swarm 优点
任何规模都有高性能表现
灵活的容器调度
服务的持续可用性
和 Docker API 及整合支持的兼容性
Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。

docker swarm 相关概念
节点分为管理 (manager) 节点和工作 (worker) 节点
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。

 

docker和wsl效率 docker swarm 网络性能_容器_02

2.加入本地私有仓库 

[root@server1 harbor]# pwd
/root/harbor
[root@server1 harbor]# docker-compose down
[root@server1 harbor]# ./install.sh --with-chartmuseum  
 
## 配置本地解析
[root@server2 ~]# vim /etc/hosts
[root@server2 ~]# cat /etc/hosts | grep reg
172.25.26.1   server1 reg.westos.org
 
[root@server3 ~]# vim /etc/hosts
[root@server3 ~]# cat /etc/hosts | grep reg
172.25.26.1   server1 reg.westos.org
 
[root@server4 ~]# vim /etc/hosts
[root@server4 ~]# cat /etc/hosts | grep reg
172.25.26.1   server1 reg.westos.org

docker和wsl效率 docker swarm 网络性能_容器_03

 

docker和wsl效率 docker swarm 网络性能_docker和wsl效率_04

 

2.1.1 启动harbor仓库 

 

docker和wsl效率 docker swarm 网络性能_容器_05

2.1.2 配置加速器,配置证书 

 

docker和wsl效率 docker swarm 网络性能_容器_06

docker和wsl效率 docker swarm 网络性能_docker和wsl效率_07

docker和wsl效率 docker swarm 网络性能_容器_08

 

docker和wsl效率 docker swarm 网络性能_容器_09

 

docker和wsl效率 docker swarm 网络性能_运维_10

 

docker和wsl效率 docker swarm 网络性能_docker和wsl效率_11

 

3. Docker Swarm实践

3.1 创建 Swarm 集群

 

[root@server2 ~]# docker swarm init   ##集群初始化,按照初始化指令在server4和server3上部属集群
[root@server3 ~]# docker swarm join --token SWMTKN-1-1hhyo285iqajciyofbpm2x4vebwindixvrgd938i2g4t4m3ykx-e5majqnzm9kejw46bcqo6xbf9 172.25.70.2:2377
[root@server4 ~]# docker swarm join --token SWMTKN-1-1hhyo285iqajciyofbpm2x4vebwindixvrgd938i2g4t4m3ykx-e5majqnzm9kejw46bcqo6xbf9 172.25.70.2:2377
 
[root@server1 ~]# docker node ls    ##查看节点信息,这时候server1是leader
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
i2083jgww1oar2zcp0cjrct3y *   server1    Ready     Active         Leader           20.10.2
oqhphi6eej2kzbuj3f9xmrf66     server2    Ready     Active                          20.10.2
pq4s7ginji08lcu9rxh3jo7hr     server3    Ready     Active                          19.03.13
[root@server2 ~]# docker service ps webcluster  ##查看集群进程

 

docker和wsl效率 docker swarm 网络性能_容器_12

docker和wsl效率 docker swarm 网络性能_docker_13

 

3.2 容器伸缩(内部也是负载均衡的)

 

server2
 
docker node ls
docker service scale webcluster=6
docker service ps webcluster   
#可以看到给2、3、4上都分配了【动态均衡】
 
docker service scale webcluster=10
docker service ps webcluster
 
docker service scale webcluster=3
docker service ps webcluster

 

docker和wsl效率 docker swarm 网络性能_docker和wsl效率_14

3.3 添加swarm监控 

 

注意:在集群中创建service会有一个健康监测
server1:
 
docker pull dockersamples/visualizer  
#拉取镜像
 
docker tag dockersamples/visualizer:latest reg.westos.org/library/visualizer:latest  
#改名
 
docker push reg.westos.org/library/visualizer:latest   
#上传到私有仓库

 

docker和wsl效率 docker swarm 网络性能_docker_15

docker和wsl效率 docker swarm 网络性能_容器_16

 

docker和wsl效率 docker swarm 网络性能_Docker_17

server2:
 
docker service create \
>   --name=viz \
>   --publish=8080:8080/tcp \
>   --constraint=node.role==manager \
>   --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
>   visualizer
docker service ls 
docker service ps viz 
#可以看到在master端运行(端口是8080)

 

docker和wsl效率 docker swarm 网络性能_Docker_18

 网页中:http://172.25.26.2:8080/

 

docker和wsl效率 docker swarm 网络性能_docker_19

节点可以动态迁移:【高可用】
制造故障
 
server3:
docker ps
docker stop 13e4ac2129bc 
#停掉3上的webcluster
 
docker ps  
#可以看打又活过来了,会自动拉起,确保之前定义的副本数=3
 
systemctl stop docker.service 
#关闭3上的服务,让节点挂掉

 

docker和wsl效率 docker swarm 网络性能_容器_20

docker和wsl效率 docker swarm 网络性能_docker和wsl效率_21

 

docker和wsl效率 docker swarm 网络性能_运维_22

 

负载均衡 

 

systemctl start docker.service  #恢复节点
 
server2:
 
docker service ls
docker service rm webcluster  
 #删掉镜像

docker和wsl效率 docker swarm 网络性能_容器_23

 

docker和wsl效率 docker swarm 网络性能_Docker_24

 

4.测试软件myapp 

 

[root@server1 ~]# docker pull ikubernetes/myapp:v1
[root@server2 ~]# docker pull ikubernetes/myapp:v1
 
[root@server1 ~]# docker tag ikubernetes/myapp:v1  myapp:v1
[root@server2 ~]# docker tag ikubernetes/myapp:v1  myapp:v1
 
[root@server1 ~]# docker service create --name webcluster --replicas 2 -p 80:80  myapp:v1             ##部属集群
[root@server1 ~]# docker service rm my_cluster ##删除集群,此处不需要操作
[root@server1 ~]# docker service ps my_cluster  ##查看集群进程
[root@server2 ~]# docker ps           ##server2和server3进行查看
[root@server3 ~]# docker ps

 

docker和wsl效率 docker swarm 网络性能_运维_25

docker和wsl效率 docker swarm 网络性能_容器_26

 

docker和wsl效率 docker swarm 网络性能_容器_27

 

外部集群中查看(不再集群内部)
 
for i in {1..10}; do curl 172.25.26.2; done 
#可以看到都是v1
 
for i in {1..10}; do curl 172.25.26.2/hostname.html; done  
#会显示不同的主机名,是均衡的,显示的是容器id
 
for i in {1..10}; do curl 172.25.26.3/hostname.html; done 
#访问3也是负载均衡,服务在整个集群中访问任意节点都是负载均衡

 

docker和wsl效率 docker swarm 网络性能_运维_28

滚动更新 

 

docker service scale webcluster=10
 
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webcluster 
#--image 更新镜像;
--update-delay定义更新延迟(每隔5秒)
--update-parallelism设置每次更新多少个(2个)

 

docker和wsl效率 docker swarm 网络性能_容器_29

5. compose实现集群部属

5.1 自己书写compose文件,并删除原有service

5.1.1 compose文件,并删除原有service

 

docker service rm webcluster  #删掉镜像
 
vim webcluster.yml  #创建部署文件
 
docker stack deploy web -c webcluster.yml 
#stack在部署的时候自动为服务创建了网络;
-c指定文件;web是指定的名称
 
docker network ls 
#可以看到自动创建的虚拟网络
 
docker service ls   
#可以看到有三个副本数

 

[root@server2 ~]# mkdir compose
[root@server2 ~]# cd compose/
[root@server2 compose]# ls
[root@server2 compose]# vim docker-compose.yml
[root@server2 compose]# cat docker-compose.yml 
version: "3.9"
services:
 
  web:
    image: myapp:v1
    networks:
      - mynet
    deploy:
      replicas: 6
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  visualizer:
    image: visualizer:latest
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"
 
networks:
  mynet:
 
 
[root@server2 compose]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                             PORTS
jweqsk25yutr   my_web    replicated   3/3        myapp:v2                          *:80->80/tcp
6s15kzvlcdph   viz       replicated   1/1        dockersamples/visualizer:latest   *:8080->8080/tcp
[root@server2 compose]# docker service rm viz 
viz
[root@server2 compose]# docker service rm my_web 
my_web
[root@server2 compose]# docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS

 

docker和wsl效率 docker swarm 网络性能_docker_30

 

docker和wsl效率 docker swarm 网络性能_容器_31

 

docker和wsl效率 docker swarm 网络性能_容器_32

 

docker和wsl效率 docker swarm 网络性能_运维_33

 

docker和wsl效率 docker swarm 网络性能_docker_34

 

docker和wsl效率 docker swarm 网络性能_运维_35

 

docker和wsl效率 docker swarm 网络性能_容器_36