本筆記參考 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