安装 Docker 版本 1.13 或更高版本。 node
获取第 3 部分先决条件中所述的 Docker Compose。web
获取 Docker Machine,如第 4 部分先决条件中所述。redis
阅读第 1 部分中的方向。docker
了解如何在第 2 部分中建立容器。shell
确保经过将friendlyhello
镜像推送到 registry
来发布您建立的friendlyhello
镜像。咱们在这里使用那个共享镜像。数据库
确保镜像用做已部署的容器。运行此命令,在信息中键入username
, repo
, 和 tag
:docker run -p 80:80 username/repo:tag
,而后访问http://localhost/
。app
请从第 3 部分得到 docker-compose.yml
的副本。ssh
确保第 4 部分中设置的机器已运行并准备就绪。运行 docker-machine ls
来验证这一点。若是machines中止,则运行 docker-machine start myvm1
以启动管理器,而后运行 docker-machine start myvm2
以启动辅助角色。tcp
让你在第4部分建立的群运行并准备就绪。运行 docker-machine ssh myvm1 "docker node ls"
来验证这一点。若是群已启动,则两个节点都会报告ready
。若是没有,请从新初始化群并加入工做人员,如设置群中所述。编辑器
在第 4 部分中,您学习了如何设置一个swarm,即运行 Docker 的machines群集,并将应用程序部署到该swarm,容器在多台计算机上协同运行。
在第 5 部分中,您将到达分布式应用程序的层次结构的顶部: stack
。stack是一组共享依赖项的相互关联的服务,能够一块儿编排和缩放。单个stack可以定义和协调整个应用程序的功能(尽管很是复杂的应用程序可能但愿使用多个stack)。
一些好消息是,自第 3 部分以来,您一直在使用stack,此时您建立了一个Compose文件并使用 docker stack deploy
。可是,这是在单个主机上运行的单个服务stack,这一般不是生产环境中发生的状况。在这里,您能够获取所学知识,使多个服务彼此相关,并在多台计算机上运行它们。
你作得很好,这是the home stretch!
很容易将服务添加到咱们的 docker-compose.yml
文件中。首先,让咱们添加一个免费的可视化工具服务,让咱们看看咱们的群是如何调度容器的。
在编辑器中打开 docker-compose.yml
,并将其内容替换为如下内容。请务必将username/repo:tag替换为image详细信息。
version: "3" services: web: # replace username/repo:tag with 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 networks: webnet:
这里惟一的新东西是对Web
的平级服务,名为visualizer
。请注意两个新内容: volumes
关键字,容许可视化工具访问 Docker 的主机套接字文件,以及placement
关键字,确保此服务仅在swarm manager上运行 - 从不为worker运行。这是由于此容器由 Docker 建立的开源项目构建,显示在关系图中的swarm上运行的 Docker 服务。
咱们立刻就更多地讨论placement constraints和volumes。
确保shell配置为与 myvm1
对话(完整示例在此处)。
运行 docker-machine ls 列出计算机并确保已链接到 myvm1,如其旁边的星号所示。
若是须要,请从新运行 docker-machine env myvm1,而后运行给定的命令来配置 shell。
在 Mac 或 Linux 上,命令是:
eval $(docker-machine env myvm1)
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
在manager上从新运行 docker stack deploy
命令,而且须要更新的任何服务都获得更新:
$ docker stack deploy -c docker-compose.yml getstartedlab Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm) Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
看看visualizer可视化工具。
您在Compose文件中看到可视化工具visualizer
在端口 8080 上运行。经过运行 docker-machine ls 获取其中一个节点的 IP 地址。转到端口 8080 中的任一 IP 地址,您能够看到可视化工具正在运行:
可视化工具visualizer
的单个副本正按预期在manager上运行,而且 Web
的 5 个实例分布在swarm中。您能够经过运行 docker stack ps <stack>
来证明此可视化效果:
docker stack ps getstartedlab
可视化工具visualizer
是一个独立的服务,能够在包含它在stack中的任何应用中运行。它不依赖于任何其余内容。如今,让咱们建立一个确实具备依赖项的服务:提供访问者计数器的 Redis 服务。
让咱们再次经过相同的工做流来添加用于存储应用数据的 Redis 数据库。
保存此新的 docker-compose.yml
文件,该文件最终添加了 Redis 服务。请务必将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: 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 的简短image名称,所以这里没有用username/repo表示法。Redis 端口 6379 已由 Redis 预配置,以便从容器向主机公开,在咱们的Compose文件中,咱们将从主机向世界公开它,所以您能够实际将任何节点的 IP 进入 Redis Desktop Manager 并管理此 Redis实例,若是您选择。
最重要的是,redis
有一些使数据在此stack部署之间持久的规范:
redis 始终在manager上运行,所以始终使用相同的文件系统。
redis 在容器内以 /data
挂载主机文件系统中的任意目录,这是 Redis 存储数据的地方。
总之,这在主机的物理文件系统中为 Redis 数据建立了一个"真相源"。若是没有此,Redis 会将其数据存储在容器文件系统中的 /data
中,若是从新部署该容器,该文件系统将消失。
这个真理之源有两个组成部分:
在 Redis 服务上标记 placement constraint,确保它始终使用相同的主机。
建立一个 volume ,路径 ./data
(在主机上)做为 /data
(在 Redis 容器内)的volume。当容器被拆掉和从新部署时,存储在指定主机上 ./data
上的文件将保留,从而实现连续性。
您已准备好部署新的 Redis-using stack。
在manager上建立 ./data目录:
docker-machine ssh myvm1 "mkdir ./data"
确保shell配置为与 myvm1
对话(完整示例在此处)。
运行 docker-machine ls 列出计算机并确保已链接到 myvm1,如其旁边的星号所示。
若是须要,请从新运行 docker-machine env myvm1,而后运行给定的命令来配置 shell。
在 Mac 或 Linux 上,命令是:
eval $(docker-machine env myvm1)
在 Windows 上,命令是:
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
再运行 docker stack deploy
一次。
$ docker stack deploy -c docker-compose.yml getstartedlab
运行 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 gordon/getstarted:latest *:80->80/tcp
检查其中一个节点,如http://192.168.99.101
,并查看访问者计数器的结果,该计数器如今实时显示并存储在 Redis 上的信息。
此外,请检查任一节点的 IP 地址端口 8080 处的可视化工具,并注意到 redis
服务与 Web
和visualizer
服务一块儿运行。
您了解到, stacks是相互关联的服务,都协同运行,这 - 惊喜!-- 自本教程的第三部分以来,您一直在使用stack。您了解到,要向stack添加更多服务,请将它们插入到Compose文件中。最后,您了解到,经过使用放置placement constraints 和 volumes的组合,您能够建立永久的永久主状态数据,以便在容器被拆掉和从新部署时,应用的数据可以存活下来。