安裝 Docker 版本 1.13 或更高版本。node
獲取第 3 部分先決條件中所述的 Docker Compose。web
獲取 Docker Machine
, Mac 的 Docker 桌面版和 Windows 的 Docker 桌面版預裝了Docker Machine
,但在 Linux 系統上,您須要另外單獨安裝它。在 Windows 10 系統之前沒有 Hyper-V
,以及 Windows 10 Home上,請使用 Docker Toolbox
。docker
閱讀第 1 部分中的方向。shell
瞭解如何在第 2 部分中建立容器。瀏覽器
確保經過將friendlyhello
鏡像推送到registry.來發布您建立的友好鏡像。咱們在這裏使用那個共享鏡像。網絡
確保映像用做已部署的容器。運行此命令,在信息中鍵入username、repo和tag:docker run -p 80:80 username/repo:tag
,而後訪問http://localhost/
。session
請從第 3 部分得到 docker-compose.yml
的副本。app
在第 3 部分中,您採起了您在第 2 部分中編寫的應用,並經過將其轉換爲服務來定義它在生產環境中應如何運行,在此過程當中將其擴展爲 5 個負載。ssh
在第 4 部分中,您將此應用程序部署到一個羣集,並在多臺計算機上運行它。經過將多臺計算機加入稱爲swarm的"Dockerized"羣集,能夠實現多容器、多計算機應用程序。tcp
swarm是運行 Docker 並加入羣集的一組計算機。發生這種狀況後,您繼續運行您習慣的 Docker 命令,但如今這些命令由swarm manager在羣集上執行。swarm中的計算機能夠是物理的,也能夠是虛擬的。加入swarm後,它們稱爲節點nodes。
Swarm managers可使用多種策略來運行容器,例如"emptiest node",這種節點用容器填充利用率最低的計算機。或"global",確保每臺計算機只獲得指定容器的一個實例。您指示羣管理器在"Compose"文件中使用這些策略,就像您已經使用的策略同樣。
Swarm managers是swarm中惟一能夠執行命令或受權其餘機器加入swarm做爲workers的計算機。Workers只是在那裏提供能力,沒有權力告訴任何其餘機器,它能夠作什麼,不能作什麼。
到目前爲止,您一直在本地計算機上以單主機模式使用 Docker。可是Docker也能夠切換到swarm mode,這就是容許使用羣的緣由。啓用swarm mode可當即使當前計算機成爲swarm manager。從那時起,Docker 會運行您在管理的swarm上執行的命令,而不只僅是在當前計算機上執行的命令。
一個swarm由多個節點組成,這些節點能夠是物理節點,也能夠是虛擬機。基本概念很簡單:運行 docker swarm init
以啓用swarm mode,使當前機器成爲swarm manager,而後在其餘機器上運行 docker swarm join
,讓他們加入成羣的workers。選擇下面的選項卡,查看在各類上下文中如何發揮。咱們使用 VM 快速建立一個雙機羣集並將其轉換爲swarm。
您須要一個能夠建立虛擬機 (VM) 的虛擬機管理程序,所以爲計算機的操做系統安裝 Oracle VirtualBox。
注意:若是您使用的是安裝了 Hyper-V 的 Windows 系統(如 Windows 10),則無需安裝 VirtualBox,而應改用 Hyper-V。請接下來查看 本地機器上的 VMS (WINDOWS 10) 部分。若是您使用的是 Docker Toolbox,則應該已經安裝了 VirtualBox 做爲它的一部分,所以您能夠繼續。
如今,使用 Docker-machine使用 VirtualBox 驅動程序建立幾個 VM:
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
首先,快速建立一個虛擬交換(virtual switch),供虛擬機 (VM) 共享,以便它們能夠相互鏈接。
如今,使用 Docker 提供的節點管理工具 docker-machine 建立 2 臺虛擬機:
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2
您如今建立了兩個 VM,分別名爲 myvm1 和 myvm2。
使用此命令能夠列出計算機並獲取其 IP 地址。
注意:您須要做爲管理員運行如下操做,不然您不會得到任何合理的輸出(只有"UNKNOWN")。
docker-machine ls
下面是此命令的示例輸出。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm1 - virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce
第一臺計算機充當manager,執行管理命令並驗證workers加入swarm,第二臺計算機是worker。
您可使用 docker-machine ssh
向 VM 發送命令。指示 myvm1
成爲具備 docker swarm init
的swarm manager ,並查找以下所示的輸出:
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>" Swarm initialized: current node <node ID> is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token <token> \ <myvm ip>:<port> To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
端口 2377 和 2376 始終指定2377端口(swarm管理端口)運行
docker swarm init
和docker swarm join
,或者根本不指定端口,並讓它採用默認值。
docker-machine ls
返回的計算機 IP 地址包括端口 2376,即 Docker 守護進程端口。請勿使用此端口,不然可能會遇到錯誤。使用 SSH 時遇到問題?嘗試 --native-ssh 標誌 Docker Machine 能夠選擇容許您使用本身的系統的 SSH,若是因爲某種緣由,您沒法向 Swarm manager發送命令。只需在調用
ssh
命令時指定--native-ssh
標誌:docker-machine --native-ssh ssh myvm1 ...
如您所見,對 docker swarm init
的響應包含一個預配置的 docker swarm join
命令,用於在要添加的任何節點上運行。複製此命令,並經過 docker-machine ssh
將其發送到 myvm2
,以便 myvm2
以worker身份加入您的新swarm:
$ docker-machine ssh myvm2 "docker swarm join \ --token <token> \ <ip>:2377" This node joined a swarm as a worker.
恭喜你,你創造了你的第一個swarm!
在manager上運行 docker node ls
以查看此swarm中的節點:
$ docker-machine ssh myvm1 "docker node ls" ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS brtu9urxwfd5j0zrmkubhpkbd myvm2 Ready Active rihwohkh3ph38fhillhhb84sk * myvm1 Ready Active Leader
離開 swarm
若是要從新開始,能夠從每一個節點運行
docker swarm leave
。
艱難的部分結束了。如今,您只需重複第 3 部分中用於在新swarm上部署的過程。請記住,只有像 myvm1 這樣的swarm manager執行 Docker 命令;worker只是爲了能力。
docker-machine
shell配置swarm manager到目前爲止,您一直在 Docker machine ssh
中包裝 Docker 命令,以便與 VM 通訊。另外一個選項是運行 docker-machine env <machine>
獲取並運行一個命令,該命令將當前 shell 配置爲與 VM 上的 Docker 守護進程。此方法對下一步效果更好,由於它容許您使用本地 docker-compose.yml
文件"遠程"部署應用,而無需在任何地方複製它。
鍵入 docker-machine env myvm1
,而後複製粘貼並運行做爲輸出的最後一行提供的命令,以配置 shell 以與羣管理器 myvm1
對話。
配置 shell 的命令因您是 Mac、Linux 仍是 Windows 而異,所以下面的選項卡上顯示了每一個命令的示例。
運行 docker-machine env myvm1
以獲取命令,將 shell 配置爲與 myvm1
通訊。
$ docker-machine env myvm1 export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.100:2376" export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1" export DOCKER_MACHINE_NAME="myvm1" # Run this command to configure your shell: # eval $(docker-machine env myvm1)
運行給定命令以配置 shell 以與 myvm1 對話。
eval $(docker-machine env myvm1)
運行 docker-machine ls
以驗證 myvm1
如今是否爲活動計算機,如其旁邊的星號所示。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm1 * virtualbox Running tcp://192.168.99.100:2376 v17.06.2-ce myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.06.2-ce
運行 docker-machine env myvm1
以獲取命令,將 shell 配置爲與 myvm1
通訊。
PS C:\Users\sam\sandbox\get-started> docker-machine env myvm1 $Env:DOCKER_TLS_VERIFY = "1" $Env:DOCKER_HOST = "tcp://192.168.203.207:2376" $Env:DOCKER_CERT_PATH = "C:\Users\sam\.docker\machine\machines\myvm1" $Env:DOCKER_MACHINE_NAME = "myvm1" $Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true" # Run this command to configure your shell: # & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
運行給定命令以配置 shell 以與 myvm1 對話。
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
運行 docker-machine ls
以驗證 myvm1
如今是否爲活動計算機,如其旁邊的星號所示。
PS C:PATH> docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm1 * hyperv Running tcp://192.168.203.207:2376 v17.06.2-ce myvm2 - hyperv Running tcp://192.168.200.181:2376 v17.06.2-ce
如今,您已經擁有 myvm1
,您可使用其做爲swarm manager的能力,經過使用第 3 部分到 myvm1
中使用的 docker stack deploy
命令以及 docker-compose.yml
的本地副原本部署應用。此命令可能須要幾秒鐘才能完成,部署須要一些時間才能可用。在swarm manager上使用 docker service ps <service_name>
命令來驗證全部服務是否已從新部署。
您經過 docker-machine shell
配置鏈接到 myvm1
,而且您仍然能夠訪問本地主機上的文件。請確保您與以前位於同一目錄中,其中包括在第 3 部分中建立的 docker-compose.yml
文件。
與以前同樣,運行如下命令在 myvm1 上部署應用。
docker stack deploy -c docker-compose.yml getstartedlab
就是這個,應用程序被部署在羣集羣上!
注意:若是鏡像存儲在專用registry而不是 Docker Hub 上,則須要使用
docker login <your-registry>
登陸,而後須要將--with-registry-auth
標誌添加到上述命令。例如:docker login registry.example.com docker stack deploy --with-registry-auth -c docker-compose.yml getstartedlab
這將使用加密的 WAL 日誌將登陸令牌從本地客戶端傳遞到部署服務的swarm節點。有了此信息,節點可以登陸到registry並提取鏡像。
如今,您可使用第 3 部分中使用的相同 docker 命令。只有此時請注意,服務(和關聯的容器)已在 myvm1
和 myvm2
之間分發。
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE jq2g3qp8nzwx getstartedlab_web.1 gordon/get-started:part2 myvm1 Running 88wgshobzoxl getstartedlab_web.2 gordon/get-started:part2 myvm2 Running vbb1qbkb0o2z getstartedlab_web.3 gordon/get-started:part2 myvm2 Running ghii74p9budx getstartedlab_web.4 gordon/get-started:part2 myvm1 Running 0prmarhavs87 getstartedlab_web.5 gordon/get-started:part2 myvm2 Running
使用 docker-machine env 和 docker-machine ssh 鏈接到 VM
- 要將 shell 設置爲與 myvm2 等其餘計算機通話,只需在同一或不一樣的 shell 中從新運行 docker-machine env,而後運行給定命令以指向 myvm2。這始終特定於當前shell。若是更改成未配置的 shell 或打開新shell,則須要從新運行命令。使用 docker-machine ls 列出計算機,查看計算機所處的狀態,獲取 IP 地址,並找出您鏈接到哪一個計算機(若是有)。要了解更多信息,請參閱 Docker 計算機入門主題。
- 或者,您能夠以 docker-machine ssh ""的形式包裝 Docker 命令,該命令直接登陸到 VM,但不容許您當即訪問本地主機上的文件。
- 在 Mac 和 Linux 上,您可使用 docker-machine scp :* 跨計算機複製文件,但 Windows 用戶須要像 Git Bash 這樣的 Linux 終端模擬器才能正常工做。
本教程演示了 docker-machine ssh 和 docker-machine env,由於這些都經過 docker-機器 CLI 在全部平臺上均可用。
能夠從 myvm1 或 myvm2 的 IP 地址訪問你的應用。
您建立的網絡在它們之間共享,而且負載平衡。運行 docker-machine ls 以獲取 VM 的 IP 地址,並在端口 4000 上的瀏覽器上訪問其中任一地址,而後刷新(或只是捲曲它們)。
有五個可能的容器 IDs 所有隨機循環,演示負載平衡。
兩個 IP 地址工做的緣由是,swarm中的節點參與入口路由網格。這可確保部署在羣內特定端口上的服務始終保留該端口,而無論實際運行容器的節點是什麼。下圖顯示了在三節點羣上在端口 8080 上發佈的服務的路由網格的外觀:
鏈接問題?
請記住,要在羣中使用入口網絡,須要在羣節點之間打開如下端口,而後才能啓用羣模式:
- 端口 7946 TCP/UDP 用於容器網絡發現。
- 端口 4789 UDP 的容器入口網絡。
仔細檢查您在 Web 服務下的端口部分的內容,並確保您在瀏覽器或卷中輸入的 IP 地址反映了這一點。
您可使用 docker stack rm
拆解stack。例如:
docker stack rm getstartedlab
保持蜂羣或刪除它?
稍後,若是您想要 "docker-machine ssh myvm2 "docker swarm leave" 在worker上 docker-machine ssh myvm1 "docker swarm leave --force" 在manager上,但你須要這個swarm爲第5部分,因此保持它周圍如今。
您可使用給定命令取消設置當前 shell 中的 docker-machine 環境變量。
在 Mac 或 Linux 上,命令是:
eval $(docker-machine env -u)
在 Windows 上,命令是:
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env -u | Invoke-Expression
這將斷開 shell 與 Docker 計算機建立的虛擬機的鏈接,並容許您繼續在同一個 shell 中工做,如今使用本機 docker 命令(例如,在 Docker 桌面上用於 Mac 或 Docker 桌面(用於 Windows)。要了解更多信息,請參閱有關取消設置環境變量的"計算機"主題。
若是關閉本地主機,Docker 計算機將中止運行。您能夠經過運行 docker-machine-machine ls 來檢查機器的狀態。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm1 - virtualbox Stopped Unknown myvm2 - virtualbox Stopped Unknown
要從新啓動已中止的計算機,請運行:
docker-machine start <machine-name>
例如:
$ docker-machine start myvm1 Starting "myvm1"... (myvm1) Check network to re-create if needed... (myvm1) Waiting for an IP... Machine "myvm1" was started. Waiting for SSH to be available... Detecting the provisioner... Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command. $ docker-machine start myvm2 Starting "myvm2"... (myvm2) Check network to re-create if needed... (myvm2) Waiting for an IP... Machine "myvm2" was started. Waiting for SSH to be available... Detecting the provisioner... Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
在第 4 部分中,您瞭解了swarm是什麼,羣中的節點如何成爲manager或worker,建立了一個swarm,並在其上部署了應用程序。您看到核心 Docker 命令沒有從第 3 部分更改,它們只需針對在swarm主機上運行。您還看到了 Docker 網絡在運行中的強大功能,它保持了跨容器的負載平衡請求,即便這些請求在不一樣的計算機上運行也是如此。最後,您學習瞭如何在羣集上迭代和縮放應用。
下面是一些命令,您可能但願運行這些命令來與swarm和 VM 進行一些交互:
docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux) docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10 docker-machine env myvm1 # View basic information about your node docker-machine ssh myvm1 "docker node ls" # List the nodes in your swarm docker-machine ssh myvm1 "docker node inspect <node ID>" # Inspect a node docker-machine ssh myvm1 "docker swarm join-token -q worker" # View join token docker-machine ssh myvm1 # Open an SSH session with the VM; type "exit" to end docker node ls # View nodes in swarm (while logged on to manager) docker-machine ssh myvm2 "docker swarm leave" # Make the worker leave the swarm docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm docker-machine ls # list VMs, asterisk shows which VM this shell is talking to docker-machine start myvm1 # Start a VM that is currently not running docker-machine env myvm1 # show environment variables and command for myvm1 eval $(docker-machine env myvm1) # Mac command to connect shell to myvm1 & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression # Windows command to connect shell to myvm1 docker stack deploy -c <file> <app> # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app) docker-machine ssh myvm1 "docker stack deploy -c <file> <app>" # Deploy an app using ssh (you must have first copied the Compose file to myvm1) eval $(docker-machine env -u) # Disconnect shell from VMs, use native docker docker-machine stop $(docker-machine ls -q) # Stop all running VMs docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images