docker 入門4 - 羣 【翻譯】

開始,第 4 部分:羣

先決條件

  • 安裝 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 Toolboxdocker

  • 閱讀第 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羣集

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

一個swarm由多個節點組成,這些節點能夠是物理節點,也能夠是虛擬機。基本概念很簡單:運行 docker swarm init 以啓用swarm mode,使當前機器成爲swarm manager,而後在其餘機器上運行 docker swarm join ,讓他們加入成羣的workers。選擇下面的選項卡,查看在各類上下文中如何發揮。咱們使用 VM 快速建立一個雙機羣集並將其轉換爲swarm。

建立一個羣集

本地機器上的 VMS(MAC、LINUX、WINDOWS 7 和 8)

您須要一個能夠建立虛擬機 (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

 

本地機器上的 VMS (WINDOWS 10)

首先,快速建立一個虛擬交換(virtual switch),供虛擬機 (VM) 共享,以便它們能夠相互鏈接。

  1. 啓動 Hyper-V 管理器
  2. 點擊右鍵菜單中的 Virtual Switch Manager(虛擬交換機管理器)
  3. 點擊類型爲 External(外部) 的 Create Virtual Switch(新建虛擬交換機)
  4. 命名爲 myswitch,選中複選框以共享主機的活動網絡適配器。

如今,使用 Docker 提供的節點管理工具 docker-machine 建立 2 臺虛擬機:

 
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2

 

列出 VMS 並獲取其 IP 地址

您如今建立了兩個 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

 

初始化 swarm 並添加節點

第一臺計算機充當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

在swarm集羣 manager上部署應用

艱難的部分結束了。如今,您只需重複第 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 而異,所以下面的選項卡上顯示了每一個命令的示例。

MAC 或 LINUX 上的 DOCKER MACHINE SHELL環境

運行 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

 

WINDOWS上的 DOCKER MACHINE SHELL環境

運行 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

 

在swarm manager上部署應用

如今,您已經擁有 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 地址反映了這一點。

清理和從新啓動

Stacks 和 swarms

您可使用 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部分,因此保持它周圍如今。

取消 docker-machine shell變量設置

您可使用給定命令取消設置當前 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 machines

若是關閉本地主機,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
 
相關文章
相關標籤/搜索