堆栈(Stacks)
准备工作
安装 Docker 1.13 及以上版本
安装 Docker Compose 正如第三部分的准备工作.
安装 Docker Machine 正如第四部分的准备工作.
阅读第一部分的引导.
学习怎么在第二部分创建容器.
确保你已经发布 friendlyhello 镜像, 并推送到公共仓库. 我们需要在这一部分用到这个镜像.
确保你的镜像能够成为一个被部署的容器能正常工作.
从第三篇文章拷贝一份 docker-compose.yml
确保第四部分的 docker machine 已经正确安装, 通过 docker-machine ls 查看.
确保 docker swarm 正确安装, 并且运行. 通过执行 docker-machine ssh myvm1 "docker node ls 命令验证.
介绍
在第 4 部分中, 你学习了如何设置一个 swarm, 这是一群运行 Docker 的机器, 并为其部署了一个应用程序, 应用才能修包含的众多容器在多台机器上运行.
在第 5 部分中, 你将学习分布式应用程序层次结构的顶部: 堆栈. 堆栈是一组相互关联的服务, 它们可以共享依赖关系, 并且可以进行协调和伸缩. 单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能需要使用多个堆栈).
好消息是, 从第 3 部分开始, 在创建 Compose 文件并使用 Docker 堆栈部署时, 从技术上讲, 你一直在使用堆栈. 但是, 这是在单个主机上运行的单个服务堆栈, 通常不会发生在生产环境中. 在这里, 你可以把你学到的东西, 使多个服务相互关联, 并在多台机器上运行它们.
你做得很好, 这就是主场!
添加一个新服务和重新部署
添加服务到 docker-compose 文件是非常简单的. 首先, 添加一个可视化界面的服务, 可以让我们查看 swarm 正在调度的容器.
1. 打开 docker-compose 文件, 并将以下的内容替换成文件的内容. 确保用你的镜像信息替换 username/repo:tag 的内容.
- version: "3"
- services:
- web:
- # replace username/repo:tag with your name and image details
- image: username/repo:tag
- deploy:
- replicas: 5
- restart_policy:
- condition: www.haiyuyule.com on-failure
- resources:
- limits:
- cpus:www.michenggw.com "0.1"
- memory: 50M
- ports:
- - "80:80"
- networks:
- - webnet
- visualizer:
- image: dockersamples/visualizer:stable
- ports:
- - "8080:www.qinlinyule.cn/ 8080"
- volumes:
- - "/var/run/docker.sock:/var/run/docker.sock"
- deploy:
- placement:
- constraints: www.xuancayule.com/ [node.role == manager]
- networks:
- - webnet
- networks:
这里新增的唯一东西就是网络对等服务, 名为可视化器. 在这里注意两件新事物: 一个 volumes , 让可视化工具访问 Docker 的主机套接字文件和一个 placement 键, 确保这项服务只能在群集管理器上运行 - 从不是工作者. 这是因为这个容器是由 Docker 创建的一个开源项目构建的, 它显示了在一个图表中的 Swarm 上运行的 Docker 服务.
我们稍后会详细讨论 lacement constraints 和 volumes .
2. 确保你的 shell 被配置为与 myvm1 进行通信(完整的例子在这如下).
运行 docker-machine ls 列出机器, 并确保您已连接到 myvm1, 如旁边的星号所示.
如果需要, 重新运行 docker-machine env myvm1, 然后运行给定的命令来配置 shell.
在 Mac 或 Linux 上, 命令是:
- eval $(docker-machine www.xuancayule.com/ env myvm1)
- 1
3. 在 manager 上重新运行 docker stack deploy 命令, 并且需要更新的任何服务都会更新:
$ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web www.wanmeiyuele.cn (id: angi1bf5e4to03qu9f93trnxm)
Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
查看可视化界面
你在 Compose 文件中看到, 可视化工具在端口 8080 上运行. 通过运行 docker-machine ls 来获取其中一个节点的 IP 地址. 转到 8080 端口的 IP 地址, 您可以看到可视化器正在运行:
可视化器的单个副本按照预期在 manager 上运行, 并且网络的 5 个实例遍布整个群集. 你可以通过运行 docker stack ps 来确认此可视化:
docker stack ps getstartedlab
1
2
可视化器是一个独立的服务, 可以在包含它的任何应用程序中运行. 它不依赖于其他任何东西. 现在让我们创建一个具有依赖性的服务: 提供访问者计数器的 Redis 服务.
数据持久化
让我们再次通过相同的工作流程来添加用于存储应用程序数据的 Redis 数据库.
保存这份新的 docker-compose.yml 文件, 它最后添加了一个 redis 服务. 确保用的镜像信息替换掉 username/repo:tag 的内容.
- version: "3"
- services:
- web:
- # replace username/repo:tag with www.boshenyl.cn your name and image details
- image: username/repo:tag
- deploy:
- replicas: 5
- restart_policy:
- condition: on-failure
- resources:
- limits:
- cpus: "0.1"
- memory: 50M
- ports:
- - "80:80"
- networks:
- - webnet
- visualizer:
- image: dockersamples/visualizer:stable
- ports:
- - "8080:8080"
- volumes:
- - "/var/run/docker.sock:/var/run/docker.sock"
- deploy:
- placement:
- constraints: [node.role == manager]
- networks:
- - webnet
- redis:
- image: redis
- ports:
- - "6379:6379"
- volumes:
- - "/home/docker/data:/data"
- deploy:
- placement:
- constraints: [node.role == manager]
- command: redis-server --appendonly yes
- networks:
- - webnet
- networks:
- webnet:
Redis 在 Docker 库中有一个正式镜像, 并且已被授予 redis 的简短镜像名称, 所以在这里没有 username/repo 符号. Redis 端口 6379 已经由 Redis 预先配置为从容器暴露给主机, 并且在我们的 Compose 文件中, 我们将它从主机展示给所有容器, 因此你可以实际输入任何 IP 的 IP 节点添加到 Redis 桌面管理器中并管理此 Redis 实例, 如果愿意的话.
最重要的是, redis 规范中有几件事情使数据在这个堆栈的部署之间持久化:
redis 总是在管理器上运行, 所以它总是使用相同的文件系统.
redis 在主机文件系统中访问任意目录作为容器内的 / data, 这是 Redis 存储数据的地方.
这就是在主机物理文件系统中为 Redis 数据创建 "source of truth". 如果没有这个, Redis 会将其数据存储在容器文件系统中的 / data 中, 如果该容器曾经被重新部署, 该数据将被清除.
真实的数据源 (source of truth) 由 2 部分组成:
放置在 Redis 服务上的 placement constraint, 确保它始终使用相同的主机.
创建的 volume , 允许容器作为 / data(位于 Redis 容器内)访问./data(在主机上). 在容器重复开启和关闭时, 存储在指定主机上的./data 文件仍然存在, 从而保持连续性.
2. 在 manager 上创建一个./data 目录
- docker-machine ssh myvm1 "mkdir ./data"
- 1
- 2
3. 确保你的 shell 被配置为与 myvm1 进行通信(完整的例子在这里).
运行 docker-machine ls 命令, 列出所有的机器和确保你已经连上 myvm1.
如果需要, 重新运行 docker-machine env myvm1 命令, 然后再运行以下命令:
- eval $(docker-machine env myvm1)
- 1
运行 docker stack deploy 命令
- $ docker stack deploy -c docker-compose.yml getstartedlab
- 1
5. 运行 docker service ls 命令, 去验证这三个服务跟预期一样正常运行.
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x7uij6xb4foj getstartedlab_redis replicated 1/1 redis:latest *:6379->6379/tcp
n5rvhm52ykq7 getstartedlab_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
mifd433bti1d getstartedlab_web replicated 5/5 orangesnap/getstarted:latest *:80->80/tcp
6. 查看你的机器的一个节点的 web 页面, 比如 http://192.168.99.101, 并且查看访客计数的结果, 该计数现在已经存在并将信息存储在 Redis 上.
另外, 请检查任一节点 IP 地址的端口 8080 处的可视化工具, 并注意查看随 Web 和可视化工具一起运行的 redis 服务
堆栈(Stacks)
来源: http://www.bubuko.com/infodetail-2594516.html