上一篇: Docker 入门 (四 Swarms 集群)
在第四部分Docker 入门 (四 Swarms 集群), 你学会了如何建立一个集群,并且在集群上部署了一个应用,该应用在多台机器上的容器上协作运行。
在第5部分中,您将到达分布式应用程序层次结构的顶部:堆栈。 堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起。 单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个堆栈)。
一些好消息是,从第3部分开始,当您创建Compose文件并使用docker堆栈部署时,您在技术上一直在使用堆栈。 但这是在单个主机上运行的单个服务堆栈,这通常不是生产中发生的事情。 在这里,您可以学习所学内容,使多个服务相互关联,并在多台计算机上运行它们。
将服务添加到docker-compose.yml
文件很容易。 首先,让我们添加一个免费的可视化服务,让我们看看我们的swarm如何调度容器。
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
networks:
webnet:
在这里新增了web 服务,叫visualizer。注意在这里有两个新东西,volumes key:使visualizer服务有权限访问Docker主机的套接字文件,placement key:确保visualizer服务只运行在集群管理机上而不是Worker上。
我们待会详细解释placement constraints和 volumes。
docker-machine env myvm1
eval $(docker-machine env myvm1)
docker stack deploy -c docker-compose.yml getstartedlab
[hb@hb-desktop Bird2]$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
gf72dv1epu1b getstartedlab_visualizer.1 dockersamples/visualizer:stable myvm1 Running Running 18 seconds ago
hxbcwk8x7cj8 getstartedlab_web.1 hebiao/get-started:part1 myvm2 Running Running 11 minutes ago
hbsdgoas3iy3 getstartedlab_web.2 hebiao/get-started:part1 myvm2 Running Running 11 minutes ago
y6nj81bctipp getstartedlab_web.3 hebiao/get-started:part1 myvm1 Running Running 11 minutes ago
xbzp341tj8kg getstartedlab_web.4 hebiao/get-started:part1 myvm2 Running Running 11 minutes ago
sw0doud6mjup getstartedlab_web.5 hebiao/get-started:part1 myvm1 Running Running 11 minutes ago
让我们再次通过相同的工作流程来添加Redis数据库来存储应用数据。
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的暴露出6379和外部通信。
最重要的是,redis规范中有一些内容可以使数据在此堆栈的部署之间保持不变:
总之,这是在主机的物理文件系统中为Redis数据创建“真实来源”。 如果没有这个,Redis会将其数据存储在容器文件系统中的/ data中,如果重新部署该容器,将会被删除。
这个真相来源有两个组成部分:
docker-machine ssh myvm1 "mkdir ./data"
docker-machine env myvm1
eval $(docker-machine env myvm1)
docker stack deploy -c docker-compose.yml getstartedlab
[hb@hb-desktop Bird2]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
m0tevz136u5k getstartedlab_redis replicated 1/1 redis:latest *:6379->6379/tcp
hsad3358i674 getstartedlab_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
x1niigeaxis4 getstartedlab_web replicated 5/5 hebiao/get-started:part1 *:80->80/tcp