容器技術之Dockerfile (一)

来源:https://www.cnblogs.com/qiuhom-1874/archive/2020/05/31/13019411.html
-Advertisement-
Play Games

dockerfile的格式,dockerfile是一個純文本文件,我們可以理解為構建鏡像的源碼;不同於其他編程語言,dockerfile里沒有if else 沒有迴圈,它裡面僅僅有註釋和構建鏡像的指令;對於dockerfile註釋就是以井號開頭的行為註釋,這個和shell和其他配置文件的語法一樣;... ...


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

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

  首先我們來瞭解下dockerfile的格式,dockerfile是一個純文本文件,我們可以理解為構建鏡像的源碼;不同於其他編程語言,dockerfile里沒有if else 沒有迴圈,它裡面僅僅有註釋和構建鏡像的指令;對於dockerfile註釋就是以井號開頭的行為註釋,這個和shell和其他配置文件的語法一樣;除此之外dockerfile里就只有指令了;嚴格的講指令是不區分字元大小寫的,通常我們約定俗成指令都是純大寫;除此之外在dockerfile的第一非註釋行必須是FROM開頭來明確的說明我們在基於那個鏡像為基礎鏡像做鏡像;

  通常情況下dockerfile是放在一個目錄下,該目錄就是dockerfile的工作目錄,我們在製作鏡像所依賴的文件都必須放在該目錄下,而dockerfile的名稱也必須是Dockerfile(首字母大寫,名稱必須是Dockerfile),如果我們依賴的文件是一個目錄下的部分文件,我們也可在dockerfile所在目錄創建一個.dockerignore文件,把我們要忽略的文件名稱寫到裡面即可,該文件支持通配符;

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

  1、FROM:用於指定所創建鏡像的基礎鏡像,如果本地不存在,預設會從dockerhub中下載;該指令是dockerfile里的第一個非註釋行的指令;語法格式 FROM <repository>[:<tag>] 或者FROM <repository>@<digest>  其中repository是指定的base 鏡像的名稱 <tag>是base 鏡像的標簽為可選項,不指定標簽預設表示使用指定鏡像的latest版本;

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

  示例:

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

MAINTAINER "qiuhom <[email protected]>"


[root@node1 test]# 

  提示:通常我們都不用MAINTAINER來指定作者信息,該指令幾乎是廢棄狀態,建議使用LEBEL指令來指定;

  3、LABEL:該指令用於指定添加鏡像的元數據信息;語法格式為LABEL <key>=<value> <key>=<value> <key>=<value> ...;如果添加的元數據信息值中有空格,我們需要使用引號和反斜線進行命令行解析;

  示例:

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

MAINTAINER "qiuhom <[email protected]>"

LABEL version="1.0"

LABEL description="this is test file \ that label-values can span multiple lines."


[root@node1 test]# 

  提示:LABEL指令可以使用多次,用於添加更多的元數據信息;

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

  文件複製準則

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

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

  3、如果指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以“/”結尾;

  4、如果<dest>事先不存在,它會被自動創建,則包括其父目錄路徑;

  示例:

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

MAINTAINER "qiuhom <[email protected]>"

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 <[email protected]>"
 ---> 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]# 

  提示:可以看到我們以剛纔製作的鏡像運行成容器,容器對應目錄有我們指定複製的文件;
  5、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 <[email protected]>"

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 <[email protected]>"
 ---> 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,則意味著在本地倉庫中有的鏡像層,預設是共用的;

  6、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 <[email protected]>"

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 <[email protected]>"

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 <[email protected]>"
 ---> 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 <[email protected]>"

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 <[email protected]>"
 ---> 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說引用

  7、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 <[email protected]>"

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 <[email protected]>"
 ---> 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目錄下的所有文件;

  8、ARG:該指令用於編譯階段可以使用docker build --build-arg向dockerfile里ARG 指定的變數傳遞值;語法格式ARG <name>[=<default value>];該指令可以在dockerfile中使用多次,也可以給定預設變數一個預設的值,在用戶沒有向該變數傳遞值的情況;

  示例:

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

MAINTAINER "qiuhom <[email protected]>"

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 <[email protected]>"
 ---> 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 <[email protected]>"

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 <[email protected]>"
 ---> 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 <[email protected]>"
 ---> 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/”的值就不會生效;

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

  示例:

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

MAINTAINER "qiuhom <[email protected]>"

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 <[email protected]>"
 ---> 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自身管理的掛載的捲才會把原目錄下的文件複製到現掛載目錄里;

  10、EXPOSE:用於為容器打開指定要監聽的埠以實現與外部通信(暴露埠);語法格式 EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]; <protocol>用於指定傳輸層協議,可為tcp或udp二者之一,預設為TCP協議;EXPOSE指令可一次指定多個埠;

  示例:

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

MAINTAINER "qiuhom <[email protected]>"

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 <[email protected]>"
 ---> 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階段定義的暴露埠全部給暴露出來;


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C# 中的LINQ 提供了兩種操作方式,查詢表達式和查詢操作符,所有的查詢表達式都有對應的查操作符類替代,查詢表達式有點“類” SQL,在代碼中寫SQL,總覺得不夠“優雅”,使用查詢操作符就顯得“優雅”很多, 本系列就來對所有的LINQ 標準操作符進行一個全面的總結,這些操作符和我上篇文章總結的Rx ...
  • 簡單瞭解下麵詞語的意思 節點:二叉樹中每個元素都稱為節點 葉子節點(簡稱:葉子):度為0的節點,葉子節點就是樹中最底段的節點,葉子節點沒有子節點,也叫終端結點 分枝節點:度不為0的結點 節點的度:二叉樹的度代表某個節點的孩子或者說直接後繼的個數,簡單說就是一個節點擁有的子樹數 樹的度: 樹中最大的結 ...
  • 前言 請了一天假後回公司,同事跟我說使用Newtonsoft.json序列化TreeView對象的時候出現報錯; 啊!什麼?這個類庫不是能夠序列化所有東西嗎?真的很懵逼,也是我第一次使用這個類庫出現問題! 問題異常 異常信息 : Newtonsoft.Json.JsonSerializationEx ...
  • 上一篇(https://www.cnblogs.com/meowv/p/12971041.html)使用HtmlAgilityPack抓取壁紙數據成功將圖片存入資料庫,本篇繼續來完成一個全網各大平臺的熱點新聞數據的抓取。 同樣的,可以先預覽一下我個人博客中的成品:https://meowv.com/ ...
  • 《ASP.NET MVC 企業級實戰》 [作者] (中) 鄒瓊俊[出版] 清華大學出版社[版次] 2017年04月 第1版[印次] 2019年08月 第6次 印刷[定價] 89.00元 【第01章】 (P021) 只有在 Lambda 有一個輸入參數時,括弧才是可選的,否則括弧是必需的。 使用空括弧 ...
  • CentOS7修改主機名 查看當前的主機名 第一種方法 [root@localhost ~]# hostname localhost.localdomain 第二種方法 [root@localhost ~]# hostnamectl Static hostname: localhost.locald ...
  • 如何通過Xshell遠程連接Linux伺服器,以及如何配置xshell各項參數。 ...
  • 作為公司的公共產品,經常有這樣的需求:就是新建一個本地服務,產品線作為客戶端通過 tcp 接入本地服務,來獲取想要的業務能力。 與印象中動輒處理成千上萬連接的 tcp 網路服務不同,這個本地服務是跑在客戶機器上的,Win32 上作為開機自啟動的 windows 服務運行; Linux 上作為 dae ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...