stack介紹
stack是一組共享依賴,可以被編排並具備擴展能力的關聯service。舉例來說就是在swarm那章描述docker層次架構時,說stack就是一個完整的服務--它可以由基於flask框架的web service和redis數據庫service構成。
這個stack中的service的web部分由多個container組成,它們共享依賴。
這個stack還可以加入其它service--比如nginx,所以stack具備被編排的能力。
當需要更大的處理需求時,在數據庫能承受的情況下,可以擴展swarm的機器數量,重新部署這個stack就能獲得更大的處理能力,stack就具備擴展能力。
給stack添加新service
整個stack只有一個名為web的service,現在添加docker可視化監控軟件和redis數據庫。
docker-compose.yml
version: "3"
services:
web:
image: cchenyang/get-started:part2
deploy:
replicas: 3
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
# immediately restart containers if one fails
condition: on-failure
# map port 8001 on the host to web's port 8001
ports:
- "8001:8001"
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:
這里新添加了兩個service--visualizer和redis。
配置項解析
volumes是將docker外界的文件映射到docker中。"/var/run/docker.sock:/var/run/docker.sock"就是將機器自身的docker.sock文件映射放到visualizer整個service的container的指定目錄下。docker container只能通過這種映射的方式讀寫container外的文件。redis這個service中的volumes也是同理,這個redis配置的持久化文件保存目錄是/data,通過映射,將/data文件映射到外部機器的/home/docker/data文件夾下,實現持久化存儲。
placement下的constraints限制visualizer和redis只能在manager下運行。
注意這里的command,web和visualizer這兩個服務,開啟container就會運行。通過docker container ls
就可以發現,web的container的command是python app.py
,visulizer的command是npm start
,唯獨redis不是什么啟動命令,而是執行的sh文件。通過https://docs.docker.com/samples/
找到它的構建命令,發現只是在做設置,冰沒有啟動redis。所以在部署的時候,需要再添加啟動的command。數據庫的確應該在配置好外部文件映射后才啟動。
重新部署stack
docker stack deploy -c docker-compose.yml getstartedlab
重新執行一遍。
系列導航
docker入門1-docker container
docker入門2-docker service
docker入門3-docker swarm