Dockerfile 如何撰寫與使用

前一篇文章 - Docker for Windows 10 簡介過 Docker 是甚麼以及如何使用現成的映像檔(Image),這篇要來記錄如何使用 Docker file 來創建 Container。

Ken Huang
7 min readOct 29, 2020

前言

如果 Docker Hub 上面已經有完全符合你需求的 Image,那恭喜你就直接使用吧,但每個專案所使用到的相依函式庫都可能會有一些差異,又或是每個開發者有自己的使用習慣,這時很可能找不到符合特殊需求的 Image,那就只能自己動手寫 Dockerfile 做客製化了。

還不熟悉整個流程的時候可以藉著這張圖去想像當下的狀態

之前提到過 Dockerfile,主要是用 YAML 語法來撰寫的文檔,內容就是 build 一個 Image 的過程。接下來就以 build 一個環境為目標,透過實作來學習如何撰寫 Dockerfile。那這個環境會以 Ubuntu 18.04 為基礎然後在上面安裝 python 3 與 OpenCV 函式庫,過程中會一邊講指令的語法與用途,在文章最後會再彙整常用的指令。

撰寫 Dockerfile

首先找一個地方放你的 Dockerfile,我是放在 \user\docker_files,接下來你可以用編輯器在這路徑下開個檔名就叫做 Dockerfile 的檔案(不需要副檔名),然後就可以開始撰寫你要 Build 一個 Image 的指令了。

第一個會用到的指令是 FROM ,常見的環境、函式庫通常都會在 Docker Hub 上面有 base image,我們可以用這指令來指定一個 Base image,然後在上面堆疊我們想要的東西。

這邊我用 Ubuntu 18.04 作為 Base image,所以 Dockerfile 開頭會這樣寫:

# Use Ubuntu:18.04 image as parent image
FROM ubuntu:18.04

接下來我們可以透過 WORKDIR 這指令來指定之後指令作用在哪個路徑:

WORKDIR /

再來是用 RUN 指令來執行我們平常在 Ubuntu 的 Terminal 上打的指令,這邊我會先做 apt 的 update 然後安裝一些常用的 package,像是 git、zip、curl 這種東西,還有 python3-dev 函式庫以及 pip3 管理工具,指令如下:

RUN apt-get update
RUN apt-get -y install git curl zip
RUN apt-get -y install python3-pip python3-dev
RUN apt-get -y install build-essential libssl-dev libffi-dev
RUN apt-get -y install lib32z1 libglib2.0-dev libsm6 libxrender1 libxext6 libice6 libxt6 libfontconfig1 libcups2 libgl1-mesa-glx

那有了 pip3 之後,我們同樣透過RUN 指令來使用 pip3,可以做 upgrade和安裝常見的函式庫,像是numpy、scipy,當然也包含之前提到過的 opencv-pyhton,指令如下:

RUN pip3 install — upgrade pip
RUN pip3 install numpy scipy matplotlib pillow
RUN pip3 install opencv-python

接下來我們就可以開始來 Build 一個 Image 了

生成映像檔(Build Image)

生成映像檔的指令如下:

docker build -t [Author]/[Image name] [Dockerfile path]

在 build 的時候通常會加上 -t 來做 tag,Author、Image name都可以自訂,Dockerfile path 就是剛剛我們寫的 Dockerfile 所存的地方,這邊我是把路徑 cd 到剛才創建 Dockerfile 的 \user\docker_files,那我就只需要打上:

docker build -t ken/ubuntu_cv_test .

按下 Enter 之後 Docker 就會開始依照剛才我們寫的指令下去生成 Image 了

等了它下載安裝完之後會是這樣:

大概花了 10 分鐘才跑完

我們先用上一篇文章提到的 docker images 來確認是否有我們剛才 build 好的 image:

REPOSITORY那個欄位的名稱就是剛才 -t 後面輸入的 Author/Image name

然後就可以用 run 指令來指定 image name 創建 Container,指令如下:

docker run -it ken/ubuntu_cv_test

如果像下方這張傑圖這樣看到 root 就代表成功了

最後在 Container 內測試一下 Dockerfile 裡頭安裝的東西有沒有確實

可以用 pip3 -Vpip3 list 看看版本與 package 對不對,然後進到python3 裡面 import cv2 看看,如果沒裝好這邊大概就會噴出 Error 了

如果一切順利那就恭喜你已經成功用 Dockerfile 創建一個能用的 Image 了

常用 Dockerfile 語法彙整

  • FROM:可以指定 Base Image,Ex: FROM ubuntu:18.04
  • WORKDIR:可以指定工作路徑,Ex: WORKDIR /
  • RUN:可以指定 Build 過程要執行的指令,Ex: RUN apt-get update

之後我有用到甚麼新的指令我就再回來這邊補上

--

--

Ken Huang

在網路上自學的過程中,體會到開放式資源的美好,希望藉由撰寫文章記錄研究所的學習過程,同時作為回饋網路世界的一種方式。Email : kenhuang2019iii@gmail.com ,如果有任何問題都歡迎與我聯繫。