容器技術之Dockerfile (一)

  在前邊的隨筆中咱們聊到了docker的基本命令,鏡像,網絡,存儲卷以及基於現有容器製作docker鏡像,相關隨筆可參考https://www.cnblogs.com/qiuhom-1874/category/1766327.html;今天咱們來聊一聊docker的另外一個製做鏡像的方式dockerfile;html

  什麼是dockerfile?所謂dockerfile就是用來描述docker鏡像製做過程的一指令文件;該文件是一個純文本文件,docker Daemon 進程能夠從該文件中讀取指令,從而自動生成鏡像;客戶端可使用docker bulid命令來指定dockerfile 所在目錄,來生成以dockerfile裏描述的鏡像構建過程的鏡像;node

  首先咱們來了解下dockerfile的格式,dockerfile是一個純文本文件,咱們能夠理解爲構建鏡像的源碼;不一樣於其餘編程語言,dockerfile裏沒有if else 沒有循環,它裏面僅僅有註釋和構建鏡像的指令;對於dockerfile註釋就是以井號開頭的行爲註釋,這個和shell和其餘配置文件的語法同樣;除此以外dockerfile裏就只有指令了;嚴格的講指令是不區分字符大小寫的,一般咱們約定俗成指令都是純大寫;除此以外在dockerfile的第一非註釋行必須是FROM開頭來明確的說明咱們在基於那個鏡像爲基礎鏡像作鏡像;linux

  一般狀況下dockerfile是放在一個目錄下,該目錄就是dockerfile的工做目錄,咱們在製做鏡像所依賴的文件都必須放在該目錄下,而dockerfile的名稱也必須是Dockerfile(首字母大寫,名稱必須是Dockerfile),若是咱們依賴的文件是一個目錄下的部分文件,咱們也可在dockerfile所在目錄建立一個.dockerignore文件,把咱們要忽略的文件名稱寫到裏面便可,該文件支持通配符;nginx

  瞭解了上面的dockerfile的基本環境結構,接下來咱們來講說dockerfile的指令的用法;web

  一、FROM:用於指定所建立鏡像的基礎鏡像,若是本地不存在,默認會從dockerhub中下載;該指令是dockerfile裏的第一個非註釋行的指令;語法格式 FROM <repository>[:<tag>] 或者FROM <repository>@<digest>  其中repository是指定的base 鏡像的名稱 <tag>是base 鏡像的標籤爲可選項,不指定標籤默認表示使用指定鏡像的latest版本;docker

  二、MAINTAINER:用於指定維護者信息,dockerfile並不限制MAINTAINER指令可出現的位置,一般咱們建議將該指令放在FROM以後;語法格式 MAINTAINER <authtor's detail>, <author's detail>但是任何文本信息,但約定俗成地使用做者名稱及郵件地址;shell

  示例:編程

[root@node1 test]# cat Dockerfile 
FROM busybox:latest

MAINTAINER "qiuhom <qiuhom@linux-1874.com>"


[root@node1 test]# 

  提示:一般咱們都不用MAINTAINER來指定做者信息,該指令幾乎是廢棄狀態,建議使用LEBEL指令來指定;bash

  三、LABEL:該指令用於指定添加鏡像的元數據信息;語法格式爲LABEL <key>=<value> <key>=<value> <key>=<value> ...;若是添加的元數據信息值中有空格,咱們須要使用引號和反斜線進行命令行解析;網絡

  示例:

[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指令可使用屢次,用於添加更多的元數據信息;

  四、COPY:該指令用於從Docker主機複製文件至建立的鏡像文件中;語法格式 COPY <src> ... <dest> 或 COPY ["<src>",... "<dest>"];<src>表示要複製的源文件或目錄,支持使用通配符;<dest>表示目標路徑,即正在建立的image的文件系統路徑;建議爲<dest>使用絕對路徑,不然,COPY指定則以WORKDIR爲其起始路徑;注意:在路徑中有空白字符時,一般使用第二種格式;

  文件複製準則

  一、<src>必須是Dockerfile所在目錄中的文件,不能是其父目錄中的文件;

  二、若是<src>是目錄,則其內部文件或子目錄會被遞歸複製,但<src>目錄自身不會被複制;

  三、若是指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以「/」結尾;

  四、若是<dest>事先不存在,它會被自動建立,則包括其父目錄路徑;

  示例:

[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構建鏡像,看看構建好的鏡像是否把對應文件都複製到對應目錄下了?

[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時會把一條指令啓動一容器來執行,而後每一條指令都會構建成一層鏡像;若是咱們本地倉庫中沒有咱們指定的基礎鏡像,它默認會從dockerhub倉庫中去把指定鏡像拖到本地;docker build命令是用來基於dockerfile來製做鏡像的命令,其中-t表示指定咱們生成的鏡像的標籤信息;

  運行咱們剛纔製做好的鏡像,看看咱們的指定的目錄和文件是否都複製到指定鏡像中的目錄中去了?

[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]# 

  提示:能夠看到咱們以剛纔製做的鏡像運行成容器,容器對應目錄有咱們指定複製的文件;
  五、ADD:該指令相似於COPY指令,ADD支持使用TAR文件和URL路徑;語法格式 ADD <src> ... <dest> 或 ADD ["<src>",... "<dest>"];若是<src>爲URL且<dest>不以/結尾,則<src>指定的文件將被下載並直接被建立爲<dest>;若是<dest>以/結尾,則URL指定的文件將被直接下載並保存爲<dest>/<filename>;若是<src>是一個本地系統上的壓縮格式的tar文件,它將被展開爲一個目錄,其行爲相似於「tar -x」命令;然而,經過URL獲取到的tar文件將不會自動展開;若是<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結尾的目錄路徑;若是<dest>不以/結尾,則其被視做一個普通文件,<src>的內容將被直接寫入到<dest>;

  示例:

[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://nginx.org/download/nginx-1.18.0.tar.gz /usr/src/

ADD nginx-1.19.0.tar.gz /tmp/
[root@node1 test]# 

  提示:以上Dokcerfile裏指定把當前目錄下的nginx-1.19.0.tar.gz 添加到鏡像中的/tmp/下,而且會把nginx-1.19.0.tar.gz展開成一個目錄;而對於

ADD http://nginx.org/download/nginx-1.18.0.tar.gz /usr/src/這條指令它會把指定url的文件下載到/usr/src/,可是不會tar文件展開;

  測試:把上面dockerfile編譯成鏡像,看看對應目錄中的文件是否都展開了?

[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://nginx.org/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,則意味着在本地倉庫中有的鏡像層,默認是共享的;

  六、WORKDIR:該指令用於設定Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指令的工做目錄;一個Dockerfile中能夠屢次使用WORKDIR來指定當前WORKDIR指令到下一個WORKDIR指令之間的指令的工做目錄;語法格式WORKDIR <dirpath>;在Dockerfile文件中,WORKDIR指令可出現屢次,其路徑也能夠爲相對路徑,不過,其是相對此前一個WORKDIR指令指定的路徑,另外,WORKDIR也可調用由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://nginx.org/download/nginx-1.18.0.tar.gz src/

ADD nginx-1.19.0.tar.gz /tmp/
[root@node1 test]# 

  提示:咱們在dockerfile中指定了workdir的路徑後,其後的指令就能夠以上一個workdir指定的路徑 爲基準後面使用相對路徑;

  測試:製做鏡像運行容器,看看是否把對應文件都添加到容器的指定目錄裏?

[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://nginx.org/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://nginx.org/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]#

  提示:能夠看到咱們製做的鏡像啓動爲容器後,默認是咱們指定的最後一個workdir的路徑;

  示例:使用環境變量指定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://nginx.org/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/" 表示添加兩個環境變量,而這兩個環境的變量的值分別是「/var/www/」 和「/usr」 這樣一來,在後面workdir引用該環境變量時 就會把對應的值給替換過去;dockerfile中變量引用同shell中的變量引用同樣都是使用$符合引用變量;

  測試:利用上面的Dockerfile編譯成鏡像,而後運行成容器,看看咱們在dockerfile中定義的環境變量是否可以被容器所引用?

[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://nginx.org/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環境變量是可以被WORKDIR說引用

  七、ENV:用於爲鏡像定義所需的環境變量,並可被Dockerfile文件中位於其後的其它指令(如ENV、ADD、COPY等)所調用;調用格式爲$variable_name或${variable_name};語法格式ENV <key> <value> 或 ENV <key>=<value> ...;第一種格式中,<key>以後的全部內容均會被視做其<value>的組成部分,所以,一次只能設置一個變量;第二種格式可用一次設置多個變量,每一個變量爲一個"<key>=<value>"的鍵值對,若是<value>中包含空格,能夠以反斜線(\)進行轉義,也可經過對<value>加引號進行標識;另外,反斜線也可用於續行;定義多個變量時,建議使用第二種方式,以便在同一層中完成全部功能;

  示例:

[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設置了環境變量web_home="/var/www/html" ,後面的COPY引用時直接使用${web_home}便可;COPY html ${web_home}表示把html目錄中的文件複製到web_home這個變量所指定的目錄中,即/var/www/html/;

  測試:編譯成鏡像,看看是否把對應html目錄下的文件複製到/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]# 

  提示:能夠看到咱們打包的鏡像運行成容器後,ENV指定的環境變量目錄裏有html目錄下的全部文件;

  八、ARG:該指令用於編譯階段可使用docker build --build-arg向dockerfile裏ARG 指定的變量傳遞值;語法格式ARG <name>[=<default value>];該指令能夠在dockerfile中使用屢次,也能夠給定默認變量一個默認的值,在用戶沒有向該變量傳遞值的狀況;

  示例:

[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變量的默認值是「/var/www/html/」 若是在咱們build階段沒有使用--build-arg來向web_home傳遞值時,它默認就是「/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]# 

  提示:能夠看到咱們傳遞進去的路徑下有html目錄下的兩個網頁文件;這說明經過--build-arg 選項能夠向Dockerfile裏ARG指定指定的變量傳遞值的;

  示例:引用變量給定變量默認值

[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]# 

  提示:引用變量給定變量默認值的方式同shell中的用法同樣;${web_home:-"/data/htdoc/"} 表示若是web_home這個變量的值未設定或者爲空時,就使用默認的值「/data/htdoc/」這個值,若是設置了,那麼設置的是什麼值就是什麼值;

  測試:不使用--build-arg向web_home傳遞值,看看web_home是否會拿到默認值?

[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傳遞值,默認就是使用咱們給設定的默認值

  測試:向web_home傳遞值,看看是否還會使用默認值呢?

[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/」後,默認的「/data/htdoc/」的值就不會生效;

  九、VOLUME:用於在image中建立一個掛載點目錄,以掛載Docker host上的卷或其它容器上的卷;語法格式 VOLUME <mountpoint> 或 VOLUME ["<mountpoint>"];若是掛載點目錄路徑下此前的文件存在,docker run命令會在卷掛載完成後將此前的全部文件複製到新掛載的卷中;

  示例:

[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是指定鏡像裏的掛載點,若是該掛載點裏面原來是有文件存在,在使用docker run 時,用-v指定把宿主機上的某個目錄掛載到該掛載點時,默認會把原來有的文件複製新掛載的卷中;這裏還須要特被說一下,這裏指定卷是在鏡像內部建立一個掛載點,運行成容器還須要咱們手動的用-v去指定把那個目錄掛載到該掛載點,若是不指定默認就是docker-managed 類型的卷;

  測試:編譯成鏡像,而後運行成容器,看看咱們指定的卷宗的文件會不會被覆蓋掉?是否會有文件存在?

[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]# 

  提示:能夠看到運行成容器後,默認會把咱們指定卷掛載成docker-managed類型的卷;同時咱們也看到了對應掛載點上目錄會把原有文件複製到現volume中;

  測試:手動指定宿主機目錄掛載到掛載點,文件是否還會存在呢?

[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 ~]# 

  提示:手動指定掛載關係,它就不會把原有目錄下的文件複製到現掛載目錄中了;也就是說,人爲手動指定掛載關係,宿主機上的的目錄會覆蓋容器內掛載點下的文件;只有docker自身管理的掛載的卷纔會把原目錄下的文件複製到現掛載目錄裏;

  十、EXPOSE:用於爲容器打開指定要監聽的端口以實現與外部通訊(暴露端口);語法格式 EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]; <protocol>用於指定傳輸層協議,可爲tcp或udp兩者之一,默認爲TCP協議;EXPOSE指令可一次指定多個端口;

  示例:

[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暴露端口,在運行成容器時,若是不使用-P來暴露端口,容器裏的端口仍是暴露不出來;這裏只是build階段明確說明要暴露80和443,而運行成容器咱們須要使用-P來把build暴露的端口暴露出來;

  測試:運行時不使用-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]# 

  提示:能夠看到運行時,咱們不使用-P來暴露端口是把容器內部端口暴露不出來的;

  示例:使用-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就能夠在運行時把build階段定義的暴露端口所有給暴露出來;

相關文章
相關標籤/搜索