DockerFile

DockerFile是什麼

DockerFile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。
構建三步驟:編寫DockerFile文件、docker build、docker run

DockerFile、Docker鏡像與Docker容器關係:
從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,

  • DockerFile是軟件的原材料
  • Docker鏡像是軟件的交付品
  • Docker容器則可以認爲是軟件的運行態。

DockerFile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。

  1. DockerFile,需要定義一個DockerFile,DockerFile定義了進程需要的一切東西。DockerFile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;
  2. Docker鏡像,在用DockerFile定義一個文件之後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;
  3. Docker容器,容器是直接提供服務的。

基本命令

命令 解釋
FROM 基礎鏡像,當前新鏡像是基於哪個鏡像的
MAINTAINER 鏡像維護者的姓名和郵箱地址
RUN 容器構建時需要運行的命令
EXPOSE 當前容器對外暴露出的端口
WORKDIR 創建容器後終端默認登錄進來的工作目錄,一個落腳點
ENV 用來在構建鏡像過程中設置環境變量
ADD 將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
COPY 類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置
VOLUME 容器數據卷,用於數據保存和持久化工作
CMD 指定一個容器啓動時要運行的命令。Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換
ENTRYPOINT 指定一個容器啓動時要運行的命令。ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啓動程序及參數
ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發

命令使用

FROM
格式爲 FROM <image>FROM <image>:<tag>
第一條指令必須爲 FROM 指令。並且,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個 FROM 指令(每個鏡像一次)。

MAINTAINER
格式爲 MAINTAINER <name>,指定維護者信息。

RUN
格式爲 RUN <command>RUN ["executable", "param1", "param2"]
前者將在 shell 終端中運行命令,即 /bin/sh -c;後者則使用 exec 執行。指定使用其它終端可以通過第二種方式實現,例如 RUN ["/bin/bash", "-c", "echo hello"]
每條 RUN 指令將在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時可以使用 \來換行。

CMD
支持三種格式
CMD ["executable","param1","param2"] 使用 exec 執行,推薦方式;
CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用;
CMD ["param1","param2"] 提供給 ENTRYPOINT 的默認參數;
指定啓動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最後一條會被執行。
如果用戶啓動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。

EXPOSE
格式爲 EXPOSE <port> [<port>...]
告訴 Docker 服務端容器暴露的端口號,供互聯繫統使用。在啓動容器時需要通過 -P,Docker 主機會自動分配一個端口轉發到指定的端口。

ENV
格式爲 ENV <key> <value>。 指定一個環境變量,會被後續 RUN 指令使用,並在容器運行時保持。
例如:
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD
格式爲 ADD <src> <dest>
該命令將複製指定的 到容器中的 。 其中 可以是Dockerfile所在目錄的一個相對路徑;也可以是一個 URL;還可以是一個 tar 文件(自動解壓爲目錄)。

COPY
格式爲 COPY <src> <dest>
複製本地主機的 <src>(爲 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>
當使用本地目錄爲源目錄時,推薦使用 COPY。

ENTRYPOINT
兩種格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執行)。
配置容器啓動後執行的命令,並且不可被 docker run 提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最後一個起效。

VOLUME
格式爲 VOLUME ["/data"]
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。

USER
格式爲 USER daemon
指定運行容器時的用戶名或 UID,後續的 RUN 也會使用指定用戶。
當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。要臨時獲取管理員權限可以使用 gosu,而不推薦 sudo。

WORKDIR
格式爲 WORKDIR /path/to/workdir
爲後續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。
可以使用多個 WORKDIR 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終路徑爲 /a/b/c。

ONBUILD
格式爲 ONBUILD [INSTRUCTION]
配置當所創建的鏡像作爲其它新創建鏡像的基礎鏡像時,所執行的操作指令。
例如,Dockerfile 使用如下的內容創建了鏡像 image-A。
[…]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[…]
如果基於 image-A 創建新的鏡像時,新的Dockerfile中使用 FROM image-A指定基礎鏡像時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令。
FROM image-A #Automatically run the followingADD . /app/srcRUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的鏡像,推薦在標籤中註明,例如 ruby:1.9-onbuild

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章