安裝 Docker 版本 1.13 或更高版本。 node
獲取第 3 部分先決條件中所述的 Docker Compose。web
獲取 Docker Machine,如第 4 部分先決條件中所述。redis
閱讀第 1 部分中的方向。docker
瞭解如何在第 2 部分中建立容器。shell
確保經過將friendlyhello
鏡像推送到 registry
來發布您建立的friendlyhello
鏡像。咱們在這裏使用那個共享鏡像。數據庫
確保鏡像用做已部署的容器。運行此命令,在信息中鍵入username
, repo
, 和 tag
:docker run -p 80:80 username/repo:tag
,而後訪問http://localhost/
。app
請從第 3 部分得到 docker-compose.yml
的副本。ssh
確保第 4 部分中設置的機器已運行並準備就緒。運行 docker-machine ls
來驗證這一點。若是machines中止,則運行 docker-machine start myvm1
以啓動管理器,而後運行 docker-machine start myvm2
以啓動輔助角色。tcp
讓你在第4部分建立的羣運行並準備就緒。運行 docker-machine ssh myvm1 "docker node ls"
來驗證這一點。若是羣已啓動,則兩個節點都會報告ready
。若是沒有,請從新初始化羣並加入工做人員,如設置羣中所述。編輯器
在第 4 部分中,您學習瞭如何設置一個swarm,即運行 Docker 的machines羣集,並將應用程序部署到該swarm,容器在多臺計算機上協同運行。
在第 5 部分中,您將到達分佈式應用程序的層次結構的頂部: stack
。stack是一組共享依賴項的相互關聯的服務,能夠一塊兒編排和縮放。單個stack可以定義和協調整個應用程序的功能(儘管很是複雜的應用程序可能但願使用多個stack)。
一些好消息是,自第 3 部分以來,您一直在使用stack,此時您建立了一個Compose文件並使用 docker stack deploy
。可是,這是在單個主機上運行的單個服務stack,這一般不是生產環境中發生的狀況。在這裏,您能夠獲取所學知識,使多個服務彼此相關,並在多臺計算機上運行它們。
你作得很好,這是the home stretch!
很容易將服務添加到咱們的 docker-compose.yml
文件中。首先,讓咱們添加一個免費的可視化工具服務,讓咱們看看咱們的羣是如何調度容器的。
在編輯器中打開 docker-compose.yml
,並將其內容替換爲如下內容。請務必將username/repo:tag替換爲image詳細信息。
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:
這裏惟一的新東西是對Web
的平級服務,名爲visualizer
。請注意兩個新內容: volumes
關鍵字,容許可視化工具訪問 Docker 的主機套接字文件,以及placement
關鍵字,確保此服務僅在swarm manager上運行 - 從不爲worker運行。這是由於此容器由 Docker 建立的開源項目構建,顯示在關係圖中的swarm上運行的 Docker 服務。
咱們立刻就更多地討論placement constraints和volumes。
確保shell配置爲與 myvm1
對話(完整示例在此處)。
運行 docker-machine ls 列出計算機並確保已鏈接到 myvm1,如其旁邊的星號所示。
若是須要,請從新運行 docker-machine env myvm1,而後運行給定的命令來配置 shell。
在 Mac 或 Linux 上,命令是:
eval $(docker-machine env myvm1)
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
在manager上從新運行 docker stack deploy
命令,而且須要更新的任何服務都獲得更新:
$ docker stack deploy -c docker-compose.yml getstartedlab Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm) Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
看看visualizer可視化工具。
您在Compose文件中看到可視化工具visualizer
在端口 8080 上運行。經過運行 docker-machine ls 獲取其中一個節點的 IP 地址。轉到端口 8080 中的任一 IP 地址,您能夠看到可視化工具正在運行:
可視化工具visualizer
的單個副本正按預期在manager上運行,而且 Web
的 5 個實例分佈在swarm中。您能夠經過運行 docker stack ps <stack>
來證明此可視化效果:
docker stack ps getstartedlab
可視化工具visualizer
是一個獨立的服務,能夠在包含它在stack中的任何應用中運行。它不依賴於任何其餘內容。如今,讓咱們建立一個確實具備依賴項的服務:提供訪問者計數器的 Redis 服務。
讓咱們再次經過相同的工做流來添加用於存儲應用數據的 Redis 數據庫。
保存此新的 docker-compose.yml
文件,該文件最終添加了 Redis 服務。請務必將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 的簡短image名稱,所以這裏沒有用username/repo表示法。Redis 端口 6379 已由 Redis 預配置,以便從容器向主機公開,在咱們的Compose文件中,咱們將從主機向世界公開它,所以您能夠實際將任何節點的 IP 進入 Redis Desktop Manager 並管理此 Redis實例,若是您選擇。
最重要的是,redis
有一些使數據在此stack部署之間持久的規範:
redis 始終在manager上運行,所以始終使用相同的文件系統。
redis 在容器內以 /data
掛載主機文件系統中的任意目錄,這是 Redis 存儲數據的地方。
總之,這在主機的物理文件系統中爲 Redis 數據建立了一個"真相源"。若是沒有此,Redis 會將其數據存儲在容器文件系統中的 /data
中,若是從新部署該容器,該文件系統將消失。
這個真理之源有兩個組成部分:
在 Redis 服務上標記 placement constraint,確保它始終使用相同的主機。
建立一個 volume ,路徑 ./data
(在主機上)做爲 /data
(在 Redis 容器內)的volume。當容器被拆掉和從新部署時,存儲在指定主機上 ./data
上的文件將保留,從而實現連續性。
您已準備好部署新的 Redis-using stack。
在manager上建立 ./data目錄:
docker-machine ssh myvm1 "mkdir ./data"
確保shell配置爲與 myvm1
對話(完整示例在此處)。
運行 docker-machine ls 列出計算機並確保已鏈接到 myvm1,如其旁邊的星號所示。
若是須要,請從新運行 docker-machine env myvm1,而後運行給定的命令來配置 shell。
在 Mac 或 Linux 上,命令是:
eval $(docker-machine env myvm1)
在 Windows 上,命令是:
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
再運行 docker stack deploy
一次。
$ docker stack deploy -c docker-compose.yml getstartedlab
運行 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 gordon/getstarted:latest *:80->80/tcp
檢查其中一個節點,如http://192.168.99.101
,並查看訪問者計數器的結果,該計數器如今實時顯示並存儲在 Redis 上的信息。
此外,請檢查任一節點的 IP 地址端口 8080 處的可視化工具,並注意到 redis
服務與 Web
和visualizer
服務一塊兒運行。
您瞭解到, stacks是相互關聯的服務,都協同運行,這 - 驚喜!-- 自本教程的第三部分以來,您一直在使用stack。您瞭解到,要向stack添加更多服務,請將它們插入到Compose文件中。最後,您瞭解到,經過使用放置placement constraints 和 volumes的組合,您能夠建立永久的永久主狀態數據,以便在容器被拆掉和從新部署時,應用的數據可以存活下來。