Docker入门(六):Stacks
這個《Docker入門系列》文檔,是根據Docker官網(https://docs.docker.com)的幫助文檔大致翻譯而成。主要是作為個人學習記錄。有錯誤的地方,Robin歡迎大家指正。分為如下幾個部分:
1 Docker入門:簡介
2 Docker入門:安裝運行
3 Docker入門:容器(Containers)
4 Docker入門:服務(Services)
5 Docker入門:Swarms
6 Docker入門:Stacks
7 Docker入門:部署app
8 Docker入門:稍高級的話題
6.1 引言
在第五部分,我們學習了如何搭建一個swarm。一個swarm就是運行著Docker的一組機器所組成的集群。然后學習了如何將app部署到swarm上,并讓許多容器一致地運行在多個機器上。
在第六部分,我們將進入一個分布式應用程序層次結構的最高層:stack。
|
stack |
|
service |
|
container |
一個stack就是一組相互關聯的services,這些services之間相互依賴,并能夠一起進行編排和scale。單個stack就能夠定義和協調整個應用程序的功能(也存在一些復雜的應用程序,可能使用多個stacks)。
好消息是,我們從第四部分就已經接觸stack了:創建一個Compose文件并使用docker stack deploy。但那只是一個單service的stack,運行在單個主機上,這種情況極少在產品部署中使用。下面,我們將使多個services相互關聯,并將它們運行在多個機器上。
6.2 添加一個新的service并重新部署
向我們的docker-compose.yml文件中添加services很簡單。首先,添加一個免費的visualizer service,該service用于查看swarm是如何調度容器的。
分為如下4個步驟。
6.2.1 重新編輯Compose文件
用編輯器打開文件docker-compose.yml,并輸入如下內容,確保用你的映像信息替換uername/repo:tag部分。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80: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:
在該.yml文件中,添加了一個和web平行的service,名稱為visualizer。還有兩個新的關鍵字。一個是關鍵字volumes,用于給visualizer提供權限,從而訪問主機上的Docker socket文件。另一個關鍵字是placement,用于確保這個service只能運行在swarm manager上,而不能運行在worker節點上。因為這個容器構建自Docker開源項目,用來以圖表方式展示一個swarm上運行的services。
6.2.2 配置和swarm manager對話的shell
確保你的shell已經配置好,能夠和myvm1進行對話:
● 運行命令docker-machine ls,來列出所有的machines,并確保你已經連上myvm1了,能夠發現myvm1旁邊有星號。
● 如果需要,就重新運行命令docker-machine env myvm1,然后運行給出的命令來配置shell。
在MAC/LINUX系統里,這個命令是:
eval $(docker-machine env myvm1)
在WINDOWS系統里,這個命令是:
& "C:Program FilesDockerDockerResourcesindocker-machine.exe" env myvm1 | Invoke-Expression
6.2.3 重新部署
在manager上重新運行命令docker stack deploy,更新需要更新的services:
$ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
Updating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
6.2.4 查看visualizer服務
在Compose文件里,visualizer運行在端口8080上。運行docker-machine ls來獲得任一個節點的IP地址,進入該IP的8080端口來看看visulizer的運行情況:
和期望中的一樣,visualizer的單個實例運行在manager上,web的5個實例分布在整個swarm上。你可以運行命令docker stack ps <stack>來佐證一下visualizer的展示結果:
docker stack ps getstartedlab
visualizer是一個獨立的服務,在stack中,它可以運行在任何app里。它不依賴任何東西。下面我們創建一個具有依賴性的service:能夠提供訪客計數功能的Redis service.
6.3 數據持久化
我們再一次使用之前的工作流程,來添加一個Redis數據庫service,用以存儲app的數據。分為如下六個步驟。
6.3.1 修改Compose文件
修改docker-compose.yml文件,內容如下面所示,這將添加一個Redis service。確保用你自己的映像信息來取代username/repo:tag部分。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80: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在Docker庫中有一個官方的映像,所以可以使用簡寫的映像名稱redis,這里就不需要username/repo了。Redis已經將端口6379從容器暴露到主機,在Compose文件里,我們將該端口從主機暴露到外面的世界,所以你可以通過任一個節點的IP來訪問Redis桌面管理器,從而管理這個Redis實例。
還有一些重要的Redis規范,用于指導stack多次部署時的數據持久化:
Redis總是運行在manager上,所以它總是可以使用相同的文件系統;
通過訪問容器中的目錄/data,redis能夠訪問主機文件系統中的任何目錄,Redis在該目錄中存儲數據。
以上兩點結合在一起,就可以在主機的物理文件系統中為Redis數據創建一個事實上的源(source of truth)。如果沒有這個機制,Redis就會在容器的文件系統中的/data目錄下存儲數據,一旦容器重新部署,這些數據就會丟失。
“source of truth”包含兩個部分:
Placement: 放置在Redis service上的這個約束,保證了Redis service總是使用相同的主機。
volume: 這個關鍵字的配置,使得容器通過訪問Redis容器中的/data目錄,來間接訪問主機上的/data目錄。換句話說,這讓容器的數據訪問透明化,雖然容器邏輯上訪問的是Redis容器中的/data目錄,而實際上容器訪問的是主機上的/data目錄。
6.3.2 在manager上創建目錄
在manager上創建一個./data目錄:
docker-machine ssh myvm1 "mkdir ./data"
6.3.3 配置和swarm manager對話的shell
確保你的shell已經配置好,能夠和myvm1進行對話:
● 運行命令docker-machine ls,來列出所有的machines,并確保你已經連上myvm1了,能夠發現myvm1旁邊有星號。
● 如果需要,就重新運行命令docker-machine env myvm1,然后運行給出的命令來配置shell。
在MAC/LINUX系統里,這個命令是:
eval $(docker-machine env myvm1)
在WINDOWS系統里,這個命令是:
& "C:Program FilesDockerDockerResourcesindocker-machine.exe" env myvm1 | Invoke-Expression
6.3.4 重新部署
再一次運行命令docker stack deploy:
$ docker stack deploy -c docker-compose.yml getstartedlab
6.3.5 確認service運行狀況
運行命令docker service ls,來確認3個services是否正常運行:
$ docker service ls
ID NAME MODE REPLICAS IMAGEPORTS
x7uij6xb4foj getstartedlab_redis replicated 1/1 redis:latest *:6379->6379/tcp
n5rvhm52ykq7 getstartedlab_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
mifd433bti1d getstartedlab_web replicated 5/5 orangesnap/getstarted:latest *:80->80/tcp
6.3.6 網頁驗證
選擇一個節點的IP地址(比如:http://192.18.99.101)進入其網頁,就可以看到訪客的統計數量,這個數據會一直更新并存儲在Redis上。
同樣,選擇任一個節點的IP地址,在其端口8080上訪問visulizer,就可以看到web、redis、visualizer三種服務一起運行。
6.4 總結
Stacks就是一組一致運行的、相互關聯的services。通過修改Compose文件,可以向stack中添加更多的services。最后,通過使用placement和volumes兩個關鍵字的組合,為持久化數據創建了一個永久的港灣,無論容器關閉或重新部署,app的數據會一直保存下來。
總結
以上是生活随笔為你收集整理的Docker入门(六):Stacks的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库工单的主要业务流程
- 下一篇: footer固定在页面底部的几种方法(转