用 Docker 1.12 Swarm 模式創建 Swarm 集群
Swarm 讓你事半功倍
2016 年 DockerCon (天啊……我多么希望我當時在場)上展示的最重大的變革之一就是 1.12 版本引擎的 Swarm 模式。它意味著什么呢? 它意味著:如果你在運行 Docker 1.12時 ,你就可以原生創建一個 Swarm 集群 。
用這樣一條簡單的命令:
$ dockerswarminit
就足夠創建一個 Swarm 了(雖然是一個只有簡易管理節點的 Swarm,但已經是 Swarm 集群的最簡集合)。
$ dockernodels ID HOSTNAME MEMBERSHIP STATUS AVAILABILITY MANAGERSTATUS 7sytb3zk0yswdfky6mbh7nzk2 * moby Accepted Ready Active Leader
來看看多節點吧!
只有一個節點的 Swarm,用途是有限的,所以讓我們來創建一個有兩個管理節點(manager nodes)和兩個工作節點(worker nodes)的 Swarm。 首先,我們來創建 4 個 Docker 主機。Docker Machine 是完成此任務的理想工具,所以我們就用它。
$ docker-machinecreate --drivervirtualboxmanager1 $ docker-machinecreate --drivervirtualboxmanager2 $ docker-machinecreate --drivervirtualboxworker1 $ docker-machinecreate --drivervirtualboxworker2
如果你手頭上沒有別的用 Machine 創建的主機,那么在顯示集群節點時,你的顯示信息就需要與下文給出的范例比較接近。
$ docker-machinels NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS manager1 - virtualbox Running tcp://192.168.99.100:2376 v1.12.0-rc3 manager2 - virtualbox Running tcp://192.168.99.101:2376 v1.12.0-rc3 worker1 - virtualbox Running tcp://192.168.99.102:2376 v1.12.0-rc3 worker2 - virtualbox Running tcp://192.168.99.103:2376 v1.12.0-rc3
初始化 Swarm
上文介紹了一種用 1.12 版引擎來創建 Swarm 的最簡單的命令(提示:“docker swarm init”),但我們在這里還將調用幾種附加選項,讓集群主機可以互相通信,并在無需許可的情況下加入集群。
$ MANAGER1_IP=$(docker-machineipmanager1) $ docker-machinesshmanager1dockerswarminit --auto-acceptmanager --auto-acceptworker --listen-addr $MANAGER1_IP:2377
注意:–listen-addr 是 Swarm 內不同節點互相訪問的地址
添加第二管理節點
Docker Swarm 命令中還需要添加一些選項:
* join:表明一個新的節點將被添加進 Swarm
* –manager:表明節點的性質(manager vs worker)
* –listen-addr:讓一個新添加的節點可以訪問 Swarm 內的其他節點
* 最后的參數就是第一管理節點的地址(即這一命令將被送到的那個節點)
$ MANAGER2_IP=$(docker-machineipmanager2) docker-machinesshmanager2dockerswarmjoin --manager --listen-addr $MANAGER2_IP:2377 $MANAGER1_IP:2377
注意:由于 –auto-accept manager 選項會在 Swarm 初始化的過程中被提供,所以第二管理節點會被自動接受。如果沒有這一選項,那么第二管理節點需要被第一管理節點手動接受。
添加工作節點
往集群內添加工作節點的方式,跟添加管理節點幾乎相同:
$ WORKER1_IP=$(docker-machineipworker1) $ docker-machinesshworker1dockerswarmjoin --listen-addr $WORKER1_IP:2377 $MANAGER1_IP:2377 $ WORKER2_IP=$(docker-machineipworker2) $ docker-machinesshworker2dockerswarmjoin --listen-addr $WORKER2_IP:2377 $MANAGER1_IP:2377
注意:由于 –auto-accept worker 選項會在 Swarm 初始化的過程中被提供,所以工作節點會被自動接受。如果沒有這一選項,那么工作節點需要被管理節點手動接受。
我們的 Swarm 看起來像什么呢?
讓我們來看看。
$ docker-machinesshmanager1dockernodels ID HOSTNAME MEMBERSHIP STATUS AVAILABILITY MANAGERSTATUS 109a5ufy8e3ey17unqa16wbj7 manager2 Accepted Ready Active Reachable 4chbn8uphm1tidr93s64zknbq * manager1 Accepted Ready Active Leader 8nw7g1q0ehwq1jrvid1axtg5n worker2 Accepted Ready Active 8rrdjg4uf9jcj0ma2uy8rkw5v worker1 Accepted Ready Active
現在每個節點都歸屬于 Swarm,并都處在了待機狀態。管理節點 1 是領導者,一切都各居其位,井井有條。
是什么使它如此特別呢?
這個 Swarm 是得到安全傳輸層協議(TLS)保證的,能在設備外自動認證升級。
同樣,它也不再需要 Consul、Zookeeper 之類的鍵值存儲,所有東西都在掌控之中。
現在就來用它吧
如果不在上面運行點什么,Swarm 要來何用呢……?當然,我們將要在我們的 Swarm 上部署一些服務,但這一點,還是留給下一篇文章細講吧。
復制和粘貼
下面是一小段用來創建 Docker 主機并部署 Swarm 的 Shell 腳本。當然了,管理/工作節點的數字都是可以隨意改動的。
注意:創建兩個管理節點和兩個工作節點,僅僅是用來作示范。在工業生產中,我們可能需要在集群里搭建 3 個管理節點和 5 個工作節點(感謝 Stefan 指出了這一點)。
Define the number of managers/workers
MANAGER=3 WORKER=5
Create the Docker hosts
for i in $(seq 1 $MANAGER); do docker-machinecreate --drivervirtualboxmanager$i; done for i in $(seq 1 $WORKER); do docker-machinecreate --drivervirtualboxworker$i; done
Init the swarm
docker-machinesshmanager1dockerswarminit --auto-acceptmanager --auto-acceptworker --listen-addr $(docker-machineipmanager1):2377
Add additional manager(s)
for i in $(seq 2 $MANAGER); do docker-machinesshmanager$i dockerswarmjoin --manager --listen-addr $(docker-machineipmanager$i):2377 $(docker-machineipmanager1):2377; done
Add workers
for i in $(seq 1 $WORKER); do docker-machinesshworker$i dockerswarmjoin --listen-addr $(docker-machineipworker$i):2377 $(docker-machineipmanager1):2377; done </pre>