• 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

  • 相关阅读:
    [原创] Laravel 启动流程
    修改电脑的TTL返回值
    Apache启动错误解决方法
    RemodelanyWhere11.0.2673版本下载
    函数指针
    指针与数组
    青蛙跳台阶
    旋转数组的最小数字
    对大量人的年龄排序
    泛型算法一
  • 原文地址:https://www.cnblogs.com/linyaonie/p/11238420.html
Copyright © 2020-2023  润新知