在前面的章節,咱們學習了經過docker
命令來下載鏡像,運行鏡像,在容器中部署本身的程序,最後將容器提交到本身的鏡像中。可是,這並非Docker推薦的鏡像構建方式。在這一章中,咱們將學習如何經過編寫Dockerfile腳原本構建和維護鏡像。mysql
在安裝Docker時,咱們提到Docker的Windows安裝包boot2docker就是在Docker環境下編譯的。下面咱們就經過boot2docker的Dockerfile腳原本初步瞭解Dockerfile的基礎知識。linux
FROM
指令和MAINTAINER
指令腳本的第1行是FROM
指令。經過FROM
指令,docker
編譯程序可以知道在哪一個基礎鏡像執行來進行編譯。全部的Dockerfile都必須以FROM
指令開始。第二條指令MAINTAINER
,用來標明這個鏡像的維護者信息。nginx
RUN
指令接下來是RUN
指令。這條指令用來在docker
的編譯環境中運行指定命令。上面這條指令會在編譯環境運行/bin/sh -c "apt-get update && apt-get -y install ..."
。RUN
指令還有另一種格式:git
RUN ["程序名", "參數1", "參數2"]
這種格式運行程序,能夠免除運行/bin/sh
的消耗。這種格式使用Json格式將程序名與所需參數組成一個字符串數組,因此若是參數中有引號等特殊字符,須要進行轉義。github
ENV
指令ENV
指令用來指定在執行docker run
命令運行鏡像時,自動設置的環境變量。這些環境變量能夠經過docker run
命令的--evn
參數來進行修改。sql
COPY
指令和ADD
指令COPY
指令用來將本地(Dockerfile所在位置)的文件或文件夾複製到編譯環境的指定路徑下。上面的例子裏,boot2docker的Dockerfile但願將與Dockerfile同一目錄下的kernel_config
文件複製到編譯環境的/linux-kernal/.config
。Dockerfile還提供了另一個相似的指令:ADD
。在複製文件方面ADD
指令和COPY
指令的格式和效果是徹底同樣的。這兩個指令的區別主要由兩點:docker
ADD
指令能夠從一個URL地址下載內容複製到容器的文件系統中;ADD
指令會將壓縮打包格式的文件解開後複製到指定位置,而COPY
指令只作複製操做。CMD
指令這是整個Dockerfile腳本的最後一條指令。當Dockerfile已經完成了全部環境的安裝與配置,經過CMD
指令來指示docker run
命令運行鏡像時要執行的命令。上面的例子裏,在完成全部工做後,boot2docker的編譯腳本將編譯結果輸出到本地環境下。數據庫
上面咱們經過boot2docker的Dockerfile腳本學習了幾個最經常使用的指令。接下來咱們再學習剩下的幾個指令。數組
EXPOSE
指令EXPOSE <端口> [<端口>...]
指令用於標明,這個鏡像中的應用將會偵聽某個端口,而且但願能將這個端口映射到主機的網絡界面上。可是,爲了安全,docker run
命令若是沒有帶上響應的端口映射參數,docker
並不會將端口映射出了。安全
ENTRYPOINT
指令ENTRYPOINT
指令和前面介紹過的CMD
同樣,用於標明一個鏡像做爲容器運行時,最後要執行的程序或命令。這兩個指令有相同之處,也有區別。經過兩個指令的配合使用能夠配置出不一樣的效果。
ENTRYPOINT
指令有兩種格式,CMD
指令有三種格式:
ENTRYPOINT ["程序名", "參數1", "參數2"] ENTRYPOINT 命令 參數1 參數2 CMD ["程序名", "參數1", "參數2"] CMD 命令 參數1 參數2 CMD 參數1 參數2
ENTRYPOINT
是容器運行程序的入口。也就是說,在docker run
命令中指定的命令都將做爲參數提供給ENTRYPOINT
指定的程序。一樣,上面列舉的CMD
指令格式的後面兩種格式也將做爲參數提供給ENTRYPOINT
指定的程序。
默認的ENTRYPOINT
是/bin/sh -c
。你能夠根據實際須要任意設置。可是若是在一個Dockerfile中出現了多個ENTRYPOINT
指令,那麼,只有最後一個ENTRYPOINT
指令是起效的。
一種經常使用的設置是將命令與必要參數設置到ENTRYPOINT
中,而運行時只提供其餘選項。例如:你有一個MySQL的客戶端程序運行在容器中,而客戶端所須要的主機地址、用戶名和密碼你不但願每次都輸入,你就能夠將ENTRYPOINT
設置成:ENTRYPOINT mysql -u <用戶名> -p <密碼> -h <主機名>
。而你運行時,只須要指定數據庫名。
VOLUME
指令VOLUME ["路徑"]
VOLUME
指令用於在容器內建立一個或多個卷。而更多的時候,是在執行docker run
時指定要建立的卷以及本地路徑來進行映射。關於這個用法將在後面的章節學習到。
USER
指令USER 用戶名或用戶ID
USER
指令用於容器內運行RUN
指令或CMD
指令的用戶。例如,在構建一個nginx鏡像時,你但願最後運行nginx的用戶爲nginx,就能夠在CMD ["nginx"]
以前將用戶設置爲nginx
。
若是在運行docker run
命令時設置了-u 用戶名
參數,那麼將覆蓋USER
指令設置的用戶。
WORKDIR
指令WORKDIR 路徑
WORKDIR
指令用於設置執行RUN
指令、CMD
指令和ENTRYPOINT
指令執行時的工做目錄。在Dockerfile中能夠屢次設置WORKDIR
,在每次設置以後的命令將使用新的路徑。
ONBUILD
指令ONBUILD 指令
ONBUILD
指令用於設置一些指令,當本鏡像做爲基礎鏡像被其餘Dockerfile用FROM
指令引用時,在全部其餘指令執行以前先執行這些指令。