概述:一个stack是一个分享依赖、相互协作的相关服务的集合。一个stack就足以定义和协调整个APP的功能。(虽然非常复杂的应用需要多个stack)。在服务中,我们已经介绍过stack(使用docker stack deploy去部署Compose文件),但那只是运行在单一主机上的单一服务stack,而现在我们要学会使服务相互依赖,并运行在多台机器上。
(一)加入新服务 & 重新部署
加入新服务:编辑docker-compose.yml 加入一个免费的观察者服务(让我们知道swarm是如何规划容器的)
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"
# giving the visualizer access to the host’s socket file for Docker volumes: - "/var/run/docker.sock:/var/run/docker.sock"
# ensuring that this service only ever runs on a swarm manager -- never a worker deploy: placement: constraints: [node.role == manager] networks: - webnet networks: webnet:
重复之前的步骤:
- 保证你的shell被配置的与myvm1对话;
docker-machine env myvm1
- 使用docker stack deploy部署;
docker stack deploy -c docker-compose.yml getstartedlab
- 通过IP地址访问;
可以看到visualizer服务会运行在管理员机器上,其他五个web服务的实例分散在swarm中,你可以通过以下命令去验证:
docker stack ps getstartedlab
但是visualizer服务是独立的,它不依赖于任何其他东西,可以运行在任何把它添加进stack的应用中,现在让我们创建一个有依赖的服务——Redis。
(二)保留数据
通过加入Redis服务去储存应用数据
1)编辑docker-compose.yml文件
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预配置为从容器暴露到主机的端口,在这里的配置中,我们直接将端口从主机映射到外部——可以直接通过IP地址进入Redis桌面管理端,从而管理Redis实例。
注意:在Redis规范中,以下几点使数据在stack的不同部署(deployments)中得以保持:
- 永远运行在管理员机上,从而永远使用相同的文件系统;
- 访问主机文件系统中一个任意的文件夹作为‘/data’(在容器中)——Redis用来储存数据
以上两点使得本机的物理文件系统作为Redis数据的储存位置是“唯一真理”,如果没有它们,Redis将会把数据储存在容器的文件系统的/data文件夹中——当容器被重新部署时就会被清空。
这个“唯一真理”包含两个组件:
- ‘placement’约束保证了永远使用同一个主机;
- ‘volume’:让容器将‘./data’(主机上),作为‘data’(Redis容器内部)。无论容器如何变化,储存在特定主机上的‘./data’始终不变,保证了连续性。
2)在管理员机上创建data文件夹
docker-machine ssh myvm1 "mkdir ./data"
3)保证当前shell被配置为与myvm1对话,重新部署应用:
docker stack deploy -c docker-compose.yml getstartedlab
4)运行docker service ls验证服务运行成功;
5)检查任意节点上的网页,如:http://192.168.99.101,查看visitor统计结果;检查运行在8080端口的观察者服务;