前言
最近剛好看到許多EKS
、GKE
相關的文章,趁著過年時刻先來補足一下 Docker 這個既熟悉又陌生的技能 😆,之後再接著研究如何串接至 kubernetes 並同時到雲平台上,接下來一起來看我從建立到建置的過程紀錄 🙂。
以下就使用我的 side project - Twitch-Bot 做範例囉!
主要使用的功能為
node
以及mongo
新增檔案
這邊我使用 vscode 的 Docker extension 來幫助我快速建立 docker 相關的檔案:
- Dockerfile
- docer-compose.yml
- .dockerignore
透過以下的 gif 可以快速建立以上三個檔案
操作方式為 Cmd+Shift+P
>docker: add
> 選擇語言(Node)
> 設定輸出 Port
處理 dockerfile
藉由 extension 來幫我們產生檔案第一步就完成了,接著對 Dockerfile 稍做修改:
1 | FROM node:10.13-alpine |
- FROM: 來自什麼映像檔,這裡使用預設給的 node 版。
- MAINTAINER: 寫描述的位置,這邊我標註我的名稱與 EMail。
- ENV: 環境變數寫在這,不過這個專案是放在 Github 上,所以我就沒把 chatbot 平台的密鑰放在這了。
- WORKDIR: 當前在一個乾淨的環境下,而你預想的工作路目錄要叫什麼就在這設定,同時也會一起幫你建立好 (我用
/app
這個工作資料夾當作範例)。 - COPY: 把檔案複製到想要放的地方,這裡為了先讓容器安裝完相依套件,因此先把
package.json
以及package-lock.json
先複製進/app/
這個資料夾內。 - RUN: 執行終端機指令,在上面檔案複製過來之後,這裡我就來安裝相依套件庫。
- COPY: 安裝完產生 node_modules 之後把原本的有的東西都複製過來。
.
= 當前目錄- /app/ = 欲複製前往的地方
- EXPOSE: 容器要打出去的 Port 出口,在前面呼叫 extension 時就已經輸入完這欄了。
- CMD: 幫我執行指令 (參考: CMD 與 ENTRYPOINT 的差別)
docker-compose.yml
這邊我將預設的修改為:
1 | version: '3' |
首先將version
改成 3
,有向下相容的話當然就是要使用新的囉!
接著會建立兩個 container (services):
- twitch-bot
build
後面接著.
是指說建立在當前位置,depends_on
則是依賴哪個 container,最後則透過 networks (chatbot-network
) 來讓服務互相溝通。 - mongo
這邊則就直接去 dockerhub 裡面抓,restart
鐵定是必要設定,不然會沒有資料庫 🤣,volumes
則是設定說你想映射的檔案位置在哪,這邊我設定當前目錄的/data/db (./data/db)裡面,對應到映像檔裡面的 /data/db 的位置,然後一樣透過 networks (chatbot-network
) 來讓服務溝通。
networks 這邊就有點像主機設定網卡一樣,我設定一個 chatbot-network
的網卡它是使用橋接(bridge
)模式來驅動(driver
)
這部分是參考知乎,對照改出來的
補給站: 一般看到
5000:5000
或是./data/db:/data/db
的寫法,它意思是 本地端位置 對應「:
」到 容器的位置,像上述檔案就有 port 以及 資料庫位置,這邊就會因應服務而對應到不同的功能。
修改 .dockerignore
這邊因為我很偷懶不想把.env
裡的環境變數寫進dockerfile
😆,因此在這就把檔案中的**/.env
拔掉方便做事 🤣
測試容器
啟動
1 | docker-compose up -d |
-d
表示讓容器跑在背景,如果沒加的話就會在終端機上看到容器們的行為。- 會建立本地端的 container image。
關閉
1 | docker-compose down |
- 若是使用 Twitch-bot 來試玩的話,則需要多開一個視窗執行
npx ngrok http 5000
來建立一個暫時含有 SSL 的 URL。
建置(build)
如果是按照原本 docker-compose.yml 的打法:
1 | services: |
這樣的話 docker 預設會幫忙下一個 latest
版號的 tag。
如果是按造以下做法的話在 build 就會幫忙建立 帳號/容器名
,並下一個 0.1
的 tag
1 | services: |
接下來就執行 docker-compose build
幫忙建立一個有版本號(tag)的容器映像檔(container image)。
補給站:
- 記得要
docker login
哦!- 到 dockerhub 或其他私有倉庫建立 container repository
結碖
趁著春節的零碎時間來跟這個熟悉陌生技能打個招呼 😆,同時也體會到大家說到 docker 好用的地方以及給予的彈性,之前都是有需要測試某些功能才會用到,對於 dockerfile
以及 docker-compose.yml
就甚少了解,藉著年假空檔練習,之後只要在熟悉一下整體的使用方法應該就能好好的~用它來幫忙做事了 🚀。
references
連線 mongo container
docker CMD 使用
Overview of Docker Compose
Twitch-Bot