文中內容摘自Docker官網
提醒:請務必使用root帳號,以免在後面應用系統部署時,發生權限問題。
介紹
前一篇文中介紹的負載均衡是運行在一臺計算機上的。此處要介紹的是應用在多臺計算機上的運行,以及加入多臺計算機到一個稱之爲蜂羣的塢化的集羣。
理解蜂羣式集羣
蜂羣是一組運行Docker且加入集羣的計算機。你可以在蜂羣管理器上執行命令進行管理。在蜂羣裏的計算機可以是物理機也可以是虛擬機,加入蜂羣后,它們被視爲節點。
蜂羣管理器使用多種運行容器的策略,例如:“最空閒節點” ——用儘可能少的服務器加載容器;“Global”——確保每一個服務器加載指定容器的一個實例。可以通過配置文件指示蜂羣管理器使用這些策略。
蜂羣管理器是專門用於執行蜂羣管理命令,以及對作爲“工蜂”而加入蜂羣的計算機進行認證。“工蜂”僅僅是提供加載容器的資源,而不負責認證以及告訴其他計算機能做什麼不能做什麼。
Docker可以被切換到蜂羣模式。立即啓用蜂羣模式,可以使計算機成爲蜂羣管理器。隨後,Docker在蜂羣上運行你下的指令,而不僅僅在當前計算機上執行命令。
啓動蜂羣
通過執行下列命令可以啓動蜂羣並將當前計算機升級成一個蜂羣控制器:
docker swarm init
然後,你可以使用 docker swarm join 語句將其他計算機添加入蜂羣。下面我們以虛擬機的形式快速構建建立在兩臺計算機基礎上的蜂羣。
創建集羣
現在,使用docker-machine命令創建一組虛擬機:
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
注:如何安裝docker-machine 參考:https://docs.docker.com/machine/install-machine/;如何加速執行docker-machine create指令,可以參考https://segmentfault.com/a/1190000017001848
完成集羣創建後,可以使用docker-machine ls指令查看各虛擬機的狀態和IP地址:
root@ONE:~$ sudo docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.103:2376 v18.09.0
myvm2 - virtualbox Running tcp://192.168.99.102:2376 v18.09.0
初始化蜂羣添加節點
第一臺執行執行管理命令加入蜂羣的計算機作爲管理員,其後加入蜂羣的作爲工蜂。你可以執行docker-machine ssh命令將myvm1變成蜂羣管理員:
root@one:~$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.103"
Swarm initialized: current node (wp37lr3f8stkrctxhikhgou58) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-01q3o8ihej83sznuwymqd6r8xz0nclgqm0q47x6zqe3qyupqw7-ev2idxap6t1i7owv413gluz68 192.168.99.103:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上述192.168.99.103是虛擬機myvm1的實際IP地址。指令反饋信息中的token在後續添加其它管理員的時候使用,也可以通過下列指令獲取:
sudo docker-machine ssh myvm1 "docker swarm join-token -q manager"
若要獲取添加工蜂用的token,則使用下列語句:
sudo docker-machine ssh myvm1 "docker swarm join-token -q worker"
端口 2377 和 2376
執行docker swarm init 及 docker swarm join 指令使用2377端口號(蜂羣管理端口),執行docker-machine ls指令使用2376端口,2376是Docker的守護端口。
使用--native-ssh ssh選項可以向指定計算機發送指令。下面的指令格式可以理解爲讓計算機machine執行雙引號內的命令:
docker-machine --native-ssh ssh <machine> "..."
該命令登錄虛擬機後,默認目錄爲/home/docker。
現在你可以使用 docker swarm join 語句將myvm2作爲工蜂加入蜂羣,注意,這裏的token是worker的token:
sudo docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-01q3o8ihej83sznuwymqd6r8xz0nclgqm0q47x6zqe3qyupqw7-7jpfkstbte1fkzvu7s1zf0ofv 192.168.99.103:2377"
使用 docker node ls 語句可以查看蜂羣節點信息:
root@ONE:~$ docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
wp37lr3f8stkrctxhikhgou58 * myvm1 Ready Active Leader 18.09.0
icmgmmbl9uiehq05bl2l56dld myvm2 Ready Active 18.09.0
如果需要重新開始,可以執行 docker swarm leave --force語句移除每個節點。
在蜂羣上部署應用程序
激活管理員
之前,使用docker-machine SSH包裝docker命令,以便與虛擬機對話,現在還有另一個渠道,即運行docker-machine env <machine>獲取一個可以運行在虛擬機守護進程的命令。此方法允許您使用本地docker-compose.yml文件“遠程”部署應用程序,而無需將其複製到任何地方。
鍵入並運行docker-machine env myvm1(管理員)。
root@ONE:~# docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)
複製粘帖並運行最後一行輸出的命令
eval $(docker-machine env myvm1)
此時,可以用docker-machine ls命令查看到myvm1處於激活狀態(ACTIVE列有個星號*)
root@ONE:/usr/local/docker# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.101:2376 v18.09.1
myvm2 - virtualbox Running tcp://192.168.99.100:2376 v18.09.1
在此時,運行任何docker的<command>命令(docker-machine不屬於docker命令),相當於執行docker-machine ssh myvm1 "<command>"。
在管理員上部署應用
首先,可以用第二篇容器裏提到的方法下載存放在倉庫裏的容器,或者也可以在myvm1裏新創建一個容器,這裏我採用第一種。
docker-machine ssh myvm1 "docker run -p 4000:80 mymole/test:part1"
其次,將第三篇服務中的docker-compose.yml複製到管理員計算機內,這裏爲myvm1:
docker-machine scp docker-compose.yml myvm1:/home/docker
最後,執行docker stock 指令創建服務:
docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
此時,你可以使用docker stack ps <stackname>命令,查看部署的service信息:
root@ONE:/usr/local/docker# docker-machine ssh myvm1 "docker stack ps getstartedlab"
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
wi0th0h0tf7s getstartedlab_web.1 mymole/test:part1 myvm1 Running Running about a minute ago
q9jlpeho8j0k getstartedlab_web.2 mymole/test:part1 myvm1 Running Running about a minute ago
4h3mdz2tandd getstartedlab_web.3 mymole/test:part1 myvm2 Running Running about a minute ago
7l58b3zoiso4 getstartedlab_web.4 mymole/test:part1 myvm1 Running Running about a minute ago
ystfc70sl4hu getstartedlab_web.5 mymole/test:part1 myvm2 Running Running about a minute ago
從上面的列表可以看出,名爲getstartedlab的應用目前在myvm1和myvm2上各自部署了3個和2個任務,每一個任務背後對應着一個容器,每個容器中部署了一個應用。
現在,你可以通過http://192.168.99.101:4000或http://192.168.99.100:4000訪問部署的站點。
端口
在啓用蜂羣模式之前,需要在羣節點之間打開以下端口:
1. 用於容器網絡發現的端口7946 TCP/UDP。
2. 用於容器入口網絡的端口4789 UDP。