1. 理解 swarm
swarm(译: 集群)
一个 swarm 是一组运行着 Docker 的机器, 它们一起加入到一个集群. swarm 中的机器既可以是物理机, 也可以是虚拟机. 在加入到一个 swarm 后, 每台机器被称为一个节点. 以前, 我们执行 docker 命令由对应的机器去执行, 而现在多台机器组成 swarm 后, 命令由 swarm manager 去执行.
swarm manager 可以用多种策略来运行容器, 比如 "empties node", 用容器填充利用率最低的机器; 或者 "global", 它确保每台机器只获得指定容器的一个实例.
swarm manager 是在一个 swarm 中唯一能够执行你的命令的机器, 或者授权其它机器以 workers 身份加入. Workers 仅仅只是在提供生产能力, 它没有权力告诉其他机器它能做什么和不能做什么.
到目前为止, 你一直在本地机器上以 single-host mode(单机模式) 使用 Docker. 但是 Docker 也可以切换到 swarm mode(群集模式), 这就是启用群集的原因. 启用群集模式将立即使当前机器成为 swarm manager. 从那时起, Docker 将运行你所管理的 swarm 上执行的命令, 而不仅仅是在当前机器上.
小结 & 回顾:
swarm 就是集群, 是 Docker 集群, 它是一组运行着 Docker 的机器组成的
组成 Docker 集群以后, 集群中的每台机器被称之为一个 node, 其中有一台机器是这个集群的管理者, 称之为 manager, 其余的称之为 worker
在集群中, 你的命令都是由 manager 去执行的, 这与你当前在那台机器上输入的命令无关
与集群模式相对的是单机模式, 之前我们一直是以单机模式使用 Docker 的
类比 Redis 机器的话, manager 就相当于 master,worker 相当于 slave
2. 设置 swarm
集群由多个节点组成, 可以是物理节点, 也可以是虚拟节点.
运行 docker swarm init 以启用群集模式, 并且使当前的机器成为一个群集 manager, 然后在其它机器上运行 docker swarm join, 让它们作为 worker 加入到群集中.
3. 创建集群
首先, 我们需要 hypervisor 来创建虚拟机. 官方支持的是 VirtualBox, 因此首先要安装 VirtualBox
- https://www.virtualbox.org/wiki/Downloads
- https://docs.docker.com/machine/drivers/
安装完以后, 使用 docker-machine 命令来创建两个虚拟机
现在我们就有了两个虚拟机, 分别是 myvm1 和 myvm2, 接下来可以通过 docker-machine ls 命令查看
我们可能看到这样的输出
有了虚拟机以后, 接下来初始化集群并添加节点
第一台启动的机器是集群中的 manager, 它可以执行管理命令, 并且授权其它的机器以 worker 身份加入到该集群中.
第二台启动的机器是 worker
通过 docker-machine SSH 命令, 可以远程登录到刚才我们创建的虚拟机上, 就像我们在 Linux 系统上使用 SSH 远程登录一样
也就是说, 通过 docker-machine SSH 我们可以与远程虚拟机通讯
还可以对虚拟机进行启动和停止操作
登录到虚拟机以后就可以像在本机上那样执行各种命令了, 比如:
4. 部署应用到集群
前面我们也说过, 只有集群中的 manager 才能执行命令, 因此我们可以登录到 myvm1 上创建一个 docker-compose.YAML 文件
当然最简单的是使用 docker-machine scp 命令从本地拷贝一个, 比如:
语法格式如下:
现在, myvm1 上有了 docker-compose.YAML 文件,
于是, 我们就可以在 myvm1 上执行 docker stack deploy -c docker-compose.YAML getstartedlab 命令
应用已经部署到集群了, 接下来我们可以访问任意机器, 简单起见就不用浏览器访问了, 直接 curl
看下集群中是如何负载均衡的, 默认策略是随机
查看一下 stack, 确实启动了 5 个服务实例
5. 完整演示
6. 备忘单
7. 文档
- https://docs.docker.com/get-started/part4/
- https://docs.docker.com/machine/reference/create/
来源: https://www.cnblogs.com/cjsblog/p/10778493.html