Swarm介绍

Swarm是Docker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swarm的集群管理和编排功能。可以通过初始化Swarm或加入现有Swarm来启用Docker引擎的Swarm模式。

Docker Engine CLI和API包括了管理Swarm节点命令,比如添加,删除节点,以及在Swarm中部署和编排服务。也增加了服务栈(Stack),服务(Service),任务(Task)概念。

 

swarm特点

 

1.Docker Engine集成集群管理

使用Docker Engine CLI 创建一个Docker Engine的Swarm模式,在集群中部署应用程序服务

 

2.去中心化设计

Swarm角色分为Manager和Worker节点,Manager节点故障不影响应用使用。

 

3.扩容缩容

可以声明每个服务运行的容器数量,通过添加或删除容器数自动调整期望的状态。

 

4.期望状态协调

Swarm Manager节点不断监视集群状态,并调整当前状态与期望状态之间的差异。

 

5.多主机网络

可以为服务指定overlay网络。但初始化或更新应用程序时,Swarm manager会自动为overlay网络上的容器分配IP地址。

 

6.服务发现

Swarm manager节点为集群中的每个服务分配唯一的DNS记录和负载均衡VIP。可以通过Swarm内置的DNS服务器查询集群中每个运行的容器。

 

7.负载均衡

实现服务副本负载均衡,提供入口访问。

 

8.安全传输

Swarm中的每个节点使用TLS相互验证和加密,确保安全的其他节点通信

 

9.滚动更新

升级时,逐步将应用服务更新到节点,如果出现问题,可以将任务回滚到向前版本。

 

集群部署

 

环境部署要求

 

使用swarm前提

Docker版本1.12+

集群节点之间保证TCP 2377 (集群管理),TCP/UDP 7946 (容器网络发现)和UDP 4789 (Overlay网络)端口通信

 

节点规划

 

  1. 1.#系统环境
  2. 2.[root@docker-client ~]#/etc/redhat-release
  3. 3.CentOSLinux7.5.1804(Core)
  4. 4.[root@docker-client ~]#-r
  5. 5.3.10.0-862.3.3.el7.x86_64

主机名

IP地址

用途

Manager

192.168.200.113

swarm管理节点

Worker01

192.168.200.114

swarm工作节点

Worker02

192.168.200.115

swarm工作节点

 

三台客户端全都安装Docker-ce

 

安装依赖包

yum -y install yum-utils device-mapper-persistent-data lvm2

docker loki集群 docker集群管理_docker loki集群

 

添加docker的CE版本的yum源配置文件

curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo

ll /etc/yum.repos.d/docker-ce.repo

docker loki集群 docker集群管理_docker_02

 

安装CE版本的docker

yum -y install docker-ce

systemctl start docker #启动docker

systemctl enable docker #添加开机启动

docker version #查看docker版本

docker loki集群 docker集群管理_docker loki集群_03

 

添加docker国内镜像源

在开始学习docker之前,我们首先要更改一下docker的默认源镜像下载地址(默认是从国外下载,很慢),我们需要添加国内的源地址

vim /etc/docker/daemon.json

cat /etc/docker/daemon.json

 

  1. {
  2. "registry-mirrors":["https://registry.docker-cn.com"]
  3. }

systemctl daemon-reload

systemctl restart docker

docker loki集群 docker集群管理_html_04

 

三台都装这几个镜像

docker pull centos

docker pull nginx

docker pull nginx:1.15

docker pull nginx:1.14

docker pull nginx:1.13

docker pull nginx:1.12

docker images

docker loki集群 docker集群管理_nginx_05


docker loki集群 docker集群管理_html_06

 

DockerSwarm集群初始化与工作节点成员添加

 

初始化docker swarm管理节点

在Manager端进行如下操作

docker swarm init --advertise-addr 192.168.200.113

 

  1. Swarm:(sdib4e7xtr487nacdd12uc08h)is.#集群初始化:当前节点是一个管理节点

  2. Tothis,:#若要向该集群添加工作节点,请运行以下命令:

  3. --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu192.168.200.113:2377#docker swarm添加集群工作节点的命令字符串

  4. Tothis,'docker swarm join-token manager'and.

docker loki集群 docker集群管理_docker_07

 

在work01上

在两个工作节点进行如下操作

docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377

docker loki集群 docker集群管理_docker_08

 

在work02上

docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377

docker loki集群 docker集群管理_docker loki集群_09

 

在Manager上查看所有节点成员信息

docker node ls

 

  1. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  2. njawag7xglmaziwf8o3rg4nbu *ReadyActiveLeader18.09.1
  3. 0u5cb5jt9n1n31bq7uhbzrcj1ReadyActive18.09.1
  4. 73h26e9b9ngwxmwtj0lc5r7jbReadyActive18.09.1

docker loki集群 docker集群管理_docker_10

 

集群服务管理

 

docker swarm集群管理需要所有集群节点进行时间同步

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime --->时区亚洲

date +%F-%H-%M-%S --->查看时间

docker loki集群 docker集群管理_docker loki集群_11


docker loki集群 docker集群管理_docker loki集群_12


docker loki集群 docker集群管理_docker_13

 

查看docker service帮助信息

docker service --help

 

  1. Usage: docker service COMMAND

  2. Manage services

  3. Commands:
  4. Createnew#创建一个新服务
  5. Displayor#查看服务详细信息
  6. Fetchor#查看服务的日志
  7. List#查看服务列表
  8. Listor#查看服务的任务情况
  9. Removeor#删除一个服务
  10. Revert#服务配置回滚
  11. Scaleor#调整服务副本数
  12. Update#更新一个服务的副本资源

docker loki集群 docker集群管理_docker loki集群_14

 

集群服务的创建,查看与资源调整

 

在Manager节点上启动服务

docker service create --replicas 2 --name test centos ping www.baidu.com

 

  1. 命令说明

  2. --replicas 2:启动两个服务的副本容器
  3. --name test :服务的名字叫做test
  4. centos:启动的镜像的名字(本地没有会自动下载)
  5. ping www.baidu.com :副本里最后启动的命令进程

docker loki集群 docker集群管理_docker loki集群_15

 

查看服务的种类列表

docker service ls

docker loki集群 docker集群管理_docker_16

 

查看test服务的副本任务情况

docker service ps test

docker loki集群 docker集群管理_docker loki集群_17

 

查看test服务的详细信息--pretty test易读的方式显示

docker service inspect --pretty test

docker loki集群 docker集群管理_html_18

 

扩展服务实例数

docker service scale test=3

docker loki集群 docker集群管理_docker_19

 

查看服务列表

docker service ls

docker loki集群 docker集群管理_docker loki集群_20

 

查看具体服务副本信息

docker service ps test

docker loki集群 docker集群管理_docker_21

 

对服务的副本进行资源限制

docker service inspect --pretty test

docker service update --limit-cpu=0.5 test

docker service update --limit-memory 500M test

docker loki集群 docker集群管理_docker loki集群_22


docker loki集群 docker集群管理_docker loki集群_23

 

查看test服务详细信息

docker service inspect --pretty test

docker loki集群 docker集群管理_docker loki集群_24

 

查看服务的副本运行状态

docker service ps test

docker loki集群 docker集群管理_html_25

 

从上边我们发现服务的副本运行有停止的,我们可以通过过滤器,只查看运行状态的副本容器

docker service ps -f 'desired-state=running' test

docker loki集群 docker集群管理_nginx_26

 

集群副本的更新与回滚

 

创建nginx-test服务,并启动三个副本

docker service create --replicas 3 --name nginx-test nginx

docker loki集群 docker集群管理_nginx_27

 

查看nginx-test服务的副本运行情况

docker service ps nginx-test

docker service ls

docker loki集群 docker集群管理_docker loki集群_28

 

将服务nginx-test的副本镜像更新成nginx:1.12版

docker service update --image nginx:1.12 nginx-test

docker loki集群 docker集群管理_docker_29

 

查看服务列表

docker service ls

docker loki集群 docker集群管理_nginx_30

 

查看服务的副本运行信息

docker service ps nginx-test

docker loki集群 docker集群管理_docker_31

 

将nginx-test的副本更新回滚到上一次

docker service update --rollback nginx-test

docker loki集群 docker集群管理_docker_32

 

查看服务列表

docker service ls

docker loki集群 docker集群管理_docker_33

 

查看nginx-test服务的

docker service ps nginx-test

docker loki集群 docker集群管理_nginx_34

 

集群副本的更新策略与回滚策略

 

创建服务时设定副本的更新及回滚策略

docker service create --name my_web --replicas 10 --update-delay 10s --update-parallelism 2 --update-failure-action continue --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 nginx:1.12

 

  1. 命令说明

  2. docker service create \
  3. --name my_web \ #服务的名字
  4. --replicas 10#一共启动10个服务副本
  5. --update-delay 10s#更新时10s间隔
  6. --update-parallelism 2#更新时一次性更新两个任务
  7. --update-failure-action continue#更新失败时继续更新下一个
  8. --rollback-parallelism 2#回滚时一次性更新两个任务
  9. --rollback-monitor 20s#回滚监控20s
  10. --rollback-max-failure-ratio .2#回滚失败率20%
  11. :1.12

docker loki集群 docker集群管理_docker_35

 

查看服务列表及副本运行状况

docker service ls

docker service ps my_web

docker loki集群 docker集群管理_html_36

 

将服务my_web的副本镜像更新到nginx:1.13版

docker service ls

docker service update --image nginx:1.13 my_web

docker service ls

docker loki集群 docker集群管理_html_37

 

将服务my_web的副本更新回滚到上一个版本

docker service ls

docker service update --rollback my_web

docker service ls

docker loki集群 docker集群管理_docker_38

 

集群服务的删除

 

删除集群服务my_web

docker service ls

docker service rm my_web

docker ps -a

docker loki集群 docker集群管理_docker_39

 

查看work01容器进程

docker ps -a

docker loki集群 docker集群管理_docker_40

 

查看work02容器进程

docker ps -a

docker loki集群 docker集群管理_nginx_41

 

集群数据管理(数据持久化)

 

以volume卷挂载容器的方式启动swarm集群

docker service create --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html --replicas 3 --name test01 nginx

docker volume ls

 

  1. local-vol #数据卷有了

docker service ls

ll -d /var/lib/docker/volumes/nginx-vol

docker loki集群 docker集群管理_docker_42

 

以bind挂载容器的方式启动swarm集群

 

在三台机器上都创建目录/app/www

mkdir -p /app/www --->三台都需要创建目录

docker loki集群 docker集群管理_html_43

 

集群方式启动bind挂载容器

docker service create --mount type=bind,src=/app/www,dst=/usr/share/nginx/html --replicas 3 --name test02 nginx

docker service ls

docker service ps test02

docker loki集群 docker集群管理_docker_44

 

手动填写内容,并非交互查看容器的网页目录

echo "xin" > /app/www/xin

docker ps -a

docker exec c28 ls /usr/share/nginx/html

docker loki集群 docker集群管理_docker_45

 

以NFS挂载容器的方式启动swarm集群

 

三台机器上都安装NFS(work02作为服务端)

yum -y install nfs-utils --->三台都需要安装

mkdir -p /data/ --->work02上创建

echo "welcome to yunjisuan" > /data/index.html --->work02创建网页文件

docker loki集群 docker集群管理_docker_46

 

在work02上修改nfs配置文件

vim /etc/exports

 

  1. /data 192.168.200.0/24(rw,no_root_squash)

cat /etc/exports

systemctl start nfs

netstat -antup | grep rpcbind

showmount -e localhost

docker loki集群 docker集群管理_docker_47

 

在Manager上测试连接NFS

showmount -e 192.168.200.115

docker loki集群 docker集群管理_html_48

 

删除之前创建的容器

docker service ls

docker service rm test01

docker service rm test02

docker loki集群 docker集群管理_html_49

 

以NFS挂载容器的方式启动swarm集群

docker volume ls

 

  1. docker service create --mount 'type=volume,src=web-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/data,"volume-opt=o=addr=192.168.200.115,vers=4,soft,timeo=180,bg,tcp,rw"'--name test01 nginx

  2. 特别提示:给用一个没有创建过的卷(web-vol),要不会失败

docker service ps test01

docker volume ls

df -hT | grep data

docker loki集群 docker集群管理_docker_50

 

查看之前添加的网页文件

docker ps

docker exec 030 ls /usr/share/nginx/html

docker exec 030 cat /usr/share/nginx/html/index.html

docker loki集群 docker集群管理_nginx_51

 

将集群服务test01的node节点扩充到3个

docker service ps test01

docker service scale test01=3

docker service ps test01

docker loki集群 docker集群管理_nginx_52

 

特别提示

以自动挂载NFS共享存储的方式启动swarm集群容器,type类型只能是volume,卷的名字需要在启动时创建(启动前没有这个卷),因此创建volume的同时进行nfs共享挂载的话,需要同时创建一个opts.json的支持文件

ls /var/lib/docker/volumes/web-vol/

 

  1. _data opts.json #就是这个文件

ls /var/lib/docker/volumes/nginx-vol/

 

  1. _data #而之前创建好的volume卷没有这个文件

docker loki集群 docker集群管理_docker_53

 

集群服务发布

在之前我们所启动的所有容器,如果想要访问,那么只能通过docker exec进去看。并不能如同生产环境中一下,让用户从外部访问,那么swarm的集群服务,如果发布能让用户从外部访问的容器呢?

docker loki集群 docker集群管理_docker loki集群_54

 

启动swarm集群并暴露宿主机88端口

 

  1. docker service create --mount 'type=volume,src=web-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/data,"volume-opt=o=addr=192.168.200.115,vers=4,soft,timeo=180,bg,tcp,rw"'--name test01 -p 88:80--replicas 3 nginx

docker loki集群 docker集群管理_docker_55

 

查看swarm集群启动情况

ss -antup | grep 88

docker service ls

docker loki集群 docker集群管理_html_56

 

进行访问测试

curl 192.168.200.113:88

curl 192.168.200.114:88

curl 192.168.200.115:88

docker loki集群 docker集群管理_docker loki集群_57

 

集群统一配置管理

 

创建一个自定义的nginx.conf

vim nginx.conf

cat nginx.conf

 

  1. worker_processes 1;
  2. events {
  3. 1024;
  4. }
  5. http {
  6. .types;
  7. /octet-stream;
  8. ;
  9. 65;
  10. {
  11. 80;
  12. .yunjisuan.com;
  13. /{
  14. /usr/share/nginx/html;
  15. .html index.htm;
  16. }
  17. }
  18. }

docker loki集群 docker集群管理_docker loki集群_58

 

将配置文件加入docker config管理

docker config ls

docker config create nginx.conf nginx.conf

docker config ls

docker loki集群 docker集群管理_docker_59

 

启动集群并应用集群配置管理保存的配置文件

docker service create --name nginx --replicas 3 --config source=nginx.conf,target=/etc/nginx/nginx.conf -p 8080:80 nginx

docker loki集群 docker集群管理_nginx_60

 

查看集群节点容器的配置文件应用情况

docker service ls

docker ps

docker exec c5c cat /etc/nginx/nginx.conf

docker loki集群 docker集群管理_docker loki集群_61

 

清理服务后再次进行测试。

docker service ls

docker service rm nginx

docker loki集群 docker集群管理_docker loki集群_62

 

创建一个首页文件

vim index.html

cat index.html

 

  1. hello world!

docker config create index.html index.html

docker config ls

docker loki集群 docker集群管理_html_63

 

将docker config管理的nginx.conf和index.html都应用进集群容器

docker service create --name nginx --replicas 3 --config source=nginx.conf,target=/etc/nginx/nginx.conf --config source=index.html,target=/usr/share/nginx/html/index.html -p 8080:80 nginx

curl 192.168.200.113:8080

curl 192.168.200.114:8080

curl 192.168.200.115:8080

docker loki集群 docker集群管理_nginx_64

 

清除配置管理

docker config ls

docker config rm index.html

docker config rm nginx.conf

docker loki集群 docker集群管理_docker loki集群_65

 

Docker容器自动化方向最终架构图示详解

docker loki集群 docker集群管理_docker loki集群_66