天天看點

docker Dockerfile建立鏡像

Dockerfile官方介紹

Dockerfile官方demo鏡像使用和文檔

一 Dockerfile 結構

  • 繼承的基礎鏡像

    指令:FROM

  • 維護者資訊

    指令:MAINTAINER

  • 鏡像操作指令

    指令:RUN、COPY、ENV、ADD、WORKDIR、ONBUILD、USER、VOLUME、EXPOSE

  • 容器啟動指令

    指令:CMD、ENTRYPOINT

下面是一個簡單的Dockerfile文檔

#注釋符号#

#繼承openjdk:7鏡像,注:FROM指令必須放在最前面
FROM openjdk:7

#将當期目錄内容複制到容器/usr/src/myapp
COPY . /usr/src/myapp

#設定容器工作目錄/usr/src/myapp
WORKDIR /usr/src/myapp

#工作目錄下執行指令javac Main.java 編譯java檔案(這個目錄下要有檔案Main.java哦!)
RUN javac Main.java

#容器啟動後執行指令 java Main
CMD ["java", "Main"]
           

二 Dockerfile 指令

Dockerfile各個指令解釋

  • FROM

    格式:FROM image[:tag] 指定要建立的鏡像的基礎鏡像

    第一條指令必須是FROM,Dockerfile可以建立多個鏡像,是以可以有多個FROM,每個鏡像的第一條指令保證是FROM

  • MAINTAINER

    格式:MAINTAINER author_name

    指定維護者資訊,也就是作者

  • RUN

    格式:RUN command 或 RUN [“executable” , “param1” ,“param2” , …]

    如:

    RUN javac Main.java 或RUN [“javac” , “Main.java”]

    長指令可以用 \ 換行

  • COPY

    格式:COPY src dest

    将本機src檔案或目錄複制到容器中的位置dest,自動建立不存在的路徑

    注意:

    src 既可以是檔案也可以是目錄

    dest必須是絕對路徑

    COPY 是純粹的複制不做其他操作,如解壓,下載下傳。這也是和ADD指令的差別

  • ENV

    格式:ENV key value

    建立一個容器中的環境變量,整個容器運作中都能使用。

    可以有多個ENV指令建立多個容器環境變量

    $key 擷取環境變量key的值

  • ADD

    格式:ADD src dest

    ADD 和 COPY一樣能夠複制本機檔案或目錄到容器中,除了和COPY一樣的功能外,還多了一些功能:src 可以是一個URL,如果src是一個壓縮檔案tar會自動解壓

    ADD 可以認為是更進階的COPY

    注:盡可能的使用 COPY,因為 COPY 的語義很明确,就是複制檔案而已,而 ADD 則包含了更複雜的功能,其行為也不一定很清晰。最适合使用 ADD 的場合,就是所提及的需要自動解壓縮的場合。

    另外需要注意的是,ADD 指令會令鏡像建構緩存失效,進而可能會令鏡像建構變得比較緩慢。

    是以在 COPY 和 ADD 指令中選擇的時候,可以遵循這樣的原則,所有的檔案複制均使用 COPY 指令,僅在需要自動解壓縮的場合使用 ADD

  • WORKDIR

    格式:WORKDIR path

    設定容器中的工作目錄path,可以多次設定容器工作目錄,第一次設定需要是絕對路徑,後面設定可用是相對路徑,相對于上一次設定的工作路徑。

    後面的指令 RUN 、CMD 、ENTRYPOINT都是在工作目錄中執行的

  • ONBUILD

    格式:ONBUILD 指令

    當ONBUILD 所在鏡像被其他鏡像當做基礎鏡像時所執行的指令。隻有在被繼承時才生效。

    注:建議docker build建立鏡像時标簽中加上onbuild 字元串 提醒這個鏡像裡面有onbuild操作

  • USER

    格式:USER 使用者

    指定容器執行使用者

  • VOLUME

    格式:VOLUME 本機目錄 容器目錄

    建立容器的資料卷,類似linux的挂載,将 本地目錄 挂載到 容器目錄,往指定的容器目錄中寫的内容實際寫入到指定的本地目錄中。

    資料庫資料 一般不存在容器中

  • EXPOSE

    格式:EXPOSE port [port2,port3,…]

    暴露容器端口,在啟動容器時需要用-P指定本地端口映射到容器暴露出的端口上,如果沒有指定本地端口,會随機配置設定本地端口。

#EXPOSE 可以有多個,如下:
	EXPOSE 8081 8082
	EXPOSE 8083
	...
           
  • CMD

    3種格式:

    • CMD [“指令”,“參數1”,“參數2”,…]

      使用exec 執行指令

    • CMD 指令 參數1 參數2 …

      在shell中執行指令

    • CMD 參數1 參數2 …

      作為ENTRYPOINT的參數,因為當同時存在CMD和ENTRYPOINT時,CMD會作為ENTRYPOINT的參數

    CMD可以有多個,但是隻有最後一個會生效。啟動容器指定的容器運作指令會覆寫Dockerfile裡面CMD指令。
  • ENTRYPOINT

    2種格式:

    • ENTRYPOINT [“指令”,“參數1”,“參數2”,…]

      使用exec 執行指令

    • ENTRYPOINT 指令 參數1 參數2 …

      在shell中執行指令

      ENTRYPOINT 和 CMD功能一樣都是容器動執行的指令,當ENTRYPOINT 和 CMD 都存在時,CMD 會 作為 ENTRYPOINT 的參數。啟動容器指定的CMD參數覆寫Dockerfile中的CMD,同樣的,如果有ENTRYPOINT ,會被作為ENTRYPOINT 的參數。

      多個ENTRYPOINT 隻有最後一個生效。

三 使用Dockerfile建立鏡像

指令:

docker build [OPTIONS] 上下文路徑

docker build [OPTIONS] URL

例:

docker build -t testimage .

參數-t指定了鏡像名為testimage

注意最後有一個點 ‘.’ 指目前目錄作為上下文 由于沒有使用-f參數指定Dockerfile,是以使用上下文路徑下名為Dockerfile的檔案認為是建構鏡像的Dockerfile。

執行docker build後,會首先将上下文目錄的所有檔案打包,然後傳給Docker daemon,這樣 Docker daemon收到這個上下文包後,展開就會獲得建構鏡像所需的一切檔案。

docker build 的 OPTIONS 參數說明:

--build-arg=[] :設定鏡像建立時的變量;
--cpu-shares :設定 cpu 使用權重;
--cpu-period :限制 CPU CFS周期;
--cpu-quota :限制 CPU CFS配額;
--cpuset-cpus :指定使用的CPU id;
--cpuset-mems :指定使用的記憶體 id;
--disable-content-trust :忽略校驗,預設開啟;
-f :指定要使用的Dockerfile路徑;
--force-rm :設定鏡像過程中删除中間容器;
--isolation :使用容器隔離技術;
--label=[] :設定鏡像使用的中繼資料;
-m :設定記憶體最大值;
--memory-swap :設定Swap的最大值為記憶體+swap,"-1"表示不限swap;
--no-cache :建立鏡像的過程不使用緩存;
--pull :嘗試去更新鏡像的新版本;
--quiet, -q :安靜模式,成功後隻輸出鏡像 ID;
--rm :設定鏡像成功後删除中間容器;
--shm-size :設定/dev/shm的大小,預設值是64M;
--ulimit :Ulimit配置。
--tag, -t: 鏡像的名字及标簽,通常 name:tag 或者 name 格式;可以在一次建構中為一個鏡像設定多個标簽。
--network: 預設 default。在建構期間設定RUN指令的網絡模式