本文章來自【知識(shí)林】
在使用Dockerfile一構(gòu)建Docker鏡像之前需要先搞清楚Dockerfile中都有哪些常用的指令,這樣在使用起來才能得心應(yīng)手笔呀。
這篇文章主要列舉出Dockerfile中比較常用的指令及其用法和說明辕近,需要注意的是這些指令都是全部大寫介褥。
FROM
:
- 說明:指定該鏡像的基礎(chǔ)鏡像
- 格式如:
FROM <image>
或FROM <image>:<tag>
- 示例:
FROM centos:7
- 注意:
FROM
一般出現(xiàn)在文件頭吮廉,且每個(gè)鏡像都需要有一個(gè)FROM
來指定基礎(chǔ)鏡像逾礁。
MAINTAINER
:
- 說明:指定作者信息
- 格式如:
MAINTAINER <name>
- 示例:
MAINTAINER 知識(shí)林 "393156105@qq.com"
RUN
:
- 說明:在構(gòu)建鏡像時(shí)執(zhí)行腳本
- 格式如:
RUN <command>
说铃、RUN ["exec", "par1", "par2"]
- 示例:
RUN ls -l
(以詳細(xì)信息方式列表當(dāng)前目錄下的文件,跟在shell終端運(yùn)行一樣)
CMD
:
- 說明:在運(yùn)行容器時(shí)執(zhí)行腳本
- 格式如:
CMD <command> <par1> <par2> ...
嘹履、CMD ["exec", "par1", "par2"]
- 示例:
CMD ["ls", "-l"]
- 注意:一個(gè)Dockerfile中只有一條
CMD
腻扇,如果有多條只執(zhí)行最后一條;在運(yùn)行容器時(shí)如果用戶指定了運(yùn)行命令則Dockerfile中的CMD將被覆蓋砾嫉。
ENTRYPOINT
:
- 說明:在運(yùn)行容器時(shí)執(zhí)行腳本
- 格式如:
ENTRYPOINT ["exec", "par1", "par2"]
幼苛、ENTRYPOINT command par1 par2
- 示例:
ENTRYPOINT ["catalina.sh", "run"]
- 注意:一個(gè)Dockerfile中只有一條
ENTRYPOINT
,如果有多條只執(zhí)行最后一條焰枢;不可以被容器運(yùn)行時(shí)的命令所覆蓋。
EXPOSE
:
- 說明:讓Docker暴露容器的端口號(hào)舌剂,供其他容器使用济锄,在宿主機(jī)以外的網(wǎng)絡(luò)中是無法使用的
- 格式如:
EXPOSE <port> ...
- 示例:
EXPOSE 8080
- 注意:
- 在Docker中有兩種暴露端口的概念,一種叫
EXPOSE
隱式暴露霍转,只供Docker服務(wù)內(nèi)部使用荐绝;另一種叫PUBLISH
顯式暴露,供外部網(wǎng)絡(luò)使用避消,PUBLISH
只是一個(gè)概念在Dockerfile中沒有這個(gè)指令低滩。 -
EXPOSE
只在Dockerfile中出現(xiàn),所暴露的端口只是被其他容器使用 -
PUBLISH
沒有該指令而是通過docker run
命令的參數(shù)-p
岩喷、-P
或在docker-compose
中的ports
來體現(xiàn) -
-P
:大寫是屬于自動(dòng)映射恕沫,將Dockerfile中EXPOSE
所暴露的所有端口分別映射到宿主機(jī)的隨機(jī)端口,每次啟動(dòng)或重啟容器時(shí)端口都可能有所不同 -
-p
:小寫是屬于固定映射纱意,格式如:-p 宿主端口:容器端口
婶溯,宿主端口和容器端口可以是純數(shù)字也可以是一個(gè)范圍,如:-p 8060-8080:8060-8080
,意為將宿主機(jī)的8060
(含)到8080
(含)的端口映射到容器的8060
(含)到8080
(含)端口迄委,需要注意的是在使用范圍時(shí)褐筛,宿主端口個(gè)數(shù)應(yīng)該與容器端口個(gè)數(shù)匹配;但上面這個(gè)例子可以寫成:-p 7060-7080:8060-8080
叙身,這樣宿主的端口就在7060-7080
范圍內(nèi)
- 在Docker中有兩種暴露端口的概念,一種叫
ENV
:
- 說明:指定環(huán)境變量渔扎,在Dockerfile文件中的后續(xù)代碼中使用,在容器運(yùn)行時(shí)也可以使用
- 格式如:
ENV <key> <value>
- 示例:
ENV tomcat_home /web/tomcat/
ADD
:
- 說明:添加文件(夾)到容器
- 格式如:
ADD <src> <dest>
- 示例:
ADD web.jar /web.jar
- 注意:復(fù)制指定的
<src>
到容器中的<dest>
信轿,<src>
可以是Dockerfile所在目錄的一個(gè)相對(duì)路徑晃痴,也可以是一個(gè)URL,也可以是一個(gè)tar
文件(tar
文件將自動(dòng)解壓成文件目錄)
COPY
:
- 說明:添加文件(夾)到容器
- 格式如:
COPY <src> <dest>
- 示例:
COPY web.jar /web.jar
- 注意:與
ADD
功能相似虏两,只是不能指定URL愧旦,使用本地文件(夾)為源文件時(shí)墩弯,推薦使用COPY
VOLUME
:
- 說明:創(chuàng)建掛載點(diǎn)
- 格式如:
VOLUME [path]
- 示例:
VOLUME ["/datas"]
- 注意:
-
VOLUME
在原理和概念上與EXPOSE
差不多摩泪,都是屬于供容器與容器間使用 - 通過
VOLUME
掛載的卷可以供其他容器使用 - 舉例說明:
-
創(chuàng)建一個(gè)Dockerfile來構(gòu)建一個(gè)鏡像,內(nèi)容如下:
FROM centos VOLUME ["/web/images", "/web/files"]
-
構(gòu)建鏡像
docker build -t "zsl131/test01" .
-
啟動(dòng)容器
docker run -d --name test-root
可以使用命令:
docker inspect test-root
來查看容器詳細(xì)信息直撤,在Mounts
部份可以看到兩個(gè)掛載點(diǎn):/web/images
和/web/files
-
啟動(dòng)另一個(gè)容器來共用這兩個(gè)掛載卷
docker run -it --name test-1 --volumes-from test-root centos
注意:使用
--volumes-from
來指定掛載點(diǎn)祖凫,這時(shí)容器test-root
和test-1
里面都分別有掛載卷/web/images
和/web/files
琼蚯,可以啟動(dòng)任意多個(gè)容器使用--volumes-from
來共用這些掛載卷,這些容器可以來自不同的鏡像惠况。當(dāng)任何一個(gè)容器中的掛載卷中的文件發(fā)生變化時(shí)其他容器掛載卷中的內(nèi)容也隨之改變遭庶。容器
test-root
即使已經(jīng)停止也可以在啟動(dòng)其他容器時(shí)使用--volumes-from test-root
來掛載這些卷,只要test-root
不被刪除稠屠,不過如果test-root
真被刪除還可以使用--volumes-from test-1
峦睡,因?yàn)槿萜?code>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
- 注意:可以使用絕對(duì)路徑,也可以使用相對(duì)路徑满俗,設(shè)置之后的所有操作都將在這個(gè)目錄下完成
特別注意
在上面的描述中可以看到有兩組指令在功能上都差不多转捕,但也是有區(qū)別的:
-
RUN
、CMD
唆垃、ENTRYPOINT
執(zhí)行腳本的指令- 三個(gè)指令都是執(zhí)行腳本
-
RUN
是在創(chuàng)建鏡像是執(zhí)行五芝,即使用docker build
命令時(shí)執(zhí)行,在一個(gè)Dockerfile里面可以有多個(gè)RUN
-
CMD
和ENTRYPOINT
是在運(yùn)行容器時(shí)執(zhí)行辕万,即使用docker run
命令時(shí)執(zhí)行与柑,這兩個(gè)指令在Dockerfile中都只有最行一條被執(zhí)行 -
CMD
在使用docker run
時(shí)可以加參數(shù)將Dockerfile中的CMD
覆蓋 -
ENTRYPOINT
在Dockerfile中出現(xiàn)后就一定會(huì)在docker run
時(shí)被執(zhí)行谤辜,不必?fù)?dān)心會(huì)被其他參數(shù)所覆蓋。
-
ADD
价捧、COPY
拷貝文件(夾)到容器-
ADD
拷貝文件(夾)時(shí)可以指定本地文件丑念、遠(yuǎn)程URL地址,如果拷貝的是tar
文件時(shí)將會(huì)被自動(dòng)解壓成文件夾 -
COPY
拷貝文件(夾)時(shí)不可以指定遠(yuǎn)程URL地址结蟋,拷貝tar
文件也不會(huì)被自動(dòng)解壓成文件夾脯倚,在拷貝本地文件時(shí)建議使用COPY
-
本文章來自【知識(shí)林】