本笔记参考 https://docs.docker.com/get-started/part5/
- Containers
- Services
- Swarms
- Stacks
什么是stack
在docker中,stack指的是一组相互关联的服务,它们可以共享依赖关系,并且可以一起协调和缩放。一个stack 能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能需要使用多个stack)
添加一个新服务
在之前的练习中我们已经用制作的image部署了一个web service,现在我们修改 docker-compose.yml, 添加一个叫做visualizer的service 到stack。
- 编辑 docker-compose.yml
version: "3"
services:
web: #service called web
image: misterchi/repositorytest:hello #Pull the image
deploy:
replicas: 5 #five instances
resources:
limits:
cpus: "0.1" #one instance at most 10% of the CPU
memory: 50M #one instance at most 50M memory
restart_policy:
condition: on-failure #Immediately restart containers if one fails
ports:
- "80:80" #map host port 80 with service port 80
networks:
- webnet #share 80 via a load-balanced network called webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes: #giving the visualizer access to the host’s socket file for Docker
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement: #ensuring that this service only ever runs on a swarm manager
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet: #use webnet as default network
- 将shell 连接到 swarm manager node上
#确认 myvm1 和 myvm2 工作正常
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.100:2376 v17.09.1-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.09.1-ce
$ eval $(docker-machine env myvm1)
[myvm1]$
重新部署myClusrerApp
#here docker will try to pull dockersamples/visualizer:stable from docker hub, make sure you have login docker up.
[myvm1]$ docker stack deploy -c docker-compose.yml myClusterApp
Creating network myClusterApp_webnet
Creating service myClusterApp_web
Creating service myClusterApp_visualizer
[myvm1]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
tdyqjjsra3c7 myClusterApp_visualizer replicated 0/1 dockersamples/visualizer:stable *:8080->8080/tcp
ub42lr94rxod myClusterApp_web replicated 5/5 misterchi/repositorytest:hello *:80->80/tcp
- 测试 visulaizer
在浏览器中访问 http://192.168.99.100:8080 或者 http://192.168.99.101:8080
添加Redis server到 stack
接下来继续添加 Redis database 到stack 中为web app 保存 永久数据
- 编辑 docker-compose.yml
version: "3"
services:
web: #service called web
image: misterchi/repositorytest:hello #Pull the image
deploy:
replicas: 5 #five instances
resources:
limits:
cpus: "0.1" #one instance at most 10% of the CPU
memory: 50M #one instance at most 50M memory
restart_policy:
condition: on-failure #Immediately restart containers if one fails
ports:
- "80:80" #map host port 80 with service port 80
networks:
- webnet #share 80 via a load-balanced network called webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes: #giving the visualizer access to the host’s socket file for Docker
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement: #ensuring that this service only ever runs on a swarm manager
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis
ports:
- "6379:6379" #6379, has been pre-configured by Redis to be exposed from the container to the host,
volumes: #file "/home/docker/data" is on host’s file system as /data inside the container, which is where Redis stores data.
- /home/docker/data:/data
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet: #use webnet as default network
- 在 manager node上创建 ./data 文件夹
$docker-machine ssh myvm1 "mkdir ./data"
- 再次重新部署myClusterApp
[myvm1]$ docker stack deploy -c docker-compose.yml myClusterApp
Creating service myClusterApp_redis
Updating service myClusterApp_web (id: ok0mzz6wovsn3e4nb99yeabui)
Updating service myClusterApp_visualizer (id: jonslyz4941hhde7uwp7lud6m)
[myvm1]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ljap8qcahxkf myClusterApp_redis replicated 1/1 redis:latest *:6379->6379/tcp
jonslyz4941h myClusterApp_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
ok0mzz6wovsn myClusterApp_web replicated 5/5 misterchi/repositorytest:hello *:80->80/tcp
$ docker-machine ssh myvm1 "ls ./data/"
appendonly.aof
- 测试
$ curl http://192.168.99.100
<h3>Hello World!</h3><b>Hostname:</b> a0d14ba329ce<br/><b>Visits:</b> 7