GVKun编程网logo

Docker Swarm 容器集群管理(docker swarm集群部署)

5

在本文中,我们将为您详细介绍DockerSwarm容器集群管理的相关知识,并且为您解答关于dockerswarm集群部署的疑问,此外,我们还会提供一些关于29.dockerswarm创建三个节点swa

在本文中,我们将为您详细介绍Docker Swarm 容器集群管理的相关知识,并且为您解答关于docker swarm集群部署的疑问,此外,我们还会提供一些关于29. docker swarm 创建 三个节点 swarm 的集群、Docker (二十一)-Docker Swarm 集群部署、docker + swarm 集群、Docker 1.12 以前的: swarm 搭建 docker 集群的有用信息。

本文目录一览:

Docker Swarm 容器集群管理(docker swarm集群部署)

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

image_1d0ua0uh3pgs1i9n1oh63gtf5e9.png-151.6kB

 

添加 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

image_1d0ua2912do88vf1mel9ul1nf11m.png-30.2kB

 

安装 CE 版本的 docker

yum -y install docker-ce

systemctl start docker #启动 docker

systemctl enable docker #添加开机启动

docker version #查看 docker 版本

image_1d0uan31l1djd1f6v16jgc0m1lvg23.png-127.4kB

 

添加 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

image_1d0uap5rbrib1vub1jvunvgm672g.png-23.4kB

 

三台都装这几个镜像

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

image_1d0uavddc11ah1mjn1l1t72gh632t.png-126kB


image_1d0uavun71vncpem130lkbn1u0p3a.png-34.4kB

 

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.

image_1d0ub8qlv15m315ru1dcupshm2444.png-38.3kB

 

在 work01 上

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

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

image_1d0ub9j8p1er9mkr1ikmruf1n5d4h.png-21.2kB

 

在 work02 上

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

image_1d0ub9q501vdmgcv1sgu15avqrd4u.png-21.6kB

 

在 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

image_1d0ubag651rcj1c0p2482n31gf35b.png-29.4kB

 

集群服务管理

 

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

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

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

image_1d0uet4vvg8jp4a9j14cj1frt5o.png-22.6kB


image_1d0uethfb19snt7019irva01hdh65.png-23.8kB


image_1d0uetphc7ambn51j3n1e3l1fnk6i.png-24.2kB

 

查看 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 #更新一个服务的副本资源

image_1d0ueu7lt1jvqfv2u2j1fdaokk6v.png-41.5kB

 

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

 

在 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 :副本里最后启动的命令进程

image_1d0ui339q1v8h1f141t8m1jd3tv57c.png-22.3kB

 

查看服务的种类列表

docker service ls

image_1d0ui3gfpkqh3i55kh18l886j7p.png-16.8kB

 

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

docker service ps test

image_1d0ui451m108a13unig1fj8d86.png-24.5kB

 

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

docker service inspect --pretty test

image_1d0ui4s9dteu14ulaj11p2p1hij8j.png-60.7kB

 

扩展服务实例数

docker service scale test=3

image_1d0ui5u7e1rl58641revvq2ghr90.png-20.8kB

 

查看服务列表

docker service ls

image_1d0ui69ouqn11bja2njlj61mn9d.png-16.7kB

 

查看具体服务副本信息

docker service ps test

image_1d0ui6tc43hij8q6f1dr91q319q.png-29kB

 

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

docker service inspect --pretty test

docker service update --limit-cpu=0.5 test

docker service update --limit-memory 500M test

image_1d0ui85osr8i1nrc1r6m1iuobj6an.png-61.5kB


image_1d0ui9tfeefk1nt21efr1iav1uj9b4.png-20.9kB

 

查看 test 服务详细信息

docker service inspect --pretty test

image_1d0uiailp1occ19f31ng41se95rhbh.png-79.1kB

 

查看服务的副本运行状态

docker service ps test

image_1d0uib5ek3dpv7qmd0p911ma3bu.png-45.4kB

 

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

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

image_1d0uibnunm80150d12jv1atr4jkcb.png-30.6kB

 

集群副本的更新与回滚

 

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

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

image_1d0uif1nu2s5llq8ontdu15aaco.png-23.1kB

 

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

docker service ps nginx-test

docker service ls

image_1d0uigtkt1nk1k1q17a27gjibddi.png-44.2kB

 

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

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

image_1d0uii76u28nqhn1c115ukpcddv.png-21.2kB

 

查看服务列表

docker service ls

image_1d0uiicqack856v1vtov9rdtkec.png-20.7kB

 

查看服务的副本运行信息

docker service ps nginx-test

image_1d0uija7p1bh1cnpb76f6q1jg6ep.png-45.6kB

 

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

docker service update --rollback nginx-test

image_1d0uikctl18gs1ai31reg1154niif6.png-24.1kB

 

查看服务列表

docker service ls

image_1d0uikltu5me9tgcv6etv1t2ofj.png-21.7kB

 

查看 nginx-test 服务的

docker service ps nginx-test

image_1d0uilc68knn11ve14om18q61enog0.png-61.5kB

 

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

 

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

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

image_1d0uje72t1avevjdk138ui1pi7gd.png-52.4kB

 

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

docker service ls

docker service ps my_web

image_1d0ujer401vj71m8b1k95dss1hkigq.png-84.4kB

 

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

docker service ls

docker service update --image nginx:1.13 my_web

docker service ls

image_1d0ujiqg8qabd013tn4c2eb6hn.png-73.8kB

 

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

docker service ls

docker service update --rollback my_web

docker service ls

image_1d0ujknv5166h9pvg8s1sq11924i4.png-75.5kB

 

集群服务的删除

 

删除集群服务 my_web

docker service ls

docker service rm my_web

docker ps -a

image_1d0ujntic1ou313ij62jj6it7cih.png-70.7kB

 

查看 work01 容器进程

docker ps -a

image_1d0ujo5lv1bq812o3vh1fec179aiu.png-15.6kB

 

查看 work02 容器进程

docker ps -a

image_1d0ujod1e11f41pgs1sqais81pqujb.png-15.8kB

 

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

 

以 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

image_1d10jvlemicj1vaohjqc4dvfq9.png-74.8kB

 

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

 

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

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

image_1d10kfopqera1i9110k51s78ng59.png-12.6kB

 

集群方式启动 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

image_1d10kj2p8152jeh15ojtvv1ecfm.png-88.3kB

 

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

echo "xin" > /app/www/xin

docker ps -a

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

image_1d10knen1iomscjmhvplvu7513.png-54.7kB

 

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

 

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

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

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

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

image_1d10l5fbmqqgseg1p75nh3h0320.png-209.5kB

 

在 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

image_1d10la4clgj71op2fad1qg01oqa2d.png-67.4kB

 

在 Manager 上测试连接 NFS

showmount -e 192.168.200.115

image_1d10lar26181t1iu3kic18p4jka2q.png-21.5kB

 

删除之前创建的容器

docker service ls

docker service rm test01

docker service rm test02

image_1d10lrugocr3pgv1bv21gd11bvv37.png-41kB

 

以 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

image_1d10oljkj1d6lnvt17jlt8s9d03k.png-93kB

 

查看之前添加的网页文件

docker ps

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

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

image_1d10ot9ul1585sq21eqr10mejt4r.png-49.6kB

 

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

docker service ps test01

docker service scale test01=3

docker service ps test01

image_1d10onhj68t1bfrp17a8dj9441.png-80kB

 

特别提示

以自动挂载 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卷没有这个文件

image_1d10ooc3uhkv72u1tuh1s081nga4e.png-22.5kB

 

集群服务发布

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

image_1cv28g663194ufsg1n9a15c71ba79.png-186.2kB

 

启动 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

image_1d10pc41211un11lt1vo212iq16q258.png-48.5kB

 

查看 swarm 集群启动情况

ss -antup | grep 88

docker service ls

image_1d10pcvod9pa1kscvqs6trbr45l.png-41.6kB

 

进行访问测试

curl 192.168.200.113:88

curl 192.168.200.114:88

curl 192.168.200.115:88

image_1d10pdhvqsof1hnb1ml1bf77r862.png-33kB

 

集群统一配置管理

 

创建一个自定义的 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. }

image_1d10r1v4v6ki14bf1no0g3f13bp6s.png-49kB

 

将配置文件加入 docker config 管理

docker config ls

docker config create nginx.conf nginx.conf

docker config ls

image_1d10r3a3m1cmrb071hn1gduuu679.png-43kB

 

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

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

image_1d10r3ucj17hf79818llrub1dvs7m.png-38.1kB

 

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

docker service ls

docker ps

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

image_1d10r69ecmkt1o5ap36130g1s7c83.png-103.7kB

 

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

docker service ls

docker service rm nginx

image_1d10r7lks1ipilef1c6pqmorv58g.png-42kB

 

创建一个首页文件

vim index.html

cat index.html

 
  1. hello world!

docker config create index.html index.html

docker config ls

image_1d10r9814andtdsk85jka14cl8t.png-52.2kB

 

将 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

image_1d10ravc61u37ohd1gdd18ao168n9a.png-65.9kB

 

清除配置管理

docker config ls

docker config rm index.html

docker config rm nginx.conf

image_1d10rd4tva731gpb1ado1e9e16n39n.png-47.9kB

 

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

image_1d10qkj3l11ap1s721e1o631m3o6f.png-353.5kB

29. docker swarm 创建 三个节点 swarm 的集群

29. docker swarm 创建 三个节点 swarm 的集群

1.使用 vagrant 部署 三台 centos/7 的 环境

###Vagrantfile

# -*- mode: ruby -*-

# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [

    {

            :name=>"docker-host",

            :eth1=>"192.168.205.10",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8888"

    },

    {

            :name=>"docker-node1",

            :eth1=>"192.168.205.11",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8889"

    },

    {

            :name=>"docker-node2",

            :eth1=>"192.168.205.12",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8890"

    }

]

Vagrant.configure(2) do |config|

config.vm.box = "centos/7"

boxes.each do |opts|

config.vm.define opts[:name] do |config|

config.vm.hostname = opts[:name]

config.vm.network "forwarded_port", guest: 80, host: opts[:port]

config.vm.provider "vmware_fusion" do |v|

v.vmx["memsize"] = opts[:mem]

v.vmx["numvcpus"] = opts[:cpu]

end

config.vm.provider "virtualbox" do |v|

v.customize ["modifyvm", :id, "--memory", opts[:mem]]

v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]

end

config.vm.network :private_network, ip: opts[:eth1]

end

end

config.vm.synced_folder "./labs", "/home/vagrant/labs"

config.vm.provision "shell", privileged: true, path: "./setup.sh"

end

 

2.编写 setup.sh

 

###setup.sh

 

#/bin/sh

# install some tools

sudo yum install -y wget

sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak

sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

sudo yum makecache

sudo yum -y update

sudo yum install -y git vim gcc glibc-static telnet bridge-utils

# install docker

curl -fsSL get.docker.com -o get-docker.sh

sh get-docker.sh

# start docker service

sudo groupadd docker

sudo usermod -aG docker vagrant

sudo systemctl start docker

rm -rf get-docker.sh

sudo tee /etc/docker/daemon.json <<-''EOF''

{

"registry-mirrors": ["https://v2ltjwbg.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

docker version

 

3.创建labs 文件夹 并启动容器

  mkdir  lables

  vagrant up

4. 进去 host 节点

  vagrant ssh docker-host

  声明 manager 节点

  docker swarm init --advertise-addr=192.168.205.10

  只需要 在其他节点运行这段代码 即可 进入这个节点

5. 进入node1节点 并 加入 swarm 集群

  进入docker-node1 节点

    vagrant ssh docker-node1

  运行刚刚生成的代码即可加入 swarm 集群

    docker swarm join --token SWMTKN-1-29cjw98xafo5454juq28ldear34aafbp1n616wilrnjl0q92jz-dt02qoe4nhe98mf6jon9rukca 192.168.205.10:2377

  在 host 节点查看集群节点情况

    docker-host 下

    docker node ls

  docker-node2 节点同理

 

6. 在 docker-machine 上进行 swarm 安装

  docker-machine create swarm-manager

  docker-machine create swarm-node1

  docker-machine create swarm-node2

  同理 加入

7. 在 labs.play-with-docker.com

  常见三个虚拟主机即可运行上面的命令即可

Docker (二十一)-Docker Swarm 集群部署

Docker (二十一)-Docker Swarm 集群部署

介绍

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

Swarm 是目前 Docker 官方唯一指定(绑定)的集群管理工具。Docker 1.12 内嵌了 swarm mode 集群管理模式。

Swarm 关键概念

1)Swarm

集群的管理和编排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化时启动 swarm 模式或者加入已存在的 swarm

2)Node

一个节点 (node) 是已加入到 swarm 的 Docker 引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着 Manager

管理节点调度任务到 worker 节点,manager 节点还执行维护集群的状态的编排和群集管理功能,worker 节点接收并执行来自

manager 节点的任务。通常,manager 节点也可以是 worker 节点,worker 节点会报告当前状态给 manager 节点

3)服务(Service)

服务是要在 worker 节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像

4)任务(Task)

任务是在 docekr 容器中执行的命令,Manager 节点根据指定数量的任务副本分配任务给 worker 节点

docker swarm:集群管理,子命令有 init, join, leave, update。(docker swarm –help 查看帮助)

docker service:服务创建,子命令有 create, inspect, update, remove, tasks。(docker service–help 查看帮助)

docker node:节点管理,子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。(docker node –help 查看帮助)

node 是加入到 swarm 集群中的一个 docker 引擎实体,可以在一台物理机上运行多个 node,node 分为:manager nodes 管理节点,worker nodes 工作节点。

 一、系统环境

  1)服务器环境

节点名称 IP 操作系统 内核版本
manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64

  2)前提条件

  • Docker 版本 1.12+
  • 集群节点之间保证 TCP 2377、TCP/UDP 7946 和 UDP 4789 端口通信   

    TCP 端口 2377 集群管理端口

    TCP 与 UDP 端口 7946 节点之间通讯端口

    TCP 与 UDP 端口 4789 overlay 网络通讯端口

二、集群部署

  1)master 创建 Swarm(要保存初始化后 token,因为在节点加入时要使用 token 作为通讯的密钥)  

1
2
3
4
5
6
7
8
[root@master ~] # docker swarm init --advertise-addr 172.16.60.95
Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6)  is  now a manager.
 
To add a worker to this swarm, run the following command:
 
     docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377
 
To add a manager to this swarm, run  ''docker swarm join-token manager''  and  follow the instructions. 

  注:上面命令执行后,该机器自动加入到 swarm 集群。这个会创建一个集群 token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个 token 值。 其中,--advertise-addr 参数表示其它 swarm 中的 worker 节点使用此 ip 地址与 manager 联系。命令的输出包含了其它节点如何加入集群的命令。

  使用 docker info 或者 docker node ls 查看集群中的相关信息 

1
2
3
4
5
6
7
8
9
10
11
12
13
docker info
 
.......
Swarm: active
  NodeID: kfi2r4dw6895z5yvhlbyzfck6
  Is Manager: true
  ClusterID: y2zgs373cg0y6559t675yexcj
  Managers:  1
  Nodes:  1
  Orchestration:
   Task History Retention Limit:  5
 
.......

  

  2)添加节点到 swarm 集群中

  所有节点执行 

1
docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377

  在 master 上查看集群节点的状态

  

   到此 Swarm 集群就创建好了

  3)docker  node 命令 

[root@master ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Options:


Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node


# demote
   将管理节点降级为普通节点
# inspect
    查看节点的详细信息
# ls
   列出节点
# promote
   将普通节点升级为管理节点
# ps
   查看运行的任务
# rm
   从swarm集群中删除节点
# update
   改变集群节点状态
[root@master ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
      --availability string   Availability of the node ("active"|"pause"|"drain")
      --label-add list        Add or update a node label (key=value)
      --label-rm list         Remove a node label if exists
      --role string           Role of the node ("worker"|"manager")


# 主要使用availability string

# active
    节点状态正常
# pause
    节点挂起、暂停
# drain
    排除节点,比如将master节点排除,不分配任务,只作为管理节点

三、在 Swarm 中部署服务

  1) 创建服务 

[root@master ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Options:


Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service''s configuration
  scale       Scale one or multiple replicated service     
1
2
3
4
5
[root@master ~] # docker service create --replicas 1 --name hello busybox
 
#  --replicas : 副本集个数
 
# --name:服务名称

  2)查看服务信息

1
2
3
[root@master ~] # docker service ls
ID                   NAME                MODE                REPLICAS            IMAGE               PORTS
kosznwn4ombx        hello               replicated           0 / 1                  busybox:latest

  从 REPLICAS 中能看出这个 hello 服务并没有启动起来,0/1 表示 1 计划启动的副本数,0 实际启动的数量。所以启动失败  

 

  

  3)添加参数

  在 hello 服务中 busybox 只是一个基础镜像,并没有一个持续运行的任务,所以 manager 会不断重启 hello 这个服务,所以有好多 shutdown 的记录。但是可以为其添加一个任务。 

1
2
3
4
5
6
7
8
9
10
[root@master ~] # docker service update --args "ping www.baidu.com" hello
hello
overall progress:  1  out of  1  tasks
1 / 1 : running   [ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >]
verify: Service converged
 
 
# update:更新状态
 
# --args:增加参数

  再次查看状态:

  

  过滤不正常的状态: 

1
2
3
4
5
6
[root@master ~] # docker service ps -f "desired-state=running" hello
ID                   NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
yxyivio4mzlg        hello. 1              busybox:latest      master              Running             Running  4  minutes ago 
 
 
# -f "desired-state=running" : 状态为runngin的服务

  4)为服务扩容(缩融)scale

  刚才设置的 replicas=1,可以增加副本数量

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~] # docker service scale hello=4
 
hello scaled to  4
overall progress:  4  out of  4  tasks
1 / 4 : running  
2 / 4 : running  
3 / 4 : running  
4 / 4 : running  
verify: Service converged
 
 
# scale : 指定服务的数量

  

 

  5)工作节点排除 manager,manager 只作为管理节点

  上图中 manager 也运行了一个服务,将 manager 排除在外

1
2
3
4
5
6
7
8
9
[root@manager ~] # docker node update --availability drain manager
 
# node update : 更改节点状态
 
# --availability : 三种状态
     
    active: 正常
    pause:挂起
    drain:排除

  排除 manager 后,其上面运行的服务会转移到其他节点 

  

 

 四、滚动更新服务

  例如升级服务的镜像版本 

1
2
3
4
5
6
7
8
9
10
[root@manager ~] # docker service create \
- - replicas  3  \
- - name redis \
- - update - delay  10s  \
> redis: 3.0 . 6
 
 
# 启动3个副本集的redis
 
# update-delay 10s :每个容器依次更新,间隔10s

  滚动更新:

1
2
3
docker service update  - - image redis: 3.0 . 7  redis
 
# --image : 指定版本

  更新完成后新版本和历史记录都能查看

  

  查看配置信息:

  

 

 五、服务更新和回滚策略

  1)设置策略  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@manager ~] # 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  0.2  \
nginx: 1.12 . 1
 
 
# --update-parallelism 2  : 每次允许两个服务一起更新
 
#--update-failure-action continue : 更新失败后的动作是继续
 
# --rollback-parallelism 2  :  回滚时允许两个一起
 
# --rollback-monitor 20s  :回滚监控时间20s
 
# --rollback-max-failure-ratio 0.2 : 回滚失败率20%

  如果执行后查看状态不是设置的,可以在 update 一下,将服务状态设置为自己想要的

1
2
3
4
5
docker service update  - - rollback - monitor  20s   my - web
 
docker service update  - - rollback - max - failure - ratio  0.2  my - web
 
# 有两个地方设置数值没有成功,手动设置

  查看状态:

  

  

  2)服务更新

1
[root@manager ~] # docker service update --image nginx:1.13.5 my-web

  和上述策略一致,两两更新

  

   更新完成:

  

  3)手动回滚(策略是失败会回滚,现在没有失败)

  刚才 nginx 版本已经是 1.13.5 了,现在将其还原到 1.12.1 

1
[root@manager ~] # docker service update --rollback my-web

  

  手动回滚成功

docker + swarm 集群

docker + swarm 集群

docker-swarm

token方式

以虚拟机方式搭建集群练练手

安装swarm

docker run --rm swarm create  
6a2d606bb3155b4428d0dc483cff6800

创建Docker虚拟机

docker-machine.exe create -d virtualbox swarm-master  
docker-machine.exe create -d virtualbox swarm-node1  
docker-machine.exe create -d virtualbox swarm-node2

搭建swarm集群

创建swarm-master

eval $(docker-machine.exe env swarm-master)  
docker run -d -p 3376:3376 -t \  
-v /var/lib/boot2docker:/carts:ro swarm manage \
-H 0.0.0.0:3376 \
--tlsverify --tlscacert=/certs/ca.pem \
--tlscert=/certs/server.pem \
--tlskey=/certs/server-key.pem \
token://6a2d606bb3155b4428d0dc483cff6800

docker run -d swarm join --addr=$(docker-machine.exe ip swarm-master):2376 token://6a2d606bb3155b4428d0dc483cff6800

创建swarm-node

eval $(docker-machine.exe env swarm-node1)  
docker run -d swarm join --addr=$(docker-machine.exe ip swarm-node1):2376 token://6a2d606bb3155b4428d0dc483cff6800

eval $(docker-machine.exe env swarm-node2)  
docker run -d swarm join --addr=$(docker-machine.exe ip swarm-node2):2376 token://6a2d606bb3155b4428d0dc483cff6800

管理Swarm集群

export DOCKER_HOST=$(docker-machine ip swarm-master):3376  
docker info

 

免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:http://www.linuxprobe.com/

Docker 1.12 以前的: swarm 搭建 docker 集群

Docker 1.12 以前的: swarm 搭建 docker 集群

什么是 Swarm

Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机。Swarm 使用标准的 Docker API 接口作为其前端访问入口,换言之,各种形式的 Docker Client (docker client in go, docker_py, docker 等) 均可以直接与 Swarm 通信。Swarm 几乎全部用 Go 语言来完成开发,上周五,4 月 17 号,Swarm0.2 发布,相比 0.1 版本,0.2 版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的 Docker 命令以及集群驱动。

Swarm deamon 只是一个调度器(Scheduler)加路由器 (router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使 Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,它会收集重建集群信息。下面是 Swarm 的结构图:

能干什么

  • 搭建一个 dockers 集群

怎么玩

  1. 安装 env :A,B,C 三台机 ,A 将作管理机,centos 系统 ,root 用户 每一台机执行: sudo docker pull swarm
  2. 修改 docker 配置文件 sudo vi /etc/sysconfig/docker 在文件的最后面添加下面这句 DOCKER_OPTS="-H 0.0.0.0:2375 –H unix:///var/run/docker.sock"
  3. 重启 dockers sudo service docker restart
  4. 使用令牌来发现
  • 使用 DOCKHUB 来建立 任意一台,执行下面的命令 sudo docker run --rm swarm create 这里会产生一个令牌 ,假设为 1111
  • swarm join 命令,把机器加入集群。 A,B,C: sudo docker run -d swarm join –addr=A:2375 token://1111
  • swarm manager A: sudo docker run –d –p 2376:2375 swarm manage token://1111
    • 首先要以 daemon 的形式运行 swarm;
    • 其次端口映射:2376 可以更换成任何一个本机没有占用的端口,一定不能是 2375,否则就会出问题
  • swarm list A,b,c:docker run --rm swarm list token://1111

引用:Docker 学习教程

我们今天的关于Docker Swarm 容器集群管理docker swarm集群部署的分享就到这里,谢谢您的阅读,如果想了解更多关于29. docker swarm 创建 三个节点 swarm 的集群、Docker (二十一)-Docker Swarm 集群部署、docker + swarm 集群、Docker 1.12 以前的: swarm 搭建 docker 集群的相关信息,可以在本站进行搜索。

本文标签: