Docker Get Started V
5. Stacks
介紹
在第4部分,你已經學會如何配置一個蜂群,蜂群是一個運行著docker的集群,然後你將app部署到這個蜂群上,容器運行在多個機器上。
在第5部分,我們馬上介紹分布式應用層級的最上層的概念stack。一個stack是一組共享依賴的內部相關的服務,這些服務能夠被一起編排和伸縮。單獨的一個stack能夠定義和協調整個應用的功能,一些復雜的應用可能需要定義多個stack。
不要慌,從第3部分開始,我們就已經接觸到了stack,前面我們創建compose文件,然後運行docker stack deploy,這些都是和stack相關的內容。但是前面我們接觸的都是運行在單臺機器上的包含單個服務的stack,這個在生產環境中不常見。接下來,運用之前學到的知識,我們來創建多個相關的服務,然後運行在多臺機器上。
增加一個Service 重新部署
修改docker-compose.yml文件很容易添加一個服務。首先我們增加一個免費的可視化服務,這個服務可以讓我們看我們的蜂群是如何調度我們的容器的。
- 打開docker-compose.yml文件,修改為如下內容:
version: "3" services: web: # replace username/repo:tag with your name and image details image: dockerjie/get-started:part2 deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000: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:
註意上面有兩個新的配置項,volumes,運行可視化服務訪問宿主機的Docker的socket文件,placement則確保服務被部署在蜂群管理器swarm manager上面,而不是worker上,因為可視化服務是顯示蜂群概覽信息的,僅僅管理器才有權限獲取到這些信息。
- 確保你的shell連接到myvm1機器上。docker-machine start $(docker-machine ls -q)啟動所有機器
- 運行docker-machine ls確保你連接到myvm1上。如果出現ip地址對應的cert不對應,則重新運行命令生成cert,docker-machine regenerate-certs $(docker-machine ls -q)
2. 如有必要運行 eval \$(docker-machine env myvm1)
- 在蜂窩管理器上重新運行 docker stack deploy
docker stack deploy -c docker-compose-yml getstartedlab
部署完成後查看服務:
訪問可視化服務:
可以看到兩個服務:visualizer和web均已經啟動,且web服務的副本數量為5,分布為:
- myvm1*1
- myvm2*2
- myvm3*2
也可以使用docker命令查看:
docker stack ps getstartedlab
持久化數據
到現在為止,我們的web服務中依賴的redis服務還沒有配置。
- 修改docker-compose文件,增加redis服務
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: dockerjie/get-started:part2
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000: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有官方的鏡像,因此具有一個short name redis。6379是redis容器預先配置的端口,需要對外暴露的,我們也暴露這個端口給宿主機。有兩個額外的配置只得註意:
- redis一直運行在manager上,因此它一直運行在相同的文件系統上,因為是同一個宿主機。
- redis訪問宿主機上的文件夾作為/data目錄,redis將數據存儲到這裏。
redis需要持久化數據到容器裏的/data目錄,而容器啟動, 停止後,裏面的數據都沒有了。因此為了持久化數據,需要將容器的某些目錄映射到宿主機上,這樣數據才會被真正的持久化。
- 在manager宿主機上創建data目錄
docker-machine ssh myvm1 "mkdir ./data"
- 部署
docker stack deploy -c docker-compose.yml getstartedlab
查看瀏覽器驗證:
查看持久化生效:
Docker Get Started V