Stack 栈
stack是分布式应用的最顶层。一个stack由一组共享依赖环境、相互关联的服务组成,并且这些服务接受统一协调和拓展。
一个单独的栈便能够完成一个应用的完整定义与功能实现。
比如给之前的应用添加一个监控服务使我们能够了解swarm如何安排容器。在docker-compose.yml
中增加一些新内容:
version: "3"
services:
web:
image: josephthatwho/get-started:part2
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
关键字赋予visualizer使用docker.socker的权限,palcement
关键字确保visualizer服务仅运行在swarm manager上。
部署应用,并访问相应地址<IP:8080>:
$ docker stack deploy -c docker-compose.yml getstartedlab
Creating service getstartedlab_visualizer
Updating service getstartedlab_web (id: yjg179kmv58sh2j1uejn0pttx)
使用redis保存数据
通过和上面相同的工作流程可以添加Redis数据库存储应用数据
- 在
docker-compose.yml
中加入Redis服务:
version: "3"
services:
web:
image: josephthatwho/get-started:part2
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有一个官法镜像名为redis,容器内的Redis的端口号6379已经通过预配置暴露给主机,这里我们通过Compose文件将这个端口开放;
redis镜像中的一些规定确保了整个栈的部署之间数据存储稳定:
- redis只在manager上运行,所以他始终使用同一个文件系统
- redis使用主机上的任意文件夹作为容器内的’/data’目录,并在此目录中存储数据
以上规定在主机的正是物理文件系统中创建了存储Redis数据的真实来源,否则redis会将数据存在容器的’/data’目录,这一目录会随着容器的重新部署而丢失。
在虚拟机myvm1中新建/data目录并重新部署应用:
$ docker-machine ssh myvm1 "mkdir ./data"
$ docker stack deploy -c docker-compose.yml getstartedlab
Creating service getstartedlab_redis
Updating service getstartedlab_web (id: yjg179kmv58sh2j1uejn0pttx)
Updating service getstartedlab_visualizer (id: auue1mby8gwhwasad8g9i1tr9)
访问任一节点的网页,可以看到对访问次数的统计。