Dockerfile 如何撰寫與使用
前一篇文章 - Docker for Windows 10 簡介過 Docker 是甚麼以及如何使用現成的映像檔(Image),這篇要來記錄如何使用 Docker file 來創建 Container。
前言
如果 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 了
等了它下載安裝完之後會是這樣:
我們先用上一篇文章提到的 docker images
來確認是否有我們剛才 build 好的 image:
然後就可以用 run
指令來指定 image name 創建 Container,指令如下:
docker run -it ken/ubuntu_cv_test
如果像下方這張傑圖這樣看到 root 就代表成功了
最後在 Container 內測試一下 Dockerfile 裡頭安裝的東西有沒有確實
可以用 pip3 -V
或 pip3 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
之後我有用到甚麼新的指令我就再回來這邊補上
Ref:
https://noob.tw/dockerfile/
https://blog.maxkit.com.tw/2017/02/dockerfile.html command ref
https://chunyeung.medium.com/%E9%96%8B%E5%A7%8B%E4%BD%BF%E7%94%A8docker-%E9%99%8D%E8%90%BD-gui-3fc44770d778
https://www.learnopencv.com/install-opencv-docker-image-ubuntu-macos-windows/
https://blog.csdn.net/aggresss/article/details/79381030
https://towardsdatascience.com/real-time-and-video-processing-object-detection-using-tensorflow-opencv-and-docker-2be1694726e5
https://www.netadmin.com.tw/netadmin/zh-tw/technology/7BD73E2A172C4847A3F72D238ACA5148?page=3
https://blog.maxkit.com.tw/2017/02/dockerfile.html