[关闭]
@zhangyy 2018-12-27T19:46:57.000000Z 字数 4558 阅读 189

docker 的swarm集群管理

docker的部分


  • 一: Swarm容器集群管理

一:Swarm容器集群管理

1.1: swarm的介绍

  1. SwarmDocker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swarm的集群管理
  2. 和编排功能。可以通过初始化Swarm或加入现有Swarm来启用Docker引擎的Swarm模式。
  3. Docker Engine CLIAPI包括了管理Swarm节点命令,比如添加、删除节点,以及在Swarm中部署和编排服务。
  4. 也增加了服务栈(Stack)、服务(Service)、任务(Task)概念。

1.2 Swarm 架构

image_1cda8335o1t5s1vh222u14ieuhv9.png-1180.3kB

  1. Manager:接收客户端服务定义,将任务发送到worker节点;维护集群期望状态和集群管理功能及Leader选举。默认情况下manager节点也会运行任务,也可以配置只做
  2. 管理任务。
  3. Worker:接收并执行从管理节点分配的任务,并报告任务当前状态,以便管理节点维护每个服务期望状态。

1.3 Swarm的特点

  1. 1. Docker Engine 集成集群管理
  2. 使用Docker Engine CLI 创建一个Docker EngineSwarm模式,在集群中部署应用程序服务。
  3. 2. 中心化设计
  4. Swarm角色分为ManagerWorker节点,Manager节点故障不影响应用使用。
  5. 3. 扩容缩容
  6. 可以声明每个服务运行的容器数量,通过添加或删除容器数自动调整期望的状态。
  7. 4. 期望 状态 协调
  8. Swarm Manager节点不断监视集群状态,并调整当前状态与期望状态之间的差异。
  9. 5. 主机网络
  10. 可以为服务指定overlay网络。当初始化或更新应用程序时,Swarm manager会自动为overlay网络上的容器分配IP地址。
  11. 6. 服务 发现
  12. Swarm manager节点为集群中的每个服务分配唯一的DNS记录和负载均衡VIP。可以通过Swarm内置的DNS服务器查询集群中每个运行的容器。
  13. 7. 负载均衡
  14. 实现服务副本负载均衡,提供入口访问。
  15. 8. 安全 传输
  16. Swarm中的每个节点使用TLS相互验证和加密,确保安全的其他节点通信。
  17. 9. 滚动 更新
  18. 升级时,逐步将应用服务更新到节点,如果出现问题,可以将任务回滚到先前版本。

二:swarm 的集群部署

2.1: 使用 Swarm 前提

  1. 使用 Swarm 前提:
  2. Docker版本1.12+
  3. 集群节点之间保证TCP 2377(集群管理)、TCP/UDP 7946(容器网络发现)和UDP 4789Overlay网络)端口通信
  4. 节点规划:
  5. 操作系统:CentOS7.4_x64
  6. 172.17.100.11 node01 manager
  7. 172.17.100.12 node02 worker01
  8. 172.17.100.13 node03 worker02

2.2: 构建swarm集群

2.2.1: 创建集群的manager

  1. 172.17.100.11 node01 manager
  2. ---
  3. docker swarm init --advertise-addr 172.17.100.11
  4. ---
  5. docker swarm join --token SWMTKN-1-09h3c5ehmupa172t0wznc8orvc6y3qoujjpee9mwte06nbnfof-68r586okdnkoo1xusq0z3f8p3 172.17.100.11:2377

image_1cdac07ku2uj1vgc1eml4eo1rhm9.png-230.9kB

2.2.2:将集群的worker加入manager当中

  1. 172.17.100.12 node02 worker01
  2. ----
  3. docker swarm join --token SWMTKN-1-09h3c5ehmupa172t0wznc8orvc6y3qoujjpee9mwte06nbnfof-68r586okdnkoo1xusq0z3f8p3 172.17.100.11:2377
  4. ----

image_1cdac4tlqeef1hljomg1kjnmlvm.png-121.3kB

  1. 172.17.100.13 node03 worker02
  2. ----
  3. docker swarm join --token SWMTKN-1-09h3c5ehmupa172t0wznc8orvc6y3qoujjpee9mwte06nbnfof-68r586okdnkoo1xusq0z3f8p3 172.17.100.11:2377
  4. ----

image_1cdac6h7un8d1jpg11l71fm1a3713.png-125.5kB

  1. 查看swarm的集群
  2. manager:
  3. docker node ls

image_1cdac8vn61qbk134oeca16vps9v1g.png-231.3kB

2.3 node 节点的管理

  1. docker node --help

image_1cdacsbsnh423fmlkd1gjcs551t.png-270.8kB

2.4 serivce 节点的管理

2.4.1 创建一个服务器

  1. docker service create --replicas 1 --name hello busybox ping www.baidu.com

image_1cdadgskt1nbhmiu2tu6411k582a.png-112.1kB
image_1cdadhj7215298kuf5gf961eo52n.png-288.4kB

  1. docker service --help
  2. create 创建一个容器的服务
  3. inspect 列出创建容器服务器的详细信息
  4. logs 列出创建容器当中正在运行的服务器
  5. ls 查看当前的容器的信息主要是副本数 
  6. ps 查看当前集群中跑的容器信息
  7. rm 删除当中的容器服务
  8. rollback 回滚到上一个配置
  9. scale 调整容器服务的副本数
  10. update 更新服务

image_1cdadkj181iot1c8epii1mivcb63u.png-324.4kB

  1. # 创建服务
  2. docker service create --replicas 1 --name hello busybox
  3. # 显示服务详细信息
  4. docker service inspect --pretty hello # 易于阅读显示
  5. docker service inspect hello # json格式返回
  6. # 扩展服务实例数
  7. docker service scale hello=3
  8. # 查看服务任务
  9. docker service ls
  10. docker service ps hello
  11. docker service ps -f 'desired-state=running' hello
  12. # 滚动更新服务
  13. docker service create \
  14. --replicas 3 \
  15. --name redis \
  16. --update-delay 10s \
  17. redis:3.0.6
  18. docker service update --image redis:3.0.7 redis
  19. # 创建服务时设定更新策略
  20. docker service create \
  21. --name my_web \
  22. --replicas 10 \
  23. --update-delay 10s \
  24. --update-parallelism 2 \
  25. --update-failure-action continue \
  26. nginx:1.12
  27. # 创建服务时设定回滚策略
  28. docker service create \
  29. --name my_web \
  30. --replicas 10 \
  31. --rollback-parallelism 2 \
  32. --rollback-monitor 20s \
  33. --rollback-max-failure-ratio .2 \
  34. nginx:1.12
  35. # 服务更新
  36. docker service update --image nginx:1.13 my_web
  37. # 手动回滚
  38. docker service update --rollback my_web

  1. docker service create --replicas 1 --name hello busybox ping www.baidu.com

image_1cdaeor001ibc78vd5s66bdts4b.png-116.8kB

image_1cdaeq99g5kh1759136jnu317k74o.png-114.1kB

image_1cdaer1b7qr9g7h1qoqubn1uuf55.png-230.3kB

  1. 修改swarm 的集群的副本数
  2. docker service scale hello=3

image_1cdaete1717h01uu5vkj86sqar5i.png-122.5kB

image_1cdaett8jfks1dpb1jh11ikhbrg5v.png-182.1kB

  1. 滚动更新服务
  2. docker service create \
  3. --replicas 3 \
  4. --name redis \
  5. --update-delay 10s \
  6. redis:3.0.6

image_1cdaf0v1610ab7mr13gpct913tm6c.png-213.1kB

image_1cdaf1ki5egp1pha1e3lvso15ge6p.png-189.8kB

  1. 更新底层的镜像:
  2. docker service update --image redis:3.0.7 redis

image_1cdaf3kkm1hln1ld71t6qkn1pgb76.png-158.9kB

image_1cdaf45ef11bufl77ase81mkt7j.png-313.9kB

  1. 回滚底层镜像
  2. docker service update --rollback redis

image_1cdaf52r71t47pueu1o54vtr480.png-538.3kB

三: 数据的管理

3.1: 管理应用程序数据 – 将宿主机数据挂载到容器

  1. Volume
  2. # 创建数据卷
  3. docker service create \
  4. --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH> \
  5. --name myservice \
  6. <IMAGE>
  7. # 查看数据卷详细信息
  8. docker volume inspect <VOLUME-NAME>

3.1.1 创建volume 的示列:

  1. docker service create \
  2. --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html/ \
  3. --name my_nginx \
  4. nginx
  5. ---
  6. docker servcie scale my_nginx=3
  7. docker service ps my_nginx
  8. docker ps -a
  9. docker exec -ti 3f3cb48ef09d bash

image_1cdjm1qkusdp1vnnvep1br214989.png-376.1kB

image_1cdjmfb5nvv27ql1ltkdj41sifm.png-168.9kB

image_1cdjmhbkp1cpqi5f137f1v5g86j23.png-211.7kB

image_1cdjmi72m1s3hvv9d5istd46l2g.png-441.7kB

image_1cdjmkfcm1b8amui3un1cd5tq12t.png-238kB

  1. volume 卷的使用
  2. docker volume ls
  3. docker volume inspect nginx-vol
  4. cd /var/lib/docker/volume/nginx-vol/_data/
  5. ls -ld *

image_1cdjmr9dm1enuj9o1cc11pop16g03a.png-213.5kB

image_1cdjn4f1ufg2ddrib9jv5j85m.png-174.8kB

image_1cdjmvt7bipp7f9196g1ecp2c39.png-410.5kB

3.2 目录挂载到容器当中

  1. Bind Mounts
  2. # 读写挂载
  3. docker service create \
  4. --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> \
  5. --name myservice \
  6. <IMAGE>
  7. # 只读挂载
  8. docker service create \
  9. --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,ro \
  10. --name myservice \
  11. <IMAGE>

3.2.1 bind mount 挂载

  1. mkdir /app/wwwroot/
  2. docker service create \
  3. --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html \
  4. --name bind-nginx \
  5. nginx

image_1cdjnnu5j1nev1fnht8588shq40.png-166.4kB

image_1cdjnrojkdsrj06nf01ap98ev4d.png-728.3kB

image_1cdjnsht713flq9qefpoiujm54q.png-82.3kB

3.3 管理应用程序数据 – NFS数据持久存储

  1. docker service create \
  2. --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-
  3. opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
  4. --name myservice \
  5. <IMAGE>

3.3.1 构建一个nfs服务器

  1. 172.17.100.13:
  2. yum install -y nfs*

image_1cdk1t3jogf11ue8n3tc3e1v5lp.png-121.8kB

image_1cdk1tm1lqi81nvi10podgqvq616.png-139.2kB

  1. 172.17.100.11
  2. ----
  3. showmount -e 172.17.100.13

1.png-106.7kB

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

2.png-239.7kB

  1. docker service scale nginx-nfs=3

3.png-159.8kB

4.png-156.9kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注