Dockerfile是爲快速構建docker image而設計的,當你使用dockerbuild 命令的時候,docker 會讀取當前目錄下的命名爲Dockerfile(首字母大寫)的純文本文件並執行裏面的指令構建出一個docker image。這比SaltStack的配置管理要簡單的多,不過仍是要掌握一些簡單的指令。
Dockerfile 由一行行命令語句組成,而且支持以#開頭的註釋行。指令是不區分大小寫的,可是一般咱們都大寫。
下面咱們經過構建一個Nginx的鏡像來學習Dockerfile
Nginx Dockerfile實戰
注意:第一個指令必須是FROM。
爲了你們更容易學習,我這裏總結一個命令的介紹:
通常的,咱們將Dockerfile 分爲四部分:
- 基礎鏡像信息
- 維護者信息
- 鏡像操做指令
- 容器啓動時執行指令
這就是學會Dockerfile的一張圖
上圖最後一個RUN應該爲CMDhtml
一. 構建Dockerfile
注意:ADD index.html就是放一個文件進去,這個文件須要你們本身準備一下。例如:
[root@linux-node1 mynginx]# echo 「nginx indocker test」 > index.html
使用dokcer build命令構建鏡像
[root@linux-node1mynginx]# docker build -t mynginx:v2 .
構建完畢以後,咱們就能夠Run起來。
[root@linux-node1 ~]# docker run -d -p92:80 nginx:v2 nginx
二. Dockerfile指令詳解
1. FROM
格式:FROM<image>或FROM<image>:<tag>。
解釋:FROM是Dockerfile裏的第一條指令(必須是),後面跟有效的鏡像名(若是該鏡像你的本地倉庫沒有則會從遠程倉庫Pull取)。而後後面的其它指令FROM的鏡像中執行。
2. MAINTAINER
格式:MAINTAINER <name>
解釋:指定維護者信息。
3. RUN:在鏡像構建過程當中運行。
格式:RUN <command>或 RUN[「executable」, 「param1」, 「param2」](exec模式)
解釋:運行命令,命令較長使可使用\來換行。推薦使用上面數組的格式
例如: shell模式:RUN echo hello 執行的方式是用shell來執行,實際效果是 /bin/sh -c echo hello
exec模式:能夠指定其餘形式的shell來執行指令
RUN ["/bin/bash", "-c", "echo hello"]
兩條RUN指令能夠合併成一條, 例如:RUN apt-get update && apt-get -y nginx
docker build -t="鏡像名" . 在當前目錄構建鏡像,注意後面的 點 表示當前目錄
4. CMD:指定容器啓動時的默認行爲
格式:
CMD [「executable」,」param1″,」param2″] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給須要交互的應用;
CMD [「param1″,」param2」] 提供給ENTRYPOINT的默認參數,和ENTRYPOINT搭配使用
解釋:
CMD指定容器啓動時執行的命令,
每一個Dockerfile只能有一條CMD命令,若是指定了多條,只有最後一條會被執行。若是你在啓動容器的時候也指定的命令,那麼會覆蓋Dockerfile構建的鏡像裏面的CMD命令。
例如:使用exec方式
在dockerfile中添加 CMD ["/usr/sbin/nginx", "-g", "daemon off;"] 啓動容器時運行nginx, 而且之前臺方式運行。
這樣使用命令docker build -t="home/hong"(給鏡像起名) . 構建一個home/hong的鏡像後,
啓動容器:docker run -d -p 80 --name cmd_test1 home/hong ---------不用再寫容器啓動的命令nginx -g "daemon off;")
以前不加CMD時,
啓動容器:docker run -p 80 -d home/hong nginx -g "daemon off;"
若是使用命令docker run -d -p 80 --name cmd_test2 home/hong /bin/bash來啓動一個容器,
再用docker ps -l 查看(顯示最後一次建立的容器,包括未運行的),發現COMMAND列顯示的內容已經變化爲/bin/bash, 以前是/usr/sbin/nginx -g
能夠用docker top cmd_test1來查看容器的進程。
5. ENTRYPOINT
格式:
ENTRYPOINT [「executable」, 「param1″,」param2」]
ENTRYPOINT command param1 param2(shell中執行)。
例如:ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
解釋:和CMD相似,區別:不可被 docker run 提供的參數覆蓋。
每一個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。ENTRYPOINT沒有CMD的可替換特性,也就是你啓動容器的時候增長運行的命令不會覆蓋ENTRYPOINT指定的命令。
因此生產實踐中咱們能夠同時使用ENTRYPOINT和CMD,
使用ENTRYPOINT來指定命令,用CMD來指定命令默認的參數。
例如在dockerfile中寫入以下命令來構建鏡像後:
ENTRYPOINT ["/usr/sbin/nginx"]
CMD ["-h"]
啓動容器:docker run -d -p 80 --name ep_test1 home/hong -g "daemon off"
使用docker ps查看,顯示的COMMAND參數爲 /usr/sbin/nginx
-g,
表示CMD的默認參數被-g參數覆蓋了
6. USER --這個用戶不會自動建立
格式:USER daemon
例如:USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
解釋:指定運行容器時的用戶名和UID,後續的RUN指令也會使用這裏指定的用戶,默認會使用root用戶
7. EXPOSE
格式:EXPOSE<port> [<port>…] :指定運行該鏡像的容器使用的端口,
只是告訴別人我要用某個端口,可是並不會自動打開此端口,因此啓動容器是還須要用參數-p或者-P來指定開啓的端口號
例如:dockerfile中 EXPOSE 80
在容器運行時 docker run -p 80 -d home/hong nginx -g "daemon off;"
8. ENV
格式:ENV<key> <value>
ENV <key>=<value> …
解釋:設置環境變量,能夠在RUN以前使用,而後RUN命令時調用,容器啓動時這些環境變量都會被指定
9. ADD
格式:
ADD <src>… <dest>
ADD [「<src>」,… 「<dest>」]
例子: ADD index.html /usr/share/nginx/html/ 使用本地編寫的網頁,替換nginx的默認頁面
解釋:將指定的<src>複製到容器文件系統中的<dest>,
1. 通常來講src地址爲本機dockerfile所在的目錄,目標路徑要使用容器中的絕對路徑,
2. 全部拷貝到container中的文件和文件夾權限爲0755,uid和gid爲0
3. 若是文件是可識別的壓縮格式,則docker會幫忙解壓縮,還有一個COPY指令,和ADD用法徹底同樣,只是沒解壓縮功能,若是是純拷貝,使用COPY好。
10. VOLUME
格式:VOLUME [「/data」]
解釋:能夠將本地文件夾或者其餘container的文件夾掛載到container中。
11. WORKDIR:容器內部設置工做目錄
格式:WORKDIR/path/to/workdir
解釋:切換目錄,爲後續的RUN、CMD、ENTRYPOINT 指令配置工做目錄。
能夠屢次切換(至關於cd命令),
也可使用多個WORKDIR 指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑爲 /a/b/c。
12. ONBUILD:爲鏡像添加觸發器
ONBUILD 指定的命令在構建鏡像時並不執行, 而是在它的子鏡像中執行;
只有當一個鏡像被其餘鏡像做爲基礎鏡像時纔會執行,會在構建過程當中插入指令
例子,dockerfile文件以下
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y nginx
ONBUILD COPY index.html /usr/share/nginx/html/ #使用本地編寫的網頁,替換nginx的默認頁面
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]
構建此鏡像 docker build -t "home/hong" .
而後按此鏡像運行容器docker run -d -p 80 --name test0 home/hong
curl http://127.0.0.1:49169來查看頁面,發現默認頁面並無改變
再寫一個dockerfile文件
FROM home/hong
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g",daemon off;"]
再構建鏡像docker build -t "test 1" . 在構建過程當中發現觸發了ONBUILD指令。
13. ARG
格式:ARG<name>[=<default value>]
解釋:ARG指定了一個變量在docker build的時候使用,可使用–build-arg <varname>=<value>來指定參數的值,不過若是構建的時候不指定就會報錯。