弦而時習之

Rails 部署實踐 - 容器相關工具

將 Rails 專案進行容器化,或者搭配容器化技術應用的情境很多,這邊介紹幾個比較有趣跟方便使用的案例,大家可以比較一下差異跟使用上的體驗。

Rails 部署實踐 - 容器進入點

進入點是一個很容易被忽略的處理,在大部分的容器處理中我們只是將應用(Application)封裝成一個容器鏡像,並且使用命令(Command)來告知容器啟動時該呼叫怎樣的命令運行應用。

然而,這樣的機制存在一些問題,因此我們需要實現進入點(Entrypoint)來做一些處理。

Rails 部署實踐 - 素材預先編譯

目前大多數的 Rails 專案都還是前端、後端一起開發的,因此我們還需要讓製作出來的容器鏡像能夠將網站運行所需的圖檔、JavaScript 等等製作出來加入到容器鏡像中。

目前我們還沒有搭配持續交付(Continuous Delivery)相關的設計,因此我們先以直接在容器鏡像製作階段製作素材(Assets)的方式。

Rails 部署實踐 - 多階段建置

經過兩週的努力,我們已經可以製作出能夠運行 Ruby on Rails 的環境,然而這個狀態的環境依舊同時混合了「編譯」跟「運行」兩種狀態的套件,在過去我們需要透過 RUN 合併命令來清理,然而在新版的 Docker 提供了「多階段建置(Multi-Stage Build)」的選項,因此我們可以直接切割開來處理。

Rails 部署實踐 - 容器化的 Bundler 最佳設定

雖然我們已經轉換為 Alpine 來製作容器鏡像,然而在現代軟體設計中為了加速會有許多快取(Cache)的檔案產生,以利再次執行時能夠更快速的啟動。使用 Bundler 安裝 Ruby Gem 也不例外,這些檔案在容器部署中有非常多是不需要的,因此我們還需要針對 Bundler 進行最佳化。

Rails 部署實踐 - 滾動更新

完成網站部署後,我們還需要持續的更新網站。然而如果只有一個節點的話,網站是會有一瞬間服務暫停的狀況,為了避免這樣的問題可以採取滾動更新(Rolling Upgrade)的方式處理。

過去我們需要仰賴人工切換,然而到了虛擬機、容器的階段就能夠透過預先安裝好環境來做到半自動、自動的處理。

Rails 部署實踐 - 健康檢查

在過去傳統的部署方式中,我們大多是單機的方式部署,因此網站如果發生障礙連不上,那麼就可以視為無法使用。

然而當我們有多個網站節點的時候,大多會使用負載平衡(Load Balancer)來將流量分散到不同的節點上,這個時候哪一個節點可以接受流量,就會仰賴健康檢查(Health Check)來回報狀態。

Rails 部署實踐 - 使用 HTTPS 協定加密連線

當我們透過 Docker Compose 在伺服器上將 Rails 運行起來後,基本上已經符合了部署的條件,也就是我們已經完成了一個可以提供服務的環境。

然而,在現代的網站部署中,使用 SSL 將使用者的連線加密已經是必備的條件,有 Let’s Encrypt 提供的免費憑證也能讓我們快速的搭建安全的網站服務。

Rails 部署實踐 - 撰寫 Docker Compose

現在我們已經有建置好的專案鏡像並且可以被任意伺服器存取,同時也有了能夠運行容器的環境(以 Docker 為基礎)接下來只需要將我們的專案運行起來即可。