自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

IT工程師都需要掌握的容器技術(shù)之Dockerfile

開發(fā) 前端
今天我們繼續(xù)來學(xué)習(xí)Docker技術(shù),本篇文章主要介紹Dockerfile,Dockerffile是一個(gè)文本文件,Docker通過讀取Dockerfile文件來自動(dòng)構(gòu)建鏡像。

 今天我們繼續(xù)來學(xué)習(xí)Docker技術(shù),本篇文章主要介紹Dockerfile,Dockerffile是一個(gè)文本文件,Docker通過讀取Dockerfile文件來自動(dòng)構(gòu)建鏡像。

下面就由成哥來介紹Dockerfile的語法及使用方法吧!

01 Dockerfile概述

Dockerfile相當(dāng)于一個(gè)文檔,用戶可以基于dockerfile生產(chǎn)新的容器。Dockerfile僅僅是用來制作鏡像的源碼文件,是構(gòu)建容器過程中的指令,docker能夠讀取dockerfile的指令進(jìn)行自動(dòng)構(gòu)建容器,基于dockerfile制作鏡像,每一個(gè)指令都會(huì)創(chuàng)建一個(gè)鏡像層,即鏡像層是多層疊加的,鏡像層數(shù)越多,效率越低。所以創(chuàng)建鏡像時(shí)盡量通過越少的指令完成需要的動(dòng)作。Docker通過dockerfile進(jìn)行build及build后的鏡像運(yùn)行流程邏輯如下圖所示。

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

02 Dockerfile的編寫

(1) 上下文

上下文就是指我們build Docker鏡像時(shí)Dockerfile文件所在的目錄,構(gòu)建鏡像是由Docker守護(hù)程序而不是CLI運(yùn)行的,該過程的第一件事是將 Dockerfile 文件所在目錄下的所有內(nèi)容遞歸的發(fā)送到守護(hù)進(jìn)程。所以在大多數(shù)情況下,最好是創(chuàng)建一個(gè)新的目錄,在其中保存 Dockerfile,并在其中添加構(gòu)建 Dockerfile 所需的文件。

現(xiàn)在我們就在系統(tǒng)中創(chuàng)建一個(gè)空目錄以便下面Dockerfile文件的創(chuàng)建及后面的鏡像構(gòu)建

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

(2) Dockerfile格式

Dockerfile的語法格式如下所示:

 

  1. 1. # 格式為語法+參數(shù)   
  2. 2. INSTRUCTION arguments   

 

該指令不區(qū)分大小寫。但是,約定將它們大寫,以便更輕松地將它們與參數(shù)區(qū)分開。Dockerfile按順序運(yùn)行指令。

(3) Dockerfile常用指令

1)FROM

一個(gè)Dockerfile 必須以開始FROM的指令。使用FROM指令指定一個(gè)基礎(chǔ)鏡像,后續(xù)指令將在此鏡像的基礎(chǔ)上運(yùn)行,在一個(gè)Dockerfile文件中FROM可以出現(xiàn)多次,下面我們來看看FROM的語法格式

  1. 1. FROM [--platform=<platform>] <image> [AS <name>]   

我們創(chuàng)建一個(gè)Dockerfile文件,其中FROM指定以centos為基礎(chǔ)鏡像

 

  1. 1. # 指定以centos為基礎(chǔ)鏡像進(jìn)行build   
  2. 2. FROM centos   

 

2)WORKDIR

WORKDIR用于指定工作目錄,所有執(zhí)行的shell語句都會(huì)在該指定的目錄中運(yùn)行,我們后面講的 RUN,CMD,COPY,ADD 等指令將會(huì)在指定的工作目錄中去執(zhí)行。該指令也可以在一個(gè)Dockerfile文件中出現(xiàn)多次,最后一次出現(xiàn)的目錄依次是上個(gè)目錄的子目錄。如下所示:

 

  1. 1. WORKDIR /a   
  2. 2. WORKDIR b   
  3. 3. WORKDIR c   
  4. 4. RUN pwd   

 

最后這個(gè)pwd的命令執(zhí)行的目錄為/a/b/c。我們繼續(xù)基于上面的指令來指定WORKDIR目錄為'/'

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

3)RUN

RUN 指令用于執(zhí)行命令,該指令有兩種形式:

a. RUN ,使用 shell 去執(zhí)行指定的命令 command,一般默認(rèn)的 shell 為 /bin/sh -c

b. RUN ["executable", "param1", "param2"],使用可執(zhí)行的文件或程序后面并可以跟上相關(guān)參數(shù)

下面我們通過這兩種形式來創(chuàng)建執(zhí)行命令

 

  1. 1. # 第一種RUN指令方式   
  2. 2. RUN yum update   
  3. 3.    
  4. 4. # 第二種RUN指令方式   
  5. 5. RUN ["/bin/bash""-c""echo hello"]  

4)CMD

CMD 的使用方式跟 RUN 類似,其跟RUN的區(qū)別是RUN是在構(gòu)建鏡像是運(yùn)行執(zhí)行而CMD是容器運(yùn)行后執(zhí)行的指令。在一個(gè) Dockerfile 文件中只能有一個(gè) CMD 指令,如果有多個(gè) CMD 指令,則只有最后一個(gè)會(huì)生效。CMD也有三種命令格式具體如下

 

  1. 1. # 第一種執(zhí)行命令推薦用法   
  2. 2. CMD ["executable","param1","param2"]   
  3. 3.    
  4. 4. # 第二種該格式主要配合ENTRYPOINT使用,CMD 指令的值會(huì)作為 ENTRYPOINT 指令的參數(shù)   
  5. 5. CMD ["param1","param2"]   
  6. 6.    
  7. 7. # 第三種執(zhí)行shell form,該方法與第一種的執(zhí)行效果一致   
  8. 8. CMD command param1 param2    

 

我們通過第一種方式來創(chuàng)建來執(zhí)行wc的幫助指定具體如下

 

  1. 1. CMD ["/usr/bin/wc","--help"]   

第二種方法需要在Dockerfile中使用ENTRYPOINT指令,ENTRYPOINT 指令會(huì)覆蓋 CMD 指令作為容器運(yùn)行時(shí)的默認(rèn)指令,并且不會(huì)在 docker run 時(shí)被覆蓋,如下示例

 

  1. 1. FROM centos   
  2. 2. ENTRYPOINT ["ls""-a"]   
  3. 3. CMD ["-l"]   

 

上述構(gòu)建的鏡像,在我們使用 docker run 時(shí)等同于 docker run ls -a l 命令。CMD 指令的值會(huì)被當(dāng)作 ENTRYPOINT 指令的參數(shù)附加到 ENTRYPOINT 指令的后面,并且如果 docker run 中指定了參數(shù),會(huì)覆蓋 CMD 中給出的參數(shù)。

5)COPY&ADD

COPY 和 ADD 都用于將文件,目錄等復(fù)制到鏡像中。兩者的區(qū)別在于ADD可以使用遠(yuǎn)程URL路徑作為復(fù)制源,如果只復(fù)制本地文件建議使用COPY,兩個(gè)指令的語法格式如下:

 

  1. 1. # ADD命令格式   
  2. 2. ADD [--chown=<user>:<group>] <src>... <dest>   
  3. 3. ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]   
  4. 4.    
  5. 5. # COPY命令格式   
  6. 6. COPY [--chown=<user>:<group>] <src>... <dest>   
  7. 7. COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]   

--chown用于指定文件目錄用戶與權(quán)限, 可以指定多個(gè),但是其路徑不能超出上下文的路徑,即必須在跟 Dockerfile 同級(jí)或子目錄中。 不需要預(yù)先存在,不存在路徑時(shí)會(huì)自動(dòng)創(chuàng)建,如果沒有使用絕對(duì)路徑,則 為WORKDIR指定目錄的相對(duì)路徑。

6)ENV

ENV用于定義Dockerfile的環(huán)境變量,變量設(shè)置的值將在構(gòu)建階段中所有后續(xù)指令的環(huán)境中使用,并且在許多情況下也可以內(nèi)聯(lián)替換。其命令格式如下:

  1. 1. ENV <key>=<value> ...   

使用示例如下

 

  1. 1. # $MYDIR將被替換成"/mydir"   
  2. 2. ENV MYDIR="/mydir"   
  3. 3. RUN mkdir $MYDIR   

 

7)VOLUME

VOLUME用于在Dockerfile文件中指定掛載目錄,在容器運(yùn)行時(shí),將自動(dòng)創(chuàng)建相應(yīng)的匿名卷,其命令格式如下

 

  1. 1. VOLUME ["/data"]   

該條命令會(huì)在容器運(yùn)行時(shí)創(chuàng)建一個(gè)匿名卷,同時(shí)將容器中/data目錄掛載到該卷上。

8)EXPOSE

EXPOSE指令通知Docker容器在運(yùn)行時(shí)監(jiān)聽指定的網(wǎng)絡(luò)端口。您可以指定端口是偵聽TCP還是UDP,如果未指定協(xié)議,則默認(rèn)值為TCP。EXPOSE指令實(shí)際上并未發(fā)布端口。它充當(dāng)構(gòu)建映像的人員和運(yùn)行容器的人員之間的一種文檔類型,有關(guān)打算發(fā)布哪些端口的信息。如果要將容器端口暴露出來,需要在 dcoker run 命令中使用 -p。

EXPOSE指令格式與用法示例如下:

 

  1. 1. # EXPOSE命令格式   
  2. 2. EXPOSE <port> [<port>/<protocol>...]   
  3. 3.    
  4. 4. # 使容器同時(shí)監(jiān)聽TCP與UDP的80端口   
  5. 5. EXPOSE 80/tcp   
  6. 6. EXPOSE 80/udp   

 

03 Dockerfile鏡像構(gòu)建

我們現(xiàn)在通過Dockerfile來構(gòu)建一個(gè)nginx服務(wù)器,Dockerfile具體配置如下:

 

  1. 1. # 指定基礎(chǔ)鏡像   
  2. 2. FROM centos   
  3. 3.    
  4. 4. # 設(shè)置環(huán)境目錄   
  5. 5. WORKDIR /   
  6. 6.    
  7. 7. # 安裝nginx   
  8. 8. RUN yum install nginx -y   
  9. 9.    
  10. 10. # 容器對(duì)外暴露80端口   
  11. 11. EXPOSE 80   
  12. 12.    
  13. 13. # 啟動(dòng)nginx   
  14. 14. CMD ["/usr/sbin/nginx""-g""daemon off;"]   

 

接著通過該Dockerfile文件進(jìn)行鏡像構(gòu)建,具體如下

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

最后我們啟動(dòng)容器,同時(shí)查看nginx服務(wù)是否能夠訪問,具體操作如下

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

 

IT工程師都需要掌握的容器技術(shù)之Dockerfile

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2020-11-25 09:27:49

Docker容器技術(shù)

2020-10-26 15:11:50

Docker容器IT

2020-10-19 09:32:49

容器Docker管理

2020-10-27 10:52:37

Docker容器存儲(chǔ)

2020-03-17 15:15:49

Python工程師面試題

2010-08-10 13:22:41

2020-07-22 14:50:35

Python數(shù)據(jù)分析

2022-08-12 09:21:43

前端JavaScript代碼

2020-08-05 08:25:58

大數(shù)據(jù)Java技術(shù)

2021-03-31 22:25:46

運(yùn)維工程師技能

2017-09-22 08:33:34

機(jī)器學(xué)習(xí)Web設(shè)計(jì)UI

2010-08-10 13:29:58

軟件工程師

2013-08-15 09:47:27

企業(yè)網(wǎng)絡(luò)簡化網(wǎng)絡(luò)工程師

2012-03-31 16:57:52

工程師創(chuàng)業(yè)團(tuán)隊(duì)

2021-03-24 15:15:34

數(shù)據(jù)工程師開發(fā)工具

2021-03-09 10:24:46

數(shù)學(xué)計(jì)算機(jī)系統(tǒng)架構(gòu)師

2018-12-29 15:10:22

工程師爬蟲Python

2021-03-09 10:47:56

系統(tǒng)架構(gòu)師算法工程師人工智能工程師

2009-12-18 10:08:47

路由器協(xié)議

2017-03-30 16:03:06

Linux運(yùn)維工程師技能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)