Docked and mrsk

Jimmy Xiao
6 min readMar 31, 2023

現在容器化的概念越來越盛行,而事實上容器化確實能有效率地去處理開發或是部署過程中環境的設定.透過簡單的幾行 docker 指令,所有的設定就像被施了魔法一樣自己動起來(當然一開始的設定還是免不掉

from https://media.giphy.com/media/zZRxy466qETsY/giphy.gif

剛好敝司也希望容器化能夠真的實做在我們工作上,在主管的分享下碰到了這篇文章要介紹兩個工具:

就類別去做區分的話 docked 是用來開發 Ruby on Rails 的工具,而 mrsk 是部署的工具(並不侷限在一定要是 Ruby on Rails 的套件).

docked

Docked Rails CLI uses a Docker image to make it much easier, requiring only Docker to be installed. from docked readme

就像官方文件提到的 docked 只需要安裝 docker 在開發者的環境(哪尼!,你問我那個 ruby? rails?

沒綽那些東西都不用裝因為 docked 都幫你會幫你安裝在 container 裏面

只要兩個步驟 docked 就上手

  1. Install Docker
  2. 把下列程式碼貼在 terminal
docker volume create ruby-bundle-cache alias docked='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli’

這段程式碼主要是做了兩件事情

  1. 建立名為 ruby-bundle-cache volume
  2. 定義名為 docked alias,而這個 docked 會做下述的事情
  • docker run — rm -it \
    # 運行一個 container
  • -v ${PWD}:/rails \
    # 將目前的資料夾內容掛在到 container 的 /rails,程式碼就是在這邊掛在近來的
  • -v ruby-bundle-cache:/bundle \
    # 將 ruby-bundle-cache 掛在到 container 的 /bundle
  • -p 3000:3000 \
    # 將 container 3000 連接阜連接到本機 3000 連接阜
  • ghcr.io/rails/cli \
    # 使用 rails/cli 的映像檔

當這兩個步驟設定完之後就可以進行專案的設定,以下為使用 docked 建立新專案的程式碼範例

docked rails new weblog
cd weblog
docked rails generate scaffold post title:string body:text
docked rails db:migrate
docked rails server

雖然這個工具很方便但是可調整的設定也相對的有限,例如 ruby 版本,前端打包方案或是其他套件額外的設定,除非自己要在客製化官方的 Dockerfile 不然這些目前無法設定.但是如果是要快速做出可以展示的最小商業邏輯單位我覺得是一個蠻方便且快速的開發方式.

mrsk

是用來部署容器化應用程式的工具,透過 Traefik 當做反向代理工具.mrsk 使用 SSHKit 去執行多個 hosts 的指令.

簡短來說 mrsk 的部屬方式如下

  1. SSH 連線到 server
  2. 製作 Image 映像檔 (可以在本地也可以另外指定遠端 builder)
  3. 上傳映像檔到 Github Registery
  4. 下載映像檔到遠端主機
  5. 用該映像檔將 container 建立起來

更多細節可以參考官方文件:https://github.com/mrsked/mrsk

mrsk 的使用方式如下

  • 安裝 Docker
  • 如果有 ruby 環境的話可以透過 gem install mrsk 全域安裝,沒有的話可以貼上下列指令
alias mrsk='docker run --rm -it -v $HOME/.ssh:/root/.ssh -v /var/run/docker.sock:/var/run/docker.sock -v ${PWD}/:/workdir  ghcr.io/mrsked/mrsk'
  • 呼叫指令 mrsk init 或者 mrsk init — bundle 可以進行初始化,你就會獲得一份 config/deploy.yml,所有的 server 設定還有部署相關內容都會在這邊處理好,範例如下
service: hey
image: 37s/hey
servers:
- 192.168.0.1
- 192.168.0.2
registry:
username: registry-user-name
password:
- MRSK_REGISTRY_PASSWORD
env:
secret:
- RAILS_MASTER_KEY

mrsk 除了提供部署的功能之外還有提供一些指令

  • 多個環境/平台的部署:透過不同的 deploy.yml 可以做到多個環境或是平台的部署.製作一個 deploy.<NAME>.yml 的檔案再把這個環境或是平台的設定寫在裡面再執行 mrsk deploy -d <NAME> 就可以去執行 deploy.<NAME>.yml 的部署,而預設 deploy.<NAME>.yml 會去繼承 deploy.yml 的所有設定.
  • 回朔機制:因為每個部署的版本都會有版本號(Git SHA) 所以我們可以夠過伺服器上的版本號去進行回朔.呼叫 mrsk app containers 去獲得 舊的 containers 資訊,其中就包完我們要的版本號再透過 mrsk rollback <VERSION_NUMBER> 就可以回朔了.
  • 遠端伺服器操作:透過 mrsk app exec <YOUR_COMMAND> 就可以在遠端伺服器進行操作例如
mrsk app exec 'ruby -v' # 去印出每個 hosts 的 ruby 版本
mrsk app exec -i 'bin/rails console' # 可以建立互動式的 session

DHH 本人也有錄一段 demo 影片可以去參考
https://www.youtube.com/watch?v=LL1cV2FXZ5I&ab_channel=37signals

參考資料

--

--