Docker的核心思想就是將應用給整合進Container內運行,讓這個Container可以部屬在任何機器上,這個過程被稱是Docker化 (Dockerizing)。應用Docker化分成下面幾個步驟:
在項目的根目錄撰寫Dockerfile,配合我們之前的文章,我們先來建立一個簡單的Dockerfile吧。
FROM httpd:2.4
LABEL maintainer="Lufor"
ENV Apple="Good Apple"
RUN echo ${Apple}
COPY . /usr/local/apache2/htdocs/
docker build -t web:latest .
docker run -d -p 8083:80 --name Web_dockerfile web:latest
寫好Dockerfile後運行docker build,-t <ImageName>:<tag>
代表tag新建立出來的imagea名稱,後面的.
代表當前目錄下的Dockerfile。照上述執行完後會出現一個新的images叫做web:lastest
,隨後運行這個images就能使用這個Container應用了。
具體Dockerfile該如何寫呢? 有很多指令,以建立一個Flask Server為例子:
# use Python Image
FROM python:3.7-slim
#Set working dir (切換目錄)
WORKDIR /app
# Copy current direction into container /app
COPY . .
#install the need of package in requirement
RUN pip install -r requirements.txt
#Make port 3000 available to the world outside
EXPOSE 3000
#Define environment (Name變數內容為World)
ENV NAME World
#RUN app.py when launch
CMD ["python","app.py"]
以下容我慢慢詳解一些常用的指令,方便你未來閱讀後可以撰寫出Dockerfile
FROM
FROM是起手式,指定我們的基礎Image由什麼構成,本地端沒找到就會去遠端找LABEL <key>=<Value> <key>=<Value> ...
LABEL代表了建構出來的image的MetaData,宣示了這個專案的負責人,可以透過docker image inspect <ImageName>
查看WORKDIR <path>
切換目錄,未來進入Container內默認就是進入該WORKDIRCOPY <SRC> <TGT>
複製檔案,將你的專案複製進Image內,未來RUN時就能直接使用。如上面Flask Server的例子,由於我們已經切換WORKDIR,所以目標目錄為.
ENV <key>=<Value> <key>=<Value> ...
訂定系統環境變數,方便未來專案可以抓取,dockerfile的ENV可以在run container時被-e <key> <value>
取代。ARG <key>=<Value> <key>=<Value> ...
一樣是環境變數,注意!!,只存在於Build階段,在Container內不會出現。RUN <指令1> && <指令2> && ...
在初始化時會執行的指令VOLUME <TGT_PATH>
or VOLUME <SRC_PATH> <TGT_PATH>
指定內部持久層,Container刪除後資料不刪除,詳細可以見前幾天的文章EXPOSE <PROT>
Container要對外開的PORTCMD ["executable","param1","param2"]
一樣是執行,但是通常用於阻塞式指令,放在最後一個指令。以上大致就是常用的Dockerfile寫法,Dockerfile可以說是Docker的精華,未來幾天會模擬建立前後端專案,讓看到的人能更熟悉Dockerfile。