Docker Swarm容器集群管理

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 ~]# cat /etc/redhat-release
  3. 3.CentOS Linux release 7.5.1804 (Core)
  4. 4.[root@docker-client ~]# uname -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 Swarm容器集群管理

 

添加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 Swarm容器集群管理

 

安装CE版本的docker

yum -y install docker-ce

systemctl start docker #启动docker

systemctl enable docker #添加开机启动

docker version #查看docker版本

Docker Swarm容器集群管理

 

添加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 Swarm容器集群管理

 

三台都装这几个镜像

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 Swarm容器集群管理


Docker Swarm容器集群管理

 

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

 

初始化docker swarm管理节点

在Manager端进行如下操作

docker swarm init --advertise-addr 192.168.200.113

 
  1. Swarm initialized: current node (sdib4e7xtr487nacdd12uc08h) is now a manager. #集群初始化:当前节点是一个管理节点
  2. To add a worker to this swarm, run the following command: #若要向该集群添加工作节点,请运行以下命令:
  3. docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377 #docker swarm添加集群工作节点的命令字符串
  4. To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Docker Swarm容器集群管理

 

在work01上

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

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

Docker Swarm容器集群管理

 

在work02上

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

Docker Swarm容器集群管理

 

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

docker node ls

 
  1. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  2. njawag7xglmaziwf8o3rg4nbu * manager Ready Active Leader 18.09.1
  3. 0u5cb5jt9n1n31bq7uhbzrcj1 worker01 Ready Active 18.09.1
  4. 73h26e9b9ngwxmwtj0lc5r7jb worker02 Ready Active 18.09.1

Docker Swarm容器集群管理

 

集群服务管理

 

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

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

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

Docker Swarm容器集群管理


Docker Swarm容器集群管理


Docker Swarm容器集群管理

 

查看docker service帮助信息

docker service --help

 
  1. Usage: docker service COMMAND
  2. Manage services
  3. Commands:
  4. create Create a new service #创建一个新服务
  5. inspect Display detailed information on one or more services #查看服务详细信息
  6. logs Fetch the logs of a service or task #查看服务的日志
  7. ls List services #查看服务列表
  8. ps List the tasks of one or more services #查看服务的任务情况
  9. rm Remove one or more services #删除一个服务
  10. rollback Revert changes to a services configuration #服务配置回滚
  11. scale Scale one or multiple replicated services #调整服务副本数
  12. update Update a service #更新一个服务的副本资源

Docker Swarm容器集群管理

 

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

 

在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 Swarm容器集群管理

 

查看服务的种类列表

docker service ls

Docker Swarm容器集群管理

 

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

docker service ps test

Docker Swarm容器集群管理

 

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

docker service inspect --pretty test

Docker Swarm容器集群管理

 

扩展服务实例数

docker service scale test=3

Docker Swarm容器集群管理

 

查看服务列表

docker service ls

Docker Swarm容器集群管理

 

查看具体服务副本信息

docker service ps test

Docker Swarm容器集群管理

 

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

docker service inspect --pretty test

docker service update --limit-cpu=0.5 test

docker service update --limit-memory 500M test

Docker Swarm容器集群管理


Docker Swarm容器集群管理

 

查看test服务详细信息

docker service inspect --pretty test

Docker Swarm容器集群管理

 

查看服务的副本运行状态

docker service ps test

Docker Swarm容器集群管理

 

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

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

Docker Swarm容器集群管理

 

集群副本的更新与回滚

 

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

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

Docker Swarm容器集群管理

 

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

docker service ps nginx-test

docker service ls

Docker Swarm容器集群管理

 

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

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

Docker Swarm容器集群管理

 

查看服务列表

docker service ls

Docker Swarm容器集群管理

 

查看服务的副本运行信息

docker service ps nginx-test

Docker Swarm容器集群管理

 

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

docker service update --rollback nginx-test

Docker Swarm容器集群管理

 

查看服务列表

docker service ls

Docker Swarm容器集群管理

 

查看nginx-test服务的

docker service ps nginx-test

Docker Swarm容器集群管理

 

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

 

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

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. nginx:1.12

Docker Swarm容器集群管理

 

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

docker service ls

docker service ps my_web

Docker Swarm容器集群管理

 

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

docker service ls

docker service update --image nginx:1.13 my_web

docker service ls

Docker Swarm容器集群管理

 

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

docker service ls

docker service update --rollback my_web

docker service ls

Docker Swarm容器集群管理

 

集群服务的删除

 

删除集群服务my_web

docker service ls

docker service rm my_web

docker ps -a

Docker Swarm容器集群管理

 

查看work01容器进程

docker ps -a

Docker Swarm容器集群管理

 

查看work02容器进程

docker ps -a

Docker Swarm容器集群管理

 

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

 

以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 nginx-vol #数据卷有了

docker service ls

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

Docker Swarm容器集群管理

 

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

 

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

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

Docker Swarm容器集群管理

 

集群方式启动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 Swarm容器集群管理

 

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

echo "xin" > /app/www/xin

docker ps -a

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

Docker Swarm容器集群管理

 

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

 

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

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

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

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

Docker Swarm容器集群管理

 

在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 Swarm容器集群管理

 

在Manager上测试连接NFS

showmount -e 192.168.200.115

Docker Swarm容器集群管理

 

删除之前创建的容器

docker service ls

docker service rm test01

docker service rm test02

Docker Swarm容器集群管理

 

以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 Swarm容器集群管理

 

查看之前添加的网页文件

docker ps

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

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

Docker Swarm容器集群管理

 

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

docker service ps test01

docker service scale test01=3

docker service ps test01

Docker Swarm容器集群管理

 

特别提示

以自动挂载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 Swarm容器集群管理

 

集群服务发布

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

Docker Swarm容器集群管理

 

启动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 Swarm容器集群管理

 

查看swarm集群启动情况

ss -antup | grep 88

docker service ls

Docker Swarm容器集群管理

 

进行访问测试

curl 192.168.200.113:88

curl 192.168.200.114:88

curl 192.168.200.115:88

Docker Swarm容器集群管理

 

集群统一配置管理

 

创建一个自定义的nginx.conf

vim nginx.conf

cat nginx.conf

 
  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. server {
  11. listen 80;
  12. server_name www.yunjisuan.com;
  13. location / {
  14. root /usr/share/nginx/html;
  15. index index.html index.htm;
  16. }
  17. }
  18. }

Docker Swarm容器集群管理

 

将配置文件加入docker config管理

docker config ls

docker config create nginx.conf nginx.conf

docker config ls

Docker Swarm容器集群管理

 

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

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

Docker Swarm容器集群管理

 

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

docker service ls

docker ps

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

Docker Swarm容器集群管理

 

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

docker service ls

docker service rm nginx

Docker Swarm容器集群管理

 

创建一个首页文件

vim index.html

cat index.html

 
  1. hello world!

docker config create index.html index.html

docker config ls

Docker Swarm容器集群管理

 

将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 Swarm容器集群管理

 

清除配置管理

docker config ls

docker config rm index.html

docker config rm nginx.conf

Docker Swarm容器集群管理

 

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

Docker Swarm容器集群管理

上一篇:SQLite Expert安装与注册


下一篇:推荐系统(5)—— 推荐系统多目标优化 ESMM-MMOE