导图社区 Docker学习笔记
Docker学习笔记,这是一定是你见过最好的docker学习笔记。从主机的层面来看,Docker Swarm 管理的是 Docker Host 集群。
提示: 本内容由社区用户上传并分享。平台不对内容的真实性、合法性、知识产权归属及是否侵害第三方权利进行事前审核或保证。本内容可能包含受版权保护的图片、字体或其他第三方素材,使用前请自行确认授权范围。
Mongo学习笔记,NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。非常详细非常好的学习笔记。
java并发编程笔记,内容绝对是你见过最详细最丰富的,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
Docker Swarm
从主机的层面来看,Docker Swarm 管理的是 Docker Host 集群
集群化(Clustering)
服务器集群由一组网络上相互连接的服务器组成,它们一起协同工作
实现集群化后我们的思维方式就必须改变了:不再考虑一个一个的服务器,而是将集群看做是一个整体。
相比 Kubernetes,用 Docker Swarm 创建集群非常简单,不需要额外安装任何软件,也不需要做任何额外的配置。很适合作为学习容器编排引擎的起点。
重要概念
node
swarm 中的每个 Docker Engine 都是一个 node,有两种类型的 node:manager 和 worker
manager node 负责执行编排和集群管理工作,保持并维护 swarm 处于期望的状态。swarm 中如果有多个 manager node,它们会自动协商并选举出一个 leader 执行编排任务。
woker node 接受并执行由 manager node 派发的任务。默认配置下 manager node 同时也是一个 worker node,不过可以将其配置成 manager-only node,让其专职负责编排和集群管理工作。
work node 会定期向 manager node 报告自己的状态和它正在执行的任务的状态,这样 manager 就可以维护整个集群的状态。
service
service 定义了 worker node 上要执行的任务
service 的例子:在 swarm 中启动一个 http 服务,使用的镜像是 httpd:latest,副本数为 3
manager node 负责创建这个 service,经过分析知道需要启动 3 个 httpd 容器,根据当前各 worker node 的状态将运行容器的任务分配下去,比如 worker1 上运行两个容器,worker2 上运行一个容器。 运行了一段时间,worker2 突然宕机了,manager 监控到这个故障,于是立即在 worker3 上启动了一个新的 httpd 容器。 这样就保证了 service 处于期望的三个副本状态。
如何实现 Service 伸缩
docker service scale web_server=5
failover 策略
故障是在所难免的,容器可能崩溃,Docker Host 可能宕机,不过幸运的是,Swarm 已经内置了 failover 策略。
步骤
1.关闭 swarm-worker1
2.Swarm 会检测到 swarm-worker1 的故障,并标记为 Down
3.Swarm 会将 swarm-worker1 上的副本调度到其他可用
可以看到,web_server.1 和 web_server.2 已经从 swarm-worker1 迁移到了 swarm-worker2,之前运行在故障节点 swarm-worker1 上的副本状态被标记为 Shutdown。
如何访问 Service
Service访问外部,Docker 默认 bridge 网络
容器直接在 swarm-worker1 上访问容器的 http 服务
从外部访问 service
docker service create --name web_server --publish 8080:80 --replicas=2 httpd
容器在 80 端口上监听 http 请求,--publish-add 8080:80 将容器的 80 映射到主机的 8080 端口,这样外部网络就能访问到 service 了。
routing mesh
swarm 内部的 load balancer 会将请求转发给 web_server 其中的一个副本
ingress 网络
ingress 网络是 swarm 创建时 Docker 为自动我们创建的,swarm 中的每个 node 都能使用 ingress
eth0 连接的是一个 overlay 类型的网络,名字为 ingress,其作用是让运行在不同主机上的容器可以相互通信。
eth1 连接的是一个 bridge 类型的网络,名字为 docker_gwbridge,其作用是让容器能够访问到外网。
Swarm Service 之间如何通信
服务发现
一种实现方法是将所有 service 都 publish 出去,然后通过 routing mesh 访问。但明显的缺点是把 memcached 和 mysql 也暴露到外网,增加了安全隐患
如何滚动更新 Service
滚动更新降低了应用更新的风险,如果某个副本更新失败,整个更新将暂停,其他副本则可以继续提供服务。同时,在更新的过程中,总是有副本在运行的,因此也保证了业务的连续性。
步骤执行滚动更新
停止第一个副本。
调度任务,选择 worker node。
在 worker 上用新的镜像启动副本。
如果副本(容器)运行成功,继续更新下一个副本;如果失败,暂停整个更新过程。
Swarm 储存数据
Rex-Ray
swarm 中的所有 node 都安装部署 Rex-Ray。
Rex-Ray 使用 VirtualBox backend
数据持久性
Scale Up
swarm 在 swarm-worker2 上启动第二个副本,同时也将挂载 volume my_web
实际情况
swarm 首先尝试在 swarm-worker2 上启动第二个副本,但在 mount volume 失败。
重试了三次都失败了。
最后在 swarm-worker1 成功启动第二个副本。
mount 失败的原因是:以 VirtualBox 为 backend 的 Rex-Ray volume 不支持同时 attach 到多个 Host。
更新 Volume
Failover
shutdown 节点 swarm-worker1,过一会,所有副本都会迁移到 swarm-worker2
Label
1.为每个 node 定义 label
2.设置 service 运行在指定 label 的 node 上。label env=test
docker node update --label-add env=test swarm-worker1