---
title: "Rails 部署實踐 - Docker Swarm 安裝與設定"
date: 2022-07-01T00:00:00+08:00
publishDate: 2022-07-01T00:00:00Z
lastmod: 2024-06-24T11:17:07+08:00
tags: ["Rails","教學","部署","實作","Rails 部署實踐","Docker Swarm"]
series: "rails-deployment-in-practice"
toc: true
permalink: "https://blog.aotoki.me/posts/2022/07/01/rails-deployment-in-practice-setup-docker-swarm/"
language: "zh-tw"
---


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

<!--more-->

## 網路設定{#network-setup}

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

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

![Setup Network](images/2022-07-01-rails-deployment-in-practice-setup-docker-swarm/setup-network.png)

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

## 建立節點{#create-node}

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

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

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

![Create Node](images/2022-07-01-rails-deployment-in-practice-setup-docker-swarm/create-node.png)

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

## 建立叢集{#build-cluster}

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

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

![Crate Cluster](images/2022-07-01-rails-deployment-in-practice-setup-docker-swarm/create-cluster.png)

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

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

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

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

![Check Nodes](images/2022-07-01-rails-deployment-in-practice-setup-docker-swarm/check-nodes.png)

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

## 使用 Whoami 容器測試{#test-with-whoami}

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

```yaml
version: '3.9'

services:
  whoami:
    image: traefik/whoami
    ports:
      - 80:80
```

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

![Deploy Stack](images/2022-07-01-rails-deployment-in-practice-setup-docker-swarm/deploy-stack.png)

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

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

---

如果想在第一時間收到更新，歡迎[訂閱弦而時習之](https://mailchi.mp/aotoki/rails-deployment-in-practice)在這系列文章更新時收到通知，如果有希望了解的知識，可以利用[Rails 部署實踐回饋表單](https://us4.list-manage.com/survey?u=dd3d68032c0510041f1302539&id=f25e0dc43e&attribution=false)告訴我。

