堆棧(Stacks)
堆棧(Stacks)
準備工作
- 安裝Docker 1.13及以上版本
- 安裝Docker Compose正如第三部分的準備工作。
- 安裝Docker Machine正如第四部分的準備工作。
- 閱讀第一部分的引導。
- 學習怎麽在第二部分創建容器。
- 確保你已經發布friendlyhello 鏡像,並推送到公共倉庫。我們需要在這一部分用到這個鏡像。
- 確保你的鏡像能夠成為一個被部署的容器能正常工作。
- 從第三篇文章拷貝一份docker-compose.yml
- 確保第四部分的docker machine已經正確安裝,通過docker-machine ls查看。
- 確保docker swarm正確安裝,並且運行。通過執行docker-machine ssh myvm1 “docker node ls 命令驗證。
介紹
在第4部分中,你學習了如何設置一個swarm,這是一群運行Docker的機器,並為其部署了一個應用程序,應用才能修包含的眾多容器在多臺機器上運行。
在第5部分中,你將學習分布式應用程序層次結構的頂部:堆棧。 堆棧是一組相互關聯的服務,它們可以共享依賴關系,並且可以進行協調和伸縮。 單個堆棧能夠定義和協調整個應用程序的功能(盡管非常復雜的應用程序可能需要使用多個堆棧)。
好消息是,從第3部分開始,在創建Compose文件並使用Docker堆棧部署時,從技術上講,你一直在使用堆棧。 但是,這是在單個主機上運行的單個服務堆棧,通常不會發生在生產環境中。 在這裏,你可以把你學到的東西,使多個服務相互關聯,並在多臺機器上運行它們。
你做得很好,這就是主場!
添加一個新服務和重新部署
添加服務到docker-compose文件是非常簡單的。首先,添加一個可視化界面的服務,可以讓我們查看swarm正在調度的容器。
1.打開docker-compose文件,並將以下的內容替換成文件的內容。確保用你的鏡像信息替換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: www.haiyuyule.com on-failure
resources:
limits:
cpus:www.michenggw.com "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:www.qinlinyule.cn/ 8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: www.xuancayule.com/ [node.role == manager]
networks:
- webnet
networks:
這裏新增的唯一東西就是網絡對等服務,名為可視化器。 在這裏註意兩件新事物:一個volumes ,讓可視化工具訪問Docker的主機套接字文件和一個placement 鍵,確保這項服務只能在群集管理器上運行 - 從不是工作者。 這是因為這個容器是由Docker創建的一個開源項目構建的,它顯示了在一個圖表中的Swarm上運行的Docker服務。
我們稍後會詳細討論lacement constraints 和volumes 。
2.確保你的shell被配置為與myvm1進行通信(完整的例子在這如下)。
-
運行docker-machine ls列出機器,並確保您已連接到myvm1,如旁邊的星號所示。
-
如果需要,重新運行docker-machine env myvm1,然後運行給定的命令來配置shell。
在Mac或Linux上,命令是:
eval $(docker-machine www.xuancayule.com/ env myvm1)
- 1
3.在manager上重新運行docker stack deploy命令,並且需要更新的任何服務都會更新:
$ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web www.wanmeiyuele.cn (id: angi1bf5e4to03qu9f93trnxm)
Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
- 查看可視化界面
你在Compose文件中看到,可視化工具在端口8080上運行。通過運行docker-machine ls來獲取其中一個節點的IP地址。 轉到8080端口的IP地址,您可以看到可視化器正在運行:
可視化器的單個副本按照預期在manager上運行,並且網絡的5個實例遍布整個群集。 你可以通過運行docker stack ps 來確認此可視化:
docker stack ps getstartedlab
- 1
- 2
可視化器是一個獨立的服務,可以在包含它的任何應用程序中運行。 它不依賴於其他任何東西。現在讓我們創建一個具有依賴性的服務:提供訪問者計數器的Redis服務。
數據持久化
讓我們再次通過相同的工作流程來添加用於存儲應用程序數據的Redis數據庫。
- 保存這份新的docker-compose.yml文件,它最後添加了一個redis服務。確保用的鏡像信息替換掉username/repo:tag的內容。
version: "3"
services:
web:
# replace username/repo:tag with www.boshenyl.cn 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已經由Redis預先配置為從容器暴露給主機,並且在我們的Compose文件中,我們將它從主機展示給所有容器,因此你可以實際輸入任何IP的IP 節點添加到Redis桌面管理器中並管理此Redis實例,如果願意的話。
最重要的是,redis規範中有幾件事情使數據在這個堆棧的部署之間持久化:
- redis總是在管理器上運行,所以它總是使用相同的文件系統。
- redis在主機文件系統中訪問任意目錄作為容器內的/ data,這是Redis存儲數據的地方。
這就是在主機物理文件系統中為Redis數據創建“source of truth”。 如果沒有這個,Redis會將其數據存儲在容器文件系統中的/ data中,如果該容器曾經被重新部署,該數據將被清除。
真實的數據源(source of truth)由2部分組成:
- 放置在Redis服務上的 placement constraint,確保它始終使用相同的主機。
- 創建的volume ,允許容器作為/ data(位於Redis容器內)訪問./data(在主機上)。 在容器重復開啟和關閉時,存儲在指定主機上的./data文件仍然存在,從而保持連續性。
2.在manager上創建一個./data目錄
docker-machine ssh myvm1 "mkdir ./data"
- 1
- 2
3.確保你的shell被配置為與myvm1進行通信(完整的例子在這裏)。
- 運行docker-machine ls命令,列出所有的機器和確保你已經連上myvm1。
- 如果需要,重新運行docker-machine env myvm1命令,然後再運行以下命令:
eval $(docker-machine env myvm1)
- 1
- 運行docker stack deploy命令
$ docker stack deploy -c docker-compose.yml getstartedlab
- 1
5.運行docker service ls命令,去驗證這三個服務跟預期一樣正常運行。
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
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.查看你的機器的一個節點的web頁面,比如http://192.168.99.101,並且查看訪客計數的結果,該計數現在已經存在並將信息存儲在Redis上。
另外,請檢查任一節點IP地址的端口8080處的可視化工具,並註意查看隨Web和可視化工具一起運行的redis服務
堆棧(Stacks)