2016 年 DockerCon (天啊……我多么希望我當時在場)上展示的最重大的變革之一就是 1.12 版本引擎的 Swarm 模式。它意味著什么呢?它意味著:如果你在運行 Dock
創建一個 swarm 集群
用這樣一條簡單的命令:
$ docker swarm init
就足夠創建一個 Swarm 了(雖然是一個只有簡易管理節點的 Swarm,但已經是 Swarm 集群的最簡集合)。
$ docker node ls
ID HOSTNAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
7sytb3zk0yswdfky6mbh7nzk2 * moby Accepted Ready Active Leader
來看看多節點吧!只有一個節點的 Swarm,用途是有限的,所以讓我們來創建一個有兩個管理節點(manager nodes)和兩個工作節點(worker nodes)的 Swarm。 首先,我們來創建 4 個 Docker 主機。Docker Machine 是完成此任務的理想工具,所以我們就用它。
$ docker-machine ls
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
如果你手頭上沒有別的用 Machine 創建的主機,那么在顯示集群節點時,你的顯示信息就需要與下文給出的范例比較接近。
$ docker-machine ls
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-machine ip manager1)
$ docker-machine ssh manager1 docker swarm init --auto-accept manager --auto-accept worker --listen-addr $MANAGER1_IP:2377
注意:–listen-addr?是 Swarm 內不同節點互相訪問的地址
添加第二管理節點
Docker Swarm 命令中還需要添加一些選項:
* join:表明一個新的節點將被添加進 Swarm
*?–manager:表明節點的性質(manager vs worker)
*?–listen-addr:讓一個新添加的節點可以訪問 Swarm 內的其他節點
* 最后的參數就是第一管理節點的地址(即這一命令將被送到的那個節點)
注意:由于?–auto-accept manager?選項會在 Swarm 初始化的過程中被提供,所以第二管理節點會被自動接受。如果沒有這一選項,那么第二管理節點需要被第一管理節點手動接受。
$ MANAGER2_IP=$(docker-machine ip manager2)
docker-machine ssh manager2 docker swarm join --manager --listen-addr $MANAGER2_IP:2377 $MANAGER1_IP:2377
添加工作節點
往集群內添加工作節點的方式,跟添加管理節點幾乎相同:
$ WORKER1_IP=$(docker-machine ip worker1)
$ docker-machine ssh worker1 docker swarm join --listen-addr $WORKER1_IP:2377 $MANAGER1_IP:2377
$ WORKER2_IP=$(docker-machine ip worker2)
$ docker-machine ssh worker2 docker swarm join --listen-addr $WORKER2_IP:2377 $MANAGER1_IP:2377
注意:由于?–auto-accept worker?選項會在 Swarm 初始化的過程中被提供,所以工作節點會被自動接受。如果沒有這一選項,那么工作節點需要被管理節點手動接受。
我們的 Swarm 看起來像什么呢?讓我們來看看。
$ docker-machine ssh manager1 docker node ls
ID HOSTNAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
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 之類的鍵值存儲,所有東西都在掌控之中。