zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Apache Ant 1.9.1 版发布
    Apache Subversion 1.8.0rc2 发布
    GNU Gatekeeper 3.3 发布,网关守护管理
    Jekyll 1.0 发布,Ruby 的静态网站生成器
    R语言 3.0.1 源码已经提交到 Github
    SymmetricDS 3.4.0 发布,数据同步和复制
    beego 0.6.0 版本发布,Go 应用框架
    Doxygen 1.8.4 发布,文档生成工具
    SunshineCRM 20130518发布,附带更新说明
    Semplice Linux 4 发布,轻量级发行版
  • 原文地址:https://www.cnblogs.com/linyaonie/p/11238420.html
Copyright © 2011-2022 走看看