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的參數
-
-
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指令的網絡模式