[Docker] 範例與實作-中研院斷詞系統API

PC Chen
程式乾貨
Published in
5 min readSep 22, 2020

如果你已經有開發一些 side project 的經驗、並且想把自己的程式碼分享給別人分享時,會不會常常遇到以下問題?

欸~這台電腦沒有xxx套件啦!你這隻程式用的套件好多,都還要一個一個安裝好麻煩耶= =

Oops! 這台電腦沒有安裝 'ckiptagger'

如果你開始遇到這個問題,那代表你開始需要下面這隻小鯨魚 Docker:

docker

範例實作:中研院斷詞系統 API

中研院詞庫小組有針對中文斷詞,釋出一個 python API,因此我想用以下的 python 程式幫我把輸入的文檔進行斷詞:

想要斷詞的文檔資料
cut_word.py
斷詞結果
cut_word.py 執行結果

在上述的 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:

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 中的套件安裝好。
download_ckip.py
  • CMD: 啟動 image 時,container 預設要執行的指令,通常就是我們的主程式 cut_word.py

2. 建置 image

寫好 Dockerfile 以後,我們要利用它來 build image,在同個資料夾底下輸入指令 $ docker build -t {your_image_name} . 就可以建置起來。(過程會有點久,因為中研院斷詞庫有點大 2GB)
完成後再輸入 $ docker images 可以查看你剛建置好的 images,假設我剛剛想要的映像檔名稱為「test_cut」,這時就可以檢查看看有沒有建置成功。

docker 開始建置 image
test_cut images 建置完成

3. 執行 Container

確認建置好 image 之後,接下來輸入 $ docker run {image_name} 就可以利用剛剛的映像檔 test_cut 來執行 container。
這裡因為沒有再加其他參數,所以 container 執行完結果就會立即停止,如果想要查看,則可以輸入 $ docekr ps來查看剛剛執行的 container 狀態。

docker run 執行結果
docker ps -a 查看剛剛執行過的 container

透過這個範例的實作,我們快速地了解到 docker 好用的地方:)
往後要在別台主機上部署自己的程式時,記得想起這個好用的小鯨魚🐳
程式的範例檔可以參考我的 github,可以自行把他 clone 下來玩玩看,把工作目錄切換到 cut_word 資料夾 下試著執行上述的操作吧~相信操作完你會更有感覺。

延伸閱讀

關於 docker 建立 images 並且 run container 還有其他種方式,假設我現在需要建立很多 container 、並且彼此之間要有相連有服務怎麼辦?這個就留到後續我摸更熟再來分享吧XD

--

--

PC Chen
程式乾貨

喜歡接觸與動手實作各種軟體技術的後端數據工程師 A data- backend engineer who is enthusiastic in learning and implementing any techniques in software engineering.