本文章來自【知識林】
在使用Dockerfile一構(gòu)建Docker鏡像之前需要先搞清楚Dockerfile中都有哪些常用的指令,這樣在使用起來才能得心應(yīng)手。
這篇文章主要列舉出Dockerfile中比較常用的指令及其用法和說明,需要注意的是這些指令都是全部大寫。
FROM:
- 說明:指定該鏡像的基礎(chǔ)鏡像
- 格式如:
FROM <image>或FROM <image>:<tag> - 示例:
FROM centos:7 - 注意:
FROM一般出現(xiàn)在文件頭,且每個鏡像都需要有一個FROM來指定基礎(chǔ)鏡像。
MAINTAINER:
- 說明:指定作者信息
- 格式如:
MAINTAINER <name> - 示例:
MAINTAINER 知識林 "393156105@qq.com"
RUN:
- 說明:在構(gòu)建鏡像時執(zhí)行腳本
- 格式如:
RUN <command>、RUN ["exec", "par1", "par2"] - 示例:
RUN ls -l(以詳細(xì)信息方式列表當(dāng)前目錄下的文件,跟在shell終端運行一樣)
CMD:
- 說明:在運行容器時執(zhí)行腳本
- 格式如:
CMD <command> <par1> <par2> ...、CMD ["exec", "par1", "par2"] - 示例:
CMD ["ls", "-l"] - 注意:一個Dockerfile中只有一條
CMD,如果有多條只執(zhí)行最后一條;在運行容器時如果用戶指定了運行命令則Dockerfile中的CMD將被覆蓋。
ENTRYPOINT:
- 說明:在運行容器時執(zhí)行腳本
- 格式如:
ENTRYPOINT ["exec", "par1", "par2"]、ENTRYPOINT command par1 par2 - 示例:
ENTRYPOINT ["catalina.sh", "run"] - 注意:一個Dockerfile中只有一條
ENTRYPOINT,如果有多條只執(zhí)行最后一條;不可以被容器運行時的命令所覆蓋。
EXPOSE:
- 說明:讓Docker暴露容器的端口號,供其他容器使用,在宿主機(jī)以外的網(wǎng)絡(luò)中是無法使用的
- 格式如:
EXPOSE <port> ... - 示例:
EXPOSE 8080 - 注意:
- 在Docker中有兩種暴露端口的概念,一種叫
EXPOSE隱式暴露,只供Docker服務(wù)內(nèi)部使用;另一種叫PUBLISH顯式暴露,供外部網(wǎng)絡(luò)使用,PUBLISH只是一個概念在Dockerfile中沒有這個指令。 -
EXPOSE只在Dockerfile中出現(xiàn),所暴露的端口只是被其他容器使用 -
PUBLISH沒有該指令而是通過docker run命令的參數(shù)-p、-P或在docker-compose中的ports來體現(xiàn) -
-P:大寫是屬于自動映射,將Dockerfile中EXPOSE所暴露的所有端口分別映射到宿主機(jī)的隨機(jī)端口,每次啟動或重啟容器時端口都可能有所不同 -
-p:小寫是屬于固定映射,格式如:-p 宿主端口:容器端口,宿主端口和容器端口可以是純數(shù)字也可以是一個范圍,如:-p 8060-8080:8060-8080,意為將宿主機(jī)的8060(含)到8080(含)的端口映射到容器的8060(含)到8080(含)端口,需要注意的是在使用范圍時,宿主端口個數(shù)應(yīng)該與容器端口個數(shù)匹配;但上面這個例子可以寫成:-p 7060-7080:8060-8080,這樣宿主的端口就在7060-7080范圍內(nèi)
- 在Docker中有兩種暴露端口的概念,一種叫
ENV:
- 說明:指定環(huán)境變量,在Dockerfile文件中的后續(xù)代碼中使用,在容器運行時也可以使用
- 格式如:
ENV <key> <value> - 示例:
ENV tomcat_home /web/tomcat/
ADD:
- 說明:添加文件(夾)到容器
- 格式如:
ADD <src> <dest> - 示例:
ADD web.jar /web.jar - 注意:復(fù)制指定的
<src>到容器中的<dest>,<src>可以是Dockerfile所在目錄的一個相對路徑,也可以是一個URL,也可以是一個tar文件(tar文件將自動解壓成文件目錄)
COPY:
- 說明:添加文件(夾)到容器
- 格式如:
COPY <src> <dest> - 示例:
COPY web.jar /web.jar - 注意:與
ADD功能相似,只是不能指定URL,使用本地文件(夾)為源文件時,推薦使用COPY
VOLUME:
- 說明:創(chuàng)建掛載點
- 格式如:
VOLUME [path] - 示例:
VOLUME ["/datas"] - 注意:
-
VOLUME在原理和概念上與EXPOSE差不多,都是屬于供容器與容器間使用 - 通過
VOLUME掛載的卷可以供其他容器使用 - 舉例說明:
-
創(chuàng)建一個Dockerfile來構(gòu)建一個鏡像,內(nèi)容如下:
FROM centos VOLUME ["/web/images", "/web/files"] -
構(gòu)建鏡像
docker build -t "zsl131/test01" . -
啟動容器
docker run -d --name test-root 可以使用命令:
docker inspect test-root來查看容器詳細(xì)信息,在Mounts部份可以看到兩個掛載點:/web/images和/web/files-
啟動另一個容器來共用這兩個掛載卷
docker run -it --name test-1 --volumes-from test-root centos注意:使用
--volumes-from來指定掛載點,這時容器test-root和test-1里面都分別有掛載卷/web/images和/web/files,可以啟動任意多個容器使用--volumes-from來共用這些掛載卷,這些容器可以來自不同的鏡像。當(dāng)任何一個容器中的掛載卷中的文件發(fā)生變化時其他容器掛載卷中的內(nèi)容也隨之改變。容器
test-root即使已經(jīng)停止也可以在啟動其他容器時使用--volumes-from test-root來掛載這些卷,只要test-root不被刪除,不過如果test-root真被刪除還可以使用--volumes-from test-1,因為容器test-1中還存在我們所需要的掛載卷,換句話說這些掛載卷永遠(yuǎn)存在直到所有使用這些掛載卷的容器都被刪除。 VOLUME與docker run參數(shù)-v是有區(qū)別的。docker run -v /host/web/images:/web/images -v /host/web/files:/web/files:rw是將容器內(nèi)的/web/images掛載到宿主機(jī)的/host/web/images目錄上;將容器內(nèi)的/web/files掛載到宿主機(jī)的/host/web/files目錄上,rw表示可讀寫。
-
-
WORKDIR:
- 說明:設(shè)置工作目錄
- 格式如:
WORKDIR /path - 示例:
WORKDIR /web - 注意:可以使用絕對路徑,也可以使用相對路徑,設(shè)置之后的所有操作都將在這個目錄下完成
特別注意
在上面的描述中可以看到有兩組指令在功能上都差不多,但也是有區(qū)別的:
-
RUN、CMD、ENTRYPOINT執(zhí)行腳本的指令- 三個指令都是執(zhí)行腳本
-
RUN是在創(chuàng)建鏡像是執(zhí)行,即使用docker build命令時執(zhí)行,在一個Dockerfile里面可以有多個RUN -
CMD和ENTRYPOINT是在運行容器時執(zhí)行,即使用docker run命令時執(zhí)行,這兩個指令在Dockerfile中都只有最行一條被執(zhí)行 -
CMD在使用docker run時可以加參數(shù)將Dockerfile中的CMD覆蓋 -
ENTRYPOINT在Dockerfile中出現(xiàn)后就一定會在docker run時被執(zhí)行,不必?fù)?dān)心會被其他參數(shù)所覆蓋。
-
ADD、COPY拷貝文件(夾)到容器-
ADD拷貝文件(夾)時可以指定本地文件、遠(yuǎn)程URL地址,如果拷貝的是tar文件時將會被自動解壓成文件夾 -
COPY拷貝文件(夾)時不可以指定遠(yuǎn)程URL地址,拷貝tar文件也不會被自動解壓成文件夾,在拷貝本地文件時建議使用COPY
-
本文章來自【知識林】