標籤:開啟 src detail rate == web mac pos yml
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,分布為:
也可以使用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: - webnetnetworks: 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