1. 程式人生 > >(轉)一張圖學會Dockerfile

(轉)一張圖學會Dockerfile

nbsp 發起人 指令 端口 文件夾權限 jpg .com htm 混亂

原文;http://blog.51cto.com/kusorz/1942816

前言

Dockerfile是非常容易學的,和SHELL相比那簡單的太多了。

Dockerfile是為快速構建docker image而設計的,當你使用dockerbuild 命令的時候,docker 會讀取當前目錄下的命名為Dockerfile(首字母大寫)的純文本文件並執行裏面的指令構建出一個docker image。這比SaltStack的配置管理要簡單的多,不過還是要掌握一些簡單的指令。

Dockerfile 由一行行命令語句組成,並且支持以#開頭的註釋行。指令是不區分大小寫的,但是通常我們都大寫。

下面我們通過構建一個Nginx的鏡像來學習Dockerfile

Nginx Dockerfile實戰

註意:第一個指令必須是FROM。

技術分享圖片

為了大家更容易學習,我這裏總結一個命令的介紹:

一般的,我們將Dockerfile 分為四部分:

  • 基礎鏡像信息

  • 維護者信息

  • 鏡像操作指令

  • 容器啟動時執行指令

思路混亂的比喻

這就是學會Dockerfile的一張圖

技術分享圖片

構建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有多麽的簡單了吧。

Dockerfile指令詳解

下面我們來分別介紹下上面使用到的命令:

FROM

格式:FROM<image>或FROM<image>:<tag>。

解釋:FROM是Dockerfile裏的第一條指令(必須是),後面跟有效的鏡像名(如果該鏡像你的本地倉庫沒有則會從遠程倉庫Pull取)。然後後面的其它指令FROM的鏡像中執行。

MAINTAINER

格式:MAINTAINER <name>

解釋:指定維護者信息。

RUN

格式:RUN <command>或 RUN[“executable”, “param1”, “param2”]。

解釋:運行命令,命令較長使可以使用\來換行。推薦使用上面數組的格式

CMD

格式:

CMD [“executable”,”param1″,”param2″] 使用 exec 執行,推薦方式;

CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;

CMD [“param1″,”param2”] 提供給ENTRYPOINT的默認參數;

解釋:

CMD指定容器啟動是執行的命令,每個Dockerfile只能有一條CMD命令,如果指定了多條,只有最後一條會被執行。如果你在啟動容器的時候也指定的命令,那麽會覆蓋Dockerfile構建的鏡像裏面的CMD命令。

ENTRYPOINT

格式:

ENTRYPOINT [“executable”, “param1″,”param2”]

ENTRYPOINT command param1 param2(shell中執行)。

解釋:和CMD類似都是配置容器啟動後執行的命令,並且不可被 docker run 提供的參數覆蓋。

每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。ENTRYPOINT沒有CMD的可替換特性,也就是你啟動容器的時候增加運行的命令不會覆蓋ENTRYPOINT指定的命令。

所以生產實踐中我們可以同時使用ENTRYPOINT和CMD,例如:

ENTRYPOINT [“/usr/bin/rethinkdb”]

CMD [“–help”]

USER

格式:USER daemon

解釋:指定運行容器時的用戶名和UID,後續的RUN指令也會使用這裏指定的用戶。

EXPOSE

格式:EXPOSE<port> [<port>…]

解釋:設置Docker容器內部暴露的端口號,如果需要外部訪問,還需要啟動容器時增加-p或者-P參數進行分配。

ENV

格式:ENV<key> <value>

ENV <key>=<value> …

解釋:設置環境變量,可以在RUN之前使用,然後RUN命令時調用,容器啟動時這些環境變量都會被指定

ADD

格式:

ADD <src>… <dest>

ADD [“<src>”,… “<dest>”]

解釋:將指定的<src>復制到容器文件系統中的<dest>

所有拷貝到container中的文件和文件夾權限為0755,uid和gid為0
如果文件是可識別的壓縮格式,則docker會幫忙解壓縮

VOLUME

格式:VOLUME [“/data”]

解釋:可以將本地文件夾或者其他container的文件夾掛載到container中。

WORKDIR

格式:WORKDIR/path/to/workdir

解釋:切換目錄,為後續的RUN、CMD、ENTRYPOINT 指令配置工作目錄。

可以多次切換(相當於cd命令),

也可以使用多個WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

則最終路徑為 /a/b/c。

ONBUILD

ONBUILD 指定的命令在構建鏡像時並不執行,而是在它的子鏡像中執行

ARG

格式:ARG<name>[=<default value>]

解釋:ARG指定了一個變量在docker build的時候使用,可以使用–build-arg <varname>=<value>來指定參數的值,不過如果構建的時候不指定就會報錯。

分享嘉賓

趙舜東

江湖人稱“趙班長”,曾在武警某部負責指揮自動化架構和運維,曾帶團隊負責國內知名電商運維工作,SaltStack中國用戶組發起人、運維社區發起人、《saltstack入門與實踐》作者,《運維知識體系》作者。

文章出處:運維社區(訂閱號ID:cloud-oaas)

(轉)一張圖學會Dockerfile