蒼時弦也
蒼時弦也
資深軟體工程師
發表於

Rails 部署實踐 - Docker Swarm 安裝與設定

要使用 Docker Swarm 還是需要進行一些設定,相比過去的 Docker Swarm 這幾年使用上容易許多,基本上只需要兩個命令就可以完成安裝。

網路設定

想要建立一個 Docker Swarm 叢集,我會建議在一個 LAN 中來建構,叢集之間互相使用區網的 IP 位置來連線,只有負責導入流量的節點(Node)才分配 Public IP 的方式配置。

以下以 DigitalOcean 為例子,我們先利用 VPC(Virtual Private Cloud)的功能搭建一個具備私有網路區段的環境。

這樣可以確保我們節點之間的溝通是相對安全的,比較不容易遭受到外部的攻擊,在管理上也會相對的單純一些。

建立節點

接下來我們要建立 Docker Swarm 的節點,命名的方式建議用 swarm-manager-1 這樣的方式清楚的描述節點的類型、角色以及編號,會對未來管理上更加容易。

在 Docker 中節點的角色只被單純的區分為 Manager(管理)以及 Worker(工作)兩種類型,前者會負責接受所有的網路流量,以及處理像是調度資源、服務發現(Service Discovery)等等任務,在對於高可用(High Avalibality)要求的服務,可以選擇搭建三個以上的節點。

Manager 類型的節點同時也是 Worker 的節點,在這次的範例中我們會省略 Worker 類型的節點。

建立完畢後,我們要先進入到 swarm-m-1 這個節點將叢集進行初始化。

建立叢集

當我們使用 SSH 命令進入到 swarm-m-1 節點後,需要先用 ip route 命令查詢網卡,因為我們會有一個網卡對外,另外一個則是與我們的 VPC 所連接。

以這次的案例來說,網卡位置是 eth1 處於我們的 VPC 上 10.x 起始,因此可以用 docker swarm init --advertise-addr eth1 命令限定只在區網內進行廣播。

完成後會出現加入 Worker 節點的命令,在這邊我們因為要新增的是 Manager 節點,因此需要再使用 docker swarm join-token manager 顯示出管理節點的命令。

接下來在 swarm-m-2swarm-m-3 兩個節點都執行加入節點的命令。

如果加入命令發生問題,可能是內建的防火牆造成的,可以用 systemctl disable ufw 來關閉 Ubuntu 的防火牆,同時要記得從 Digital Ocean 的 Firewall 設定中對這些節點加入保護。

完成加入節點後,可以用 docker node ls 來確認節點都已經存在

接下來我們就能夠從任何一個節點存取到任意的服務。

使用 Whoami 容器測試

我們可以使用 Traefik 的 Whoami 專案,來驗證是否可以從任何一個 Manager 節點存取到這個服務,先在任意一台節點新增 whoami.yml 的 Docker Compose 設定。

1version: '3.9'
2
3services:
4  whoami:
5    image: traefik/whoami
6    ports:
7      - 80:80

接下來使用 Docker 的 Stack 命令部署這個服務。

此時我們可以開啟 swarm-m-1swarm-m-3 的任何一個節點的 Public IP,都可以看到能夠正常存取,此時我們只需要根據需求不斷的擴充 Docker Swarm 的節點,就能夠在一定程度上確保服務不會因為單一節點故障而中斷。

可以使用 docker stack rm whoami 清除沒有使用的節點


如果想在第一時間收到更新,歡迎訂閱弦而時習之在這系列文章更新時收到通知,如果有希望了解的知識,可以利用Rails 部署實踐回饋表單告訴我。