在前邊的隨筆中我們聊到了docker的基本命令,鏡像,網(wǎng)絡(luò),存儲卷以及基于現(xiàn)有容器制做docker鏡像,相關(guān)隨筆可參考https://www.cnblogs.com/qiuhom-1874/category/1766327.html;今天我們來聊一聊docker的另一個(gè)制作鏡像的方式dockerfile; 什么是dockerfile?所謂dockerfile就是用來描述docker鏡像制作過程的一指令文件;該文件是一個(gè)純文本文件,docker Daemon 進(jìn)程可以從該文件中讀取指令,從而自動(dòng)生成鏡像;客戶端可以使用docker bulid命令來指定dockerfile 所在目錄,來生成以dockerfile里描述的鏡像構(gòu)建過程的鏡像; 首先我們來了解下dockerfile的格式,dockerfile是一個(gè)純文本文件,我們可以理解為構(gòu)建鏡像的源碼;不同于其他編程語言,dockerfile里沒有if else 沒有循環(huán),它里面僅僅有注釋和構(gòu)建鏡像的指令;對于dockerfile注釋就是以井號開頭的行為注釋,這個(gè)和shell和其他配置文件的語法一樣;除此之外dockerfile里就只有指令了;嚴(yán)格的講指令是不區(qū)分字符大小寫的,通常我們約定俗成指令都是純大寫;除此之外在dockerfile的第一非注釋行必須是FROM開頭來明確的說明我們在基于那個(gè)鏡像為基礎(chǔ)鏡像做鏡像; 通常情況下dockerfile是放在一個(gè)目錄下,該目錄就是dockerfile的工作目錄,我們在制作鏡像所依賴的文件都必須放在該目錄下,而dockerfile的名稱也必須是Dockerfile(首字母大寫,名稱必須是Dockerfile),如果我們依賴的文件是一個(gè)目錄下的部分文件,我們也可在dockerfile所在目錄創(chuàng)建一個(gè).dockerignore文件,把我們要忽略的文件名稱寫到里面即可,該文件支持通配符; 了解了上面的dockerfile的基本環(huán)境結(jié)構(gòu),接下來我們來說說dockerfile的指令的用法; 1、FROM:用于指定所創(chuàng)建鏡像的基礎(chǔ)鏡像,如果本地不存在,默認(rèn)會從dockerhub中下載;該指令是dockerfile里的第一個(gè)非注釋行的指令;語法格式 FROM <repository>[:<tag>] 或者FROM <repository>@<digest> 其中repository是指定的base 鏡像的名稱 <tag>是base 鏡像的標(biāo)簽為可選項(xiàng),不指定標(biāo)簽?zāi)J(rèn)表示使用指定鏡像的latest版本; 2、MAINTAINER:用于指定維護(hù)者信息,dockerfile并不限制MAINTAINER指令可出現(xiàn)的位置,通常我們建議將該指令放在FROM之后;語法格式 MAINTAINER <authtor's detail>, <author's detail>可是任何文本信息,但約定俗成地使用作者名稱及郵件地址; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" [root@node1 test]# 提示:通常我們都不用MAINTAINER來指定作者信息,該指令幾乎是廢棄狀態(tài),建議使用LEBEL指令來指定; 3、LABEL:該指令用于指定添加鏡像的元數(shù)據(jù)信息;語法格式為LABEL <key>=<value> <key>=<value> <key>=<value> ...;如果添加的元數(shù)據(jù)信息值中有空格,我們需要使用引號和反斜線進(jìn)行命令行解析; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." [root@node1 test]# 提示:LABEL指令可以使用多次,用于添加更多的元數(shù)據(jù)信息; 4、COPY:該指令用于從Docker主機(jī)復(fù)制文件至創(chuàng)建的鏡像文件中;語法格式 COPY <src> ... <dest> 或 COPY ["<src>",... "<dest>"];<src>表示要復(fù)制的源文件或目錄,支持使用通配符;<dest>表示目標(biāo)路徑,即正在創(chuàng)建的image的文件系統(tǒng)路徑;建議為<dest>使用絕對路徑,否則,COPY指定則以WORKDIR為其起始路徑;注意:在路徑中有空白字符時(shí),通常使用第二種格式; 文件復(fù)制準(zhǔn)則 1、<src>必須是Dockerfile所在目錄中的文件,不能是其父目錄中的文件; 2、如果<src>是目錄,則其內(nèi)部文件或子目錄會被遞歸復(fù)制,但<src>目錄自身不會被復(fù)制; 3、如果指定了多個(gè)<src>,或在<src>中使用了通配符,則<dest>必須是一個(gè)目錄,且必須以“/”結(jié)尾; 4、如果<dest>事先不存在,它會被自動(dòng)創(chuàng)建,則包括其父目錄路徑; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." COPY html /var/www/html/ COPY test.html /tmp/ [root@node1 test]# tree . ├── Dockerfile ├── html │ ├── test1.html │ └── test2.html └── test.html 1 directory, 4 files [root@node1 test]# 測試:我們基于上面的Dockerfile構(gòu)建鏡像,看看構(gòu)建好的鏡像是否把對應(yīng)文件都復(fù)制到對應(yīng)目錄下了? [root@node1 test]# ls Dockerfile html test.html [root@node1 test]# pwd /root/test [root@node1 test]# docker build . -t myimg:v0.1 Sending build context to Docker daemon 5.632kB Step 1/6 : FROM busybox:latest latest: Pulling from library/busybox d9cbbca60e5f: Pull complete Digest: sha256:836945da1f3afe2cfff376d379852bbb82e0237cb2925d53a13f53d6e8a8c48c Status: Downloaded newer image for busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Running in c311afd3d522 Removing intermediate container c311afd3d522 ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Running in 2ffb577afa08 Removing intermediate container 2ffb577afa08 ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Running in 489165bad668 Removing intermediate container 489165bad668 ---> 994f06ff65f8 Step 5/6 : COPY html /var/www/html/ ---> f2b46094d9a9 Step 6/6 : COPY test.html /tmp/ ---> c78c7188f804 Successfully built c78c7188f804 Successfully tagged myimg:v0.1 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.1 c78c7188f804 8 seconds ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# 提示:可以看到docker在讀dockerfile時(shí)會把一條指令啟動(dòng)一容器來執(zhí)行,然后每一條指令都會構(gòu)建成一層鏡像;如果我們本地倉庫中沒有我們指定的基礎(chǔ)鏡像,它默認(rèn)會從dockerhub倉庫中去把指定鏡像拖到本地;docker build命令是用來基于dockerfile來制作鏡像的命令,其中-t表示指定我們生成的鏡像的標(biāo)簽信息; 運(yùn)行我們剛才制作好的鏡像,看看我們的指定的目錄和文件是否都復(fù)制到指定鏡像中的目錄中去了? [root@node1 test]# docker run --name test --rm -it myimg:v0.1 /bin/sh / # ls bin dev etc home proc root sys tmp usr var / # ls /var/www/html/ test1.html test2.html / # ls /tmp/ test.html / # cat /var/www/html/test1.html this is test1 html / # cat /var/www/html/test2.html this is test2 html / # cat /tmp/test.html this is test dir html / # exit [root@node1 test]# 提示:可以看到我們以剛才制作的鏡像運(yùn)行成容器,容器對應(yīng)目錄有我們指定復(fù)制的文件; 示例: [root@node1 test]# ls Dockerfile html nginx-1.19.0.tar.gz test.html [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." COPY html /var/www/html/ COPY test.html /tmp/ ADD http:///download/nginx-1.18.0.tar.gz /usr/src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# 提示:以上Dokcerfile里指定把當(dāng)前目錄下的nginx-1.19.0.tar.gz 添加到鏡像中的/tmp/下,并且會把nginx-1.19.0.tar.gz展開成一個(gè)目錄;而對于 ADD http:///download/nginx-1.18.0.tar.gz /usr/src/這條指令它會把指定url的文件下載到/usr/src/,但是不會tar文件展開; 測試:把上面dockerfile編譯成鏡像,看看對應(yīng)目錄中的文件是否都展開了? [root@node1 test]# docker build . -t myimg:v0.2 Sending build context to Docker daemon 1.05MB Step 1/8 : FROM busybox:latest ---> 78096d0a5478 Step 2/8 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/8 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/8 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/8 : COPY html /var/www/html/ ---> Using cache ---> f2b46094d9a9 Step 6/8 : COPY test.html /tmp/ ---> Using cache ---> c78c7188f804 Step 7/8 : ADD http:///download/nginx-1.18.0.tar.gz /usr/src/ Downloading 1.04MB/1.04MB ---> 23f47a028853 Step 8/8 : ADD nginx-1.19.0.tar.gz /tmp/ ---> 6ba2693b3084 Successfully built 6ba2693b3084 Successfully tagged myimg:v0.2 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.2 6ba2693b3084 27 seconds ago 8.54MB myimg v0.1 c78c7188f804 25 minutes ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.2 /bin/sh / # ls /usr/src/ nginx-1.18.0.tar.gz / # ls /tmp nginx-1.19.0 test.html / # exit [root@node1 test]# 提示:從上面的信息可以看到,在容器中的/usr/src/目錄下nginx-1.18.0.tar.gz并沒有展開,而在/tmp/下卻把niginx-1.19.0.tar.gz展開為nginx-1.19.0;從build的過程來看,除開后面的ADD過程,其他過程都很快,并且明確告訴我們使用了cache,則意味著在本地倉庫中有的鏡像層,默認(rèn)是共享的; 6、WORKDIR:該指令用于設(shè)定Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指令的工作目錄;一個(gè)Dockerfile中可以多次使用WORKDIR來指定當(dāng)前WORKDIR指令到下一個(gè)WORKDIR指令之間的指令的工作目錄;語法格式WORKDIR <dirpath>;在Dockerfile文件中,WORKDIR指令可出現(xiàn)多次,其路徑也可以為相對路徑,不過,其是相對此前一個(gè)WORKDIR指令指定的路徑,另外,WORKDIR也可調(diào)用由ENV指定定義的變量; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." WORKDIR /var/www/ COPY html html/ COPY test.html /tmp/ WORKDIR /usr/ ADD http:///download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# 提示:我們在dockerfile中指定了workdir的路徑后,其后的指令就可以以上一個(gè)workdir指定的路徑 為基準(zhǔn)后面使用相對路徑; 測試:制作鏡像運(yùn)行容器,看看是否把對應(yīng)文件都添加到容器的指定目錄里? [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." WORKDIR /var/www/ COPY html html/ COPY test.html /tmp/ WORKDIR /usr/ ADD http:///download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# [root@node1 test]# docker build . -t myimg:v0.3 Sending build context to Docker daemon 1.05MB Step 1/10 : FROM busybox:latest ---> 78096d0a5478 Step 2/10 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/10 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/10 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/10 : WORKDIR /var/www/ ---> Running in 623002a4c418 Removing intermediate container 623002a4c418 ---> 7e6898b36dd5 Step 6/10 : COPY html html/ ---> 57ff5a48a104 Step 7/10 : COPY test.html /tmp/ ---> f66a1bf4040a Step 8/10 : WORKDIR /usr/ ---> Running in b905ff1b4529 Removing intermediate container b905ff1b4529 ---> 1fdceb9a6bfd Step 9/10 : ADD http:///download/nginx-1.18.0.tar.gz src/ Downloading 1.04MB/1.04MB ---> 92868df29f5b Step 10/10 : ADD nginx-1.19.0.tar.gz /tmp/ ---> 68161c3beb90 Successfully built 68161c3beb90 Successfully tagged myimg:v0.3 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.3 68161c3beb90 11 seconds ago 8.54MB myimg v0.2 6ba2693b3084 18 minutes ago 8.54MB myimg v0.1 c78c7188f804 43 minutes ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.3 /bin/sh /usr # pwd /usr /usr # ls sbin src /usr # ls src/ nginx-1.18.0.tar.gz /usr # ls /tmp/ nginx-1.19.0 test.html /usr # ls /var/www/ html /usr # exit [root@node1 test]# 提示:可以看到我們制作的鏡像啟動(dòng)為容器后,默認(rèn)是我們指定的最后一個(gè)workdir的路徑; 示例:使用環(huán)境變量指定workdi的路徑; [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ENV webhome="/var/www/" src_home="/usr/" WORKDIR $webhome COPY html html/ COPY test.html /tmp/ WORKDIR $src_home ADD http:///download/nginx-1.18.0.tar.gz src/ ADD nginx-1.19.0.tar.gz /tmp/ [root@node1 test]# 提示:我們在原有的Dockerfile中添加了ENV webhome="/var/www/" src_home="/usr/" 表示添加兩個(gè)環(huán)境變量,而這兩個(gè)環(huán)境的變量的值分別是“/var/www/” 和“/usr” 這樣一來,在后面workdir引用該環(huán)境變量時(shí) 就會把對應(yīng)的值給替換過去;dockerfile中變量引用同shell中的變量引用一樣都是使用$符合引用變量; 測試:利用上面的Dockerfile編譯成鏡像,然后運(yùn)行成容器,看看我們在dockerfile中定義的環(huán)境變量是否能夠被容器所引用? [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.3 68161c3beb90 34 minutes ago 8.54MB myimg v0.2 6ba2693b3084 53 minutes ago 8.54MB myimg v0.1 c78c7188f804 About an hour ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . -t myimg:v0.4 Sending build context to Docker daemon 1.05MB Step 1/11 : FROM busybox:latest ---> 78096d0a5478 Step 2/11 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/11 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/11 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/11 : ENV webhome="/var/www/" src_home="/usr/" ---> Running in 82738c50a595 Removing intermediate container 82738c50a595 ---> 9f089c14778f Step 6/11 : WORKDIR $webhome ---> Running in 3e9d7d4276bf Removing intermediate container 3e9d7d4276bf ---> 94e17268d7ea Step 7/11 : COPY html html/ ---> cf3be18998db Step 8/11 : COPY test.html /tmp/ ---> 3b81cb058412 Step 9/11 : WORKDIR $src_home ---> Running in 70478cb9d405 Removing intermediate container 70478cb9d405 ---> e0d8ab9331f4 Step 10/11 : ADD http:///download/nginx-1.18.0.tar.gz src/ Downloading 1.04MB/1.04MB ---> b4e546989783 Step 11/11 : ADD nginx-1.19.0.tar.gz /tmp/ ---> df3d040b5766 Successfully built df3d040b5766 Successfully tagged myimg:v0.4 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.4 df3d040b5766 4 minutes ago 8.54MB myimg v0.3 68161c3beb90 41 minutes ago 8.54MB myimg v0.2 6ba2693b3084 59 minutes ago 8.54MB myimg v0.1 c78c7188f804 About an hour ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.4 /bin/sh /usr # pwd /usr /usr # ls /var/www/ html /usr # ls /usr/src/ nginx-1.18.0.tar.gz /usr # 提示:可以看到我們指定的ENV環(huán)境變量是能夠被WORKDIR說引用 7、ENV:用于為鏡像定義所需的環(huán)境變量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所調(diào)用;調(diào)用格式為$variable_name或${variable_name};語法格式ENV <key> <value> 或 ENV <key>=<value> ...;第一種格式中,<key>之后的所有內(nèi)容均會被視作其<value>的組成部分,因此,一次只能設(shè)置一個(gè)變量;第二種格式可用一次設(shè)置多個(gè)變量,每個(gè)變量為一個(gè)"<key>=<value>"的鍵值對,如果<value>中包含空格,可以以反斜線(\)進(jìn)行轉(zhuǎn)義,也可通過對<value>加引號進(jìn)行標(biāo)識;另外,反斜線也可用于續(xù)行;定義多個(gè)變量時(shí),建議使用第二種方式,以便在同一層中完成所有功能; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ENV web_home="/var/www/html/" COPY html ${web_home} [root@node1 test]# 提示:上面Dockerfile設(shè)置了環(huán)境變量web_home="/var/www/html" ,后面的COPY引用時(shí)直接使用${web_home}即可;COPY html ${web_home}表示把html目錄中的文件復(fù)制到web_home這個(gè)變量所指定的目錄中,即/var/www/html/; 測試:編譯成鏡像,看看是否把對應(yīng)html目錄下的文件復(fù)制到/var/www/html/目錄下了? [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.4 df3d040b5766 17 minutes ago 8.54MB myimg v0.3 68161c3beb90 54 minutes ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . -t myimg:v0.5 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ENV web_home="/var/www/html/" ---> Running in 4c136d790dd0 Removing intermediate container 4c136d790dd0 ---> 90e193e4e810 Step 6/6 : COPY html ${web_home} ---> e21e9479b0a7 Successfully built e21e9479b0a7 Successfully tagged myimg:v0.5 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.5 e21e9479b0a7 4 seconds ago 1.22MB myimg v0.4 df3d040b5766 17 minutes ago 8.54MB myimg v0.3 68161c3beb90 54 minutes ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.5 /bin/sh / # ls /var/www/html/ test1.html test2.html / # exit [root@node1 test]# 提示:可以看到我們打包的鏡像運(yùn)行成容器后,ENV指定的環(huán)境變量目錄里有html目錄下的所有文件; 8、ARG:該指令用于編譯階段可以使用docker build --build-arg向dockerfile里ARG 指定的變量傳遞值;語法格式ARG <name>[=<default value>];該指令可以在dockerfile中使用多次,也可以給定默認(rèn)變量一個(gè)默認(rèn)的值,在用戶沒有向該變量傳遞值的情況; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home="/var/www/html/" COPY html ${web_home} [root@node1 test]# 提示:以上Dockerfile 指定了web_home變量的默認(rèn)值是“/var/www/html/” 如果在我們build階段沒有使用--build-arg來向web_home傳遞值時(shí),它默認(rèn)就是“/var/www/html/”,如果我們使用了 --build-agr 指定web_home的值后,后面引用web_home變量的值就是我們用--build-arg傳遞給它的值; 測試:使用--build-arg向web_home傳遞值 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.5 e21e9479b0a7 14 minutes ago 1.22MB myimg v0.4 df3d040b5766 31 minutes ago 8.54MB myimg v0.3 68161c3beb90 About an hour ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . --build-arg web_home="/usr/share/www/html/" -t myimg:v0.6 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ARG web_home="/var/www/html/" ---> Running in d8697abf9206 Removing intermediate container d8697abf9206 ---> 6abb65dab341 Step 6/6 : COPY html ${web_home} ---> 385cba27c288 Successfully built 385cba27c288 Successfully tagged myimg:v0.6 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.6 385cba27c288 6 seconds ago 1.22MB myimg v0.5 e21e9479b0a7 15 minutes ago 1.22MB myimg v0.4 df3d040b5766 32 minutes ago 8.54MB myimg v0.3 68161c3beb90 About an hour ago 8.54MB myimg v0.2 6ba2693b3084 About an hour ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v0.6 /bin/sh / # ls /usr/share/www/html/ test1.html test2.html / # exit [root@node1 test]# 提示:可以看到我們傳遞進(jìn)去的路徑下有html目錄下的兩個(gè)網(wǎng)頁文件;這說明通過--build-arg 選項(xiàng)可以向Dockerfile里ARG指定指定的變量傳遞值的; 示例:引用變量給定變量默認(rèn)值 [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home COPY html ${web_home:-"/data/htdoc/"} [root@node1 test]# 提示:引用變量給定變量默認(rèn)值的方式同shell中的用法一樣;${web_home:-"/data/htdoc/"} 表示如果web_home這個(gè)變量的值未設(shè)定或者為空時(shí),就使用默認(rèn)的值“/data/htdoc/”這個(gè)值,如果設(shè)置了,那么設(shè)置的是什么值就是什么值; 測試:不使用--build-arg向web_home傳遞值,看看web_home是否會拿到默認(rèn)值? [root@node1 test]# docker build . -t myimg:v0.7 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ARG web_home ---> Running in 9d98f8e3a1f0 Removing intermediate container 9d98f8e3a1f0 ---> f164cc3e24ad Step 6/6 : COPY html ${web_home:-"/data/htdoc/"} ---> 4bedea2590b7 Successfully built 4bedea2590b7 Successfully tagged myimg:v0.7 [root@node1 test]# docker run --name test --rm -it myimg:v0.7 /bin/sh / # ls / bin data dev etc home proc root sys tmp usr var / # ls /data/ htdoc / # ls /data/htdoc/ test1.html test2.html / # exit [root@node1 test]# 提示:可以看到不想web_home傳遞值,默認(rèn)就是使用我們給設(shè)定的默認(rèn)值 測試:向web_home傳遞值,看看是否還會使用默認(rèn)值呢? [root@node1 test]# docker build . --build-arg web_home=/web/html/ -t myimg:v0.9 Sending build context to Docker daemon 1.05MB Step 1/6 : FROM busybox:latest ---> 78096d0a5478 Step 2/6 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/6 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/6 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/6 : ARG web_home ---> Using cache ---> f164cc3e24ad Step 6/6 : COPY html ${web_home:-"/data/htdoc/"} ---> 4b6993911e6d Successfully built 4b6993911e6d Successfully tagged myimg:v0.9 [root@node1 test]# docker run --name test --rm -it myimg:v0.9 /bin/sh / # ls / bin dev etc home proc root sys tmp usr var web / # ls /web/ html / # ls /web/html/ test1.html test2.html / # exit [root@node1 test]# 提示:可以看到通過--build-arg傳遞了web_home的值為“/web/htm/”后,默認(rèn)的“/data/htdoc/”的值就不會生效; 9、VOLUME:用于在image中創(chuàng)建一個(gè)掛載點(diǎn)目錄,以掛載Docker host上的卷或其它容器上的卷;語法格式 VOLUME <mountpoint> 或 VOLUME ["<mountpoint>"];如果掛載點(diǎn)目錄路徑下此前的文件存在,docker run命令會在卷掛載完成后將此前的所有文件復(fù)制到新掛載的卷中; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home COPY html ${web_home:-"/data/htdoc/"} VOLUME ${web_home:-"/data/htdoc/"} [root@node1 test]# 提示:volume是指定鏡像里的掛載點(diǎn),如果該掛載點(diǎn)里面原來是有文件存在,在使用docker run 時(shí),用-v指定把宿主機(jī)上的某個(gè)目錄掛載到該掛載點(diǎn)時(shí),默認(rèn)會把原來有的文件復(fù)制新掛載的卷中;這里還需要特被說一下,這里指定卷是在鏡像內(nèi)部創(chuàng)建一個(gè)掛載點(diǎn),運(yùn)行成容器還需要我們手動(dòng)的用-v去指定把那個(gè)目錄掛載到該掛載點(diǎn),如果不指定默認(rèn)就是docker-managed 類型的卷; 測試:編譯成鏡像,然后運(yùn)行成容器,看看我們指定的卷宗的文件會不會被覆蓋掉?是否會有文件存在? [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v0.9 4b6993911e6d 21 minutes ago 1.22MB myimg v0.7 4bedea2590b7 23 minutes ago 1.22MB myimg v0.6 385cba27c288 30 minutes ago 1.22MB myimg v0.5 e21e9479b0a7 46 minutes ago 1.22MB myimg v0.4 df3d040b5766 About an hour ago 8.54MB myimg v0.3 68161c3beb90 2 hours ago 8.54MB myimg v0.2 6ba2693b3084 2 hours ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker build . -t myimg:v1.0 Sending build context to Docker daemon 1.05MB Step 1/7 : FROM busybox:latest ---> 78096d0a5478 Step 2/7 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/7 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/7 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/7 : ARG web_home ---> Using cache ---> f164cc3e24ad Step 6/7 : COPY html ${web_home:-"/data/htdoc/"} ---> Using cache ---> 4bedea2590b7 Step 7/7 : VOLUME ${web_home:-"/data/htdoc/"} ---> Running in 34cad9ca1f79 Removing intermediate container 34cad9ca1f79 ---> 9554284e4bba Successfully built 9554284e4bba Successfully tagged myimg:v1.0 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v1.0 9554284e4bba 2 minutes ago 1.22MB myimg v0.9 4b6993911e6d 24 minutes ago 1.22MB myimg v0.7 4bedea2590b7 26 minutes ago 1.22MB myimg v0.6 385cba27c288 33 minutes ago 1.22MB myimg v0.5 e21e9479b0a7 49 minutes ago 1.22MB myimg v0.4 df3d040b5766 About an hour ago 8.54MB myimg v0.3 68161c3beb90 2 hours ago 8.54MB myimg v0.2 6ba2693b3084 2 hours ago 8.54MB myimg v0.1 c78c7188f804 2 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v1.0 /bin/sh / # ls / bin data dev etc home proc root sys tmp usr var / # ls /data/htdoc/ test1.html test2.html / # [root@node1 test]# [root@node1 test]# docker container inspect test -f {{.Mounts}} [{volume f3409b021267bd27d58c4b16fb1bc0dae77d4f92f7b5e6255f4ed26a6c27e459 /var/lib/docker/volumes/f3409b021267bd27d58c4b16fb1bc0dae77d4f92f7b5e6255f4ed26a6c27e459/_data /data/htdoc local true }] [root@node1 test]# ll /var/lib/docker/volumes/f3409b021267bd27d58c4b16fb1bc0dae77d4f92f7b5e6255f4ed26a6c27e459/_data total 8 -rw-r--r-- 1 root root 19 May 31 01:51 test1.html -rw-r--r-- 1 root root 19 May 31 01:51 test2.html [root@node1 test]# 提示:可以看到運(yùn)行成容器后,默認(rèn)會把我們指定卷掛載成docker-managed類型的卷;同時(shí)我們也看到了對應(yīng)掛載點(diǎn)上目錄會把原有文件復(fù)制到現(xiàn)volume中; 測試:手動(dòng)指定宿主機(jī)目錄掛載到掛載點(diǎn),文件是否還會存在呢? [root@node1 ~]# mkdir /work [root@node1 ~]# docker run --name test1 --rm -it -v /work:/data/htdoc/ myimg:v1.0 /bin/sh / # ls /data/htdoc/ / # [root@node1 ~]# ls /work/ [root@node1 ~]# 提示:手動(dòng)指定掛載關(guān)系,它就不會把原有目錄下的文件復(fù)制到現(xiàn)掛載目錄中了;也就是說,人為手動(dòng)指定掛載關(guān)系,宿主機(jī)上的的目錄會覆蓋容器內(nèi)掛載點(diǎn)下的文件;只有docker自身管理的掛載的卷才會把原目錄下的文件復(fù)制到現(xiàn)掛載目錄里; 10、EXPOSE:用于為容器打開指定要監(jiān)聽的端口以實(shí)現(xiàn)與外部通信(暴露端口);語法格式 EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]; <protocol>用于指定傳輸層協(xié)議,可為tcp或udp二者之一,默認(rèn)為TCP協(xié)議;EXPOSE指令可一次指定多個(gè)端口; 示例: [root@node1 test]# cat Dockerfile FROM busybox:latest MAINTAINER "qiuhom <qiuhom@linux-1874.com>" LABEL version="1.0" LABEL description="this is test file \ that label-values can span multiple lines." ARG web_home COPY html ${web_home:-"/data/htdoc/"} VOLUME ${web_home:-"/data/htdoc/"} EXPOSE 80/tcp 443/tcp [root@node1 test]# 提示:以上dockerfile中暴露了tcp的80和443端口;在dockerfile中使用EXPOSE暴露端口,在運(yùn)行成容器時(shí),如果不使用-P來暴露端口,容器里的端口還是暴露不出來;這里只是build階段明確說明要暴露80和443,而運(yùn)行成容器我們需要使用-P來把build暴露的端口暴露出來; 測試:運(yùn)行時(shí)不使用-P暴露端口,看看是否能夠把80和443暴露出來呢? [root@node1 test]# docker build . -t myimg:v1.1 Sending build context to Docker daemon 1.05MB Step 1/8 : FROM busybox:latest ---> 78096d0a5478 Step 2/8 : MAINTAINER "qiuhom <qiuhom@linux-1874.com>" ---> Using cache ---> bf9b966a914b Step 3/8 : LABEL version="1.0" ---> Using cache ---> 5dd2e4b3f594 Step 4/8 : LABEL description="this is test file \ that label-values can span multiple lines." ---> Using cache ---> 994f06ff65f8 Step 5/8 : ARG web_home ---> Using cache ---> f164cc3e24ad Step 6/8 : COPY html ${web_home:-"/data/htdoc/"} ---> Using cache ---> 4bedea2590b7 Step 7/8 : VOLUME ${web_home:-"/data/htdoc/"} ---> Using cache ---> 9554284e4bba Step 8/8 : EXPOSE 80/tcp 443/tcp ---> Running in 8d7d5b4aab94 Removing intermediate container 8d7d5b4aab94 ---> 79c118ea9eb3 Successfully built 79c118ea9eb3 Successfully tagged myimg:v1.1 [root@node1 test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myimg v1.1 79c118ea9eb3 4 seconds ago 1.22MB myimg v1.0 9554284e4bba 24 minutes ago 1.22MB myimg v0.9 4b6993911e6d 46 minutes ago 1.22MB myimg v0.7 4bedea2590b7 48 minutes ago 1.22MB myimg v0.6 385cba27c288 55 minutes ago 1.22MB myimg v0.5 e21e9479b0a7 About an hour ago 1.22MB myimg v0.4 df3d040b5766 About an hour ago 8.54MB myimg v0.3 68161c3beb90 2 hours ago 8.54MB myimg v0.2 6ba2693b3084 2 hours ago 8.54MB myimg v0.1 c78c7188f804 3 hours ago 1.22MB busybox latest 78096d0a5478 2 weeks ago 1.22MB [root@node1 test]# docker run --name test --rm -it myimg:v1.0 /bin/sh / # [root@node1 test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ca4cea9a6f58 myimg:v1.0 "/bin/sh" 15 seconds ago Up 15 seconds test [root@node1 test]# docker container port test [root@node1 test]# 提示:可以看到運(yùn)行時(shí),我們不使用-P來暴露端口是把容器內(nèi)部端口暴露不出來的; 示例:使用-P來暴露dockerfile里定義的端口 [root@node1 test]# docker run --name test --rm -it -P myimg:v1.1 /bin/sh / # [root@node1 test]# docker container port test 443/tcp -> 0.0.0.0:32768 80/tcp -> 0.0.0.0:32769 [root@node1 test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a78f6cebc0de myimg:v1.1 "/bin/sh" 19 seconds ago Up 19 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp test [root@node1 test]# 提示:可以看到使用-P就可以在運(yùn)行時(shí)把build階段定義的暴露端口全部給暴露出來; |
|