如果你已經有開發一些 side project 的經驗、並且想把自己的程式碼分享給別人分享時,會不會常常遇到以下問題?
欸~這台電腦沒有xxx套件啦!你這隻程式用的套件好多,都還要一個一個安裝好麻煩耶= =
如果你開始遇到這個問題,那代表你開始需要下面這隻小鯨魚 Docker:
範例實作:中研院斷詞系統 API
中研院詞庫小組有針對中文斷詞,釋出一個 python API,因此我想用以下的 python 程式幫我把輸入的文檔進行斷詞:
在上述的 cut_word.py 中,我需要事先安裝的套件有:
- pandas -> 幫我讀取 csv 檔案
- ckiptagger -> python API
- gdown -> 下載斷詞詞庫
- tensorflow==1.13.1 -> ckiptagger規定要的 tensorflow 版本 (毛很多
只要這隻 cut_word.py 換到不同的電腦,都要再確認上面四個套件有沒有正確安裝,似乎有點麻煩(有的套件還要指定版本= =),因此我們利用 Docker 提供容器化的服務:為我們所需要執行的程式、建立一個容器(container)。
這個容器所包含的環境已經預先寫好,當我們建立起來的時候就已經是準備好執行這隻程式的所有環境(EX. Linux OS, python3, library...),我們只要在容器裡面執行程式,就可以順順利利地跑出想要的結果~
使用 Docker 有以下基本流程:
1. 撰寫 Dockerfile
Dockerfile 可謂整個服務的核心,它描述了整個容器的環境如何被建置,我寫了以下的 Dockerfile:
- FROM: 選擇以哪一個 image 作為基底
- ENV: 設定環境變數,例如:時區 time zone
- COPY: 將一些必要會執行的程式與檔案複製到 image 中,像是在 requirement.txt 中詳細記載了要安裝的 python套件:
pandas==0.25.1
tensorflow==1.13.1
ckiptagger
gdown
- RUN: 在基底 image 上執行一些要安裝的程式,例如我這邊先執行了一個 download_ckip.py,事先把詞庫下載下來到 image 中。另外還有使用指令
$ pip install
把 requirements.txt 中的套件安裝好。
- CMD: 啟動 image 時,container 預設要執行的指令,通常就是我們的主程式 cut_word.py
2. 建置 image
寫好 Dockerfile 以後,我們要利用它來 build image,在同個資料夾底下輸入指令 $ docker build -t {your_image_name} .
就可以建置起來。(過程會有點久,因為中研院斷詞庫有點大 2GB)
完成後再輸入 $ docker images
可以查看你剛建置好的 images,假設我剛剛想要的映像檔名稱為「test_cut」,這時就可以檢查看看有沒有建置成功。
3. 執行 Container
確認建置好 image 之後,接下來輸入 $ docker run {image_name}
就可以利用剛剛的映像檔 test_cut 來執行 container。
這裡因為沒有再加其他參數,所以 container 執行完結果就會立即停止,如果想要查看,則可以輸入 $ docekr ps
來查看剛剛執行的 container 狀態。
透過這個範例的實作,我們快速地了解到 docker 好用的地方:)
往後要在別台主機上部署自己的程式時,記得想起這個好用的小鯨魚🐳
程式的範例檔可以參考我的 github,可以自行把他 clone 下來玩玩看,把工作目錄切換到 cut_word 資料夾 下試著執行上述的操作吧~相信操作完你會更有感覺。
延伸閱讀
關於 docker 建立 images 並且 run container 還有其他種方式,假設我現在需要建立很多 container 、並且彼此之間要有相連有服務怎麼辦?這個就留到後續我摸更熟再來分享吧XD