Dev Talks

Deploy Rails with Docker Swarm (1) - 工具介紹

簡巧恩, Rails 工程師 Sep 2, 2022

COSCUP 安全下莊!(大概)

因為終於結束ㄌ,想說來把我的簡報內容轉換成部落格的實體紀錄,目前預計會發個三篇,分別是工具介紹、實作流程、其他議題(就是實際簡報的 mapping),這邊也附上實際報告的簡報以及我實作的 Repository,接下來就進入正題ㄅ!

Docker Swarm


Structure

Docker Swarm 的結構可以視為一個 Cluster(叢集),叢集里會有一到多個 Master/Manager Node 來控制我們的節點,另外也會有 0 到多個的 Worker node,而這邊紫色的框框都是一台機器,每台機器上都會有執行中的 docker daemon。

當我們要進行 deploy 的動作時,會先透過 Docker Client 向 Manager node 發起 deploy request 給 Manager node 的 scheduler/discovery service,透過與 worker node 上的 docker daemon 聯繫來控制這些工作節點。

Scalability & Availability Feature

首先來比較一下這兩項特性定義上的差異:

  • Scalability: 當流量變大/變小時,系統中的 server 數可以橫向擴展或縮減
  • Availability: 當部分的機器無法運作時,能夠確保服務不被中斷(自動開啟新的 instance)

Docker Swarm 達到這兩項特性的方法如下:

  • Scalability: 當流量變大/變小時,系統中的 server 數可以橫向擴展或縮減
  • Availability:以更新 app、降低 downtime 為例
    • 當需要更新 app 版本時,可以讓 load balancer 自動 route 到新版 app 上
    • 漸進式取代所有舊版的 app container

Deploy Tools: Stack vs Compose

當我們需要使用 docker swarm 這個架構時,必須透過 Docker stack 這項工具進行部署的動作。Stack 可以說是進化版的 Compose,因為基本上 stack 的設定檔格式就是 docker-compose.yml,以下是這兩個工具之間的異同:

  1. 都使用 compose format 進行 deploy,但是 stack 只支援版本三以上
  2. Stack 無法 build image,因此只能使用現有的映像檔,或者使用 compose 來幫我們做 build image 的動作
  3. Compose 只能做到單一機器上的執行,但 stack 搭配了 docker swarm 的架構,可以透過 scheduler 與 worker 的 docker daemon 進行聯繫,因此可以做到多台機器之間的操作,達到 cluster 的效果
  4. Compose 相較之下更適合用於開發環境

名詞解釋: Service vs Task

  • Task:各個實體機上須要執行的人物;當 service 指定的 replica 為 3 時,代表會有 3 個 tasks 分別執行在 3 個 container 裡
  • Service:一個 image 所提供的服務,like: app/redis/postgres
  • 所有 service 的總和稱為 stack

Traefik


Traefik 最直觀的解釋就是一個 reverse proxy 的工具,也可以拿來做 load balancer 使用。那他的好處有以下這幾點:

  • 與 Docker 高度整合:可以直接在 docker compose 定義 service 時,直接把 routing rules 定義在 deploy label 下面
  • 自動向 Let’s Encrypt 申請 HTTPS 憑證,降低申請憑證的繁複程序
  • 無需重啟:當我們有新的 app 希望可以用 Traefik 做 reverse proxy 時,不需要重新啟動 Traefik,他就能自動幫我們把新的 host request 導向新的 application 上
  • 有別於以往設定 reverse proxy 時,都需要先設定好 app 再去設定 reverse proxy 的路由,Traefik 是先把他自己的服務開好後,再把我們要開放的 app 掛上去

AWS


EC2

就是一台虛擬機,必須存在於某個 VPC 的子網路下(可直接選擇 AWS 提供給免費帳戶的預設 VPC)。同時也為了要簡化後續的實作流程,這邊也會使用到 AMI 與 EC2 template 來加速我們開啟機器的步驟,以下簡單介紹一下這兩項工具:

  • AMI (software only):映像檔服務,可以從我們已經開好並安裝一些套件之後的 EC2 製成。因為是映像檔的關係,建好 AMI 後會幫我們保留該 EC2 上已經安裝好的套件。
  • Template (hardware only):EC2 模板,協助開啟同樣的 EC2 啟動精靈,內容包含了硬體的選擇、VPC/Subnet 設定、IAM 角色的給定,以及 user data 的內容(啟動後要執行的腳本)

Route53:路由服務

  • 會為擁有的 Domain 產生 Hosted Zone 的 Name Server,管理 DNS routing(domain 要對應到哪個 IP address)
  • 可以創建許多型態的 record,定義 sub-domain

想要閱讀更多來自五倍紅寶石軟體開發的技術分享?歡迎訂閱我們的月報,每月將自動幫你送上最新文章。


分享