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

docker 的swarm集群管理

docker的部分


  • 一: Swarm容器集群管理

一:Swarm容器集群管理

1.1: swarm的介绍

  1. Swarm是Docker公司自研发的容器集群管理系统,Swarm在早期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swarm的集群管理
  2. 和编排功能。可以通过初始化Swarm或加入现有Swarm来启用Docker引擎的Swarm模式。
  3. Docker Engine CLI和API包括了管理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 Engine的Swarm模式,在集群中部署应用程序服务。
  3. 2. 去 中心化设计
  4. Swarm角色分为Manager和Worker节点,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 4789(Overlay网络)端口通信
  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

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