Docker容器技術之Dockerfile

什么是dockerfile?
dockerfile可以理解為構建docker images的源碼(原料),docker可以通過讀取一個dockerfile來自動構建docker鏡像

Docker核心概念間轉換關系:

1

什么是dockerfile?

dockerfile可以理解為構建docker images的源碼(原料)

docker可以通過讀取一個dockerfile來自動構建docker image

dockerfile 是一個文本文件,其中包含了按順序排列的構建指定鏡像所需的全部命令。

dockerfiles 采用特殊格式,使用一系列特別的指令。

dockerfile可以放在任意路徑,但文件名稱必須為Dockerfile,且D必須是大寫

2

 

 

dockerfile格式要求:

# Comment? 注釋信息

INSTRUCTION arguments?? 指令+參數

 

可以設置 .dockeringore 指定不打包進鏡像的文件列表

在docker build中執行的shell命令環境是由基礎鏡像所包含的命令集合

${ varriable:-default }? 如果變量未設置值,則給變量賦一個默認值

${ variable: +default } 如果已經給變量設置過值,則用default代替變量的值

注意:

指令不區分大小寫,然而,一般默認寫成大寫

Dockerfile中的指令會按照順序執行

第一個非注釋行,必須是’FROM’指令,指出基于哪個基礎鏡像

 

常用docker指令及說明:

dockerfile指令

 

下面將對這些常用docker指令進行詳細介紹

FROM

FROM指令是最重的一個且必須為Dockerfile文件開篇的第一個非注釋行,用于

為映像文件構建過程指定基準鏡像,后續的指令運行于此基準鏡像所提供的運

行環境

實踐中,基準鏡像可以是任何可用鏡像文件,默認情況下,docker build會在

docker主機上查找指定的鏡像文件,在其不存在時,則會從Docker Hub Registry

上拉取所需的鏡像文件

如果找不到指定的鏡像文件,docker build會返回一個錯誤信息

格式:

FROM <repositry>[:<tag>]

FROM <resoitry>@<digest>

<repostiry>:指定作為base image的名稱;

<tag>:base image的標簽,為可選項,省略時默認為lates;

 

 

MAINTANIER (depracted)

功能:用于讓Dockerfile制作者提供本人的詳細信息

Dockerfile并不限制MAINTAINER指令可在出現的位置,但推薦將其放置于

FROM指令之后

格式:

MAINTAINER ?<author’s detail>

<author’s detail>可是任何文本信息,但約定俗成地使用作者名稱及郵件地址

MAINTAINER “wxlinux <ilinux@wxlinux.com>”

 

注:較新版本MAINTNIER已經用LABEL替代

 

LABEL

功能:可以給鏡像添加標簽,來幫助項目組織鏡像、記錄許可信息、幫助自動化或

出于其他原因。對于每個標簽,添加一行以 LABEL 開頭并帶有一個或多個鍵值對

的行。下面示例顯示了多種支持的格式。解釋性意見包含在內。

格式:

LABEL <key>=<value> <key>=<value> <key>=<value> …

注意:1、如果字符串中包含空格,則必須用雙引號引起來或轉義這個空格。如果字

符串中包含雙引號,必須轉義

2、一個鏡像可以有多個標簽

 

COPY

功能:用于從Docker主機復制文件至創建的新映像文件

格式:

COPY <src> …<dest>

COPY [“<src>”,… “<dest>”]

<src>:要復制的源文件或目錄,支持使用通配符

<dest>:目標路徑,即正在創建的image的文件系統路徑;建議為<dest>使用絕對

路徑,否則,COPY指定則以WORKDIR為其起始路徑;

注意:1、在路徑中有空白字符時,通常使用第二種格式文件復制準則

<src>必須是build上下文中的路徑,不能是其父目錄中的文件

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

被復制如果指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目

錄,且必須以/結尾

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

 

示例:

3

創建一個測試頁面,必須和Dockerfile在同一目錄中

echo This is a test Server > index.html

4

創建名稱為tinyhttpd:v1的鏡像

docker build -t tinyhttpd:v1 ./

5

可以看到自定義內容已寫入到生成的鏡像中

docker run –name tinyweb1 –rm tinyhttpd:v1 cat /data/web/html

6

 

示例:打包本地yum倉庫到鏡像

首先把本地庫文件移到至Dockerfile同一目錄下

編寫Dockerfile文件加入一行:

COPY yum.repos.d /etc/yum.repos.d/

7

docker build -t tinyhttpd:v2 ./

可看到本地倉庫已放入到生成的鏡像中

docker run –name tinyweb1 –rm tinyhttpd:v2 ls /etc/yum.repos.d/

8

 

 

ADD

功能:ADD指令類似于COPY指令,ADD支持使用TAR文件和URL路徑

格式:

ADD<src> .<dest>

ADD[“<src>”,. “<dest>”]

操作準則:

1、同COPY指令

2、如果<src>為URL且<dest>不以/結尾,則<src>指定的文件將被下載并直

接被創建為<dest>;

如果<dest>以/結尾,則文件名URL指定的文件將被直接下載并保存為<dest>

/<filename>

3、如果<src>是一個本地系統上的壓縮格式的tar文件,它將被展開為一個目錄,

其行為類似于

“tar -x”命令;然而,通過URL獲取到的tar文件將不會自動展開;

4、如果<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/

結尾的目錄路徑;

如果<dest>不以/結尾,則其被視作一個普通文件,<src>的內容將被直接寫入到<dest>;

 

 

示例:

當<src>為URL時,文件直接保存到<dest>指定目錄下

9

10

而當<src>為本地tar文件時,文件將被加壓到<dest>目錄下

11

12

 

 

WORKDIR

功能:用于為Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指

定設定工作目錄

格式:

WORKDIR <dirpath>

1、在Dockerfile文件中,WORKDIR指令可出現多次,其路徑也可以為相對

路徑,不過,其是相對此前一個WORKDIR指令指定的路徑

2、另外,WORKDIR也可調用由ENV指定義的變量

3、如果工作目錄不存在,則Docker Daemon會自動創建

例如

WORKDIR /var/log ?WORKDIR $STAEPATH

 

示例:

vim Dockerfile

13

docker build -t tinyhttpd:v5 ./

結果與v4版本相同

docker run –name tinyweb1 –rm tinyhttpd:v5 ls /usr/local/src/nginx-1.15.2

14

 

VOLUME

功能:用于在image中創建一個掛載點目錄,以掛載Docker host上的卷或其

它容器上的卷

格式:

VOLUME <mountpoint>

VOLUME [“<mountpoint>”]

如果掛載點目錄路徑下此前在文件存在,docker run命令會在卷掛載完成后將此

前的所有文件復制到新掛載的卷中

 

 

示例:

15

docker run –name tinyweb1 –rm tinyhttpd:v6

docker run –name tinyweb1 –rm tinyhttpd:v6 mount

16

 

EXPOSE

功能:用于為容器打開指定要監聽的端口以實現與外部通信,暴露端口

格式:EXPOSE <port>[/<protcol>] [<port>[/<protcol>] …

<protcol>用于指定傳輸層協議,可為tcp或udp二者之一,默認為TCP協議

 

EXPOSE指令可一次指定多個端口,例如

EXPOSE 121/udp 121/tcp

 

示例:

配置暴露dockerfile tcp 80端口

17

docker build -t tinyhttpd:v7 ./

本機默認可訪問,但80端口未暴露給其他主機

docker run –name tinyweb1 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html

加-P選項,可以暴露端口

18

切換另外一臺主機進行訪問:

19

我們也可以指定宿主機端口對應docker容器中暴露的端口

docker run –name tinyweb1 -p 80:80 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html

20

此時訪問宿主機的80端口,成功訪問

21

 

 

ENV

功能:用于為鏡像定義所需的環境變量,并可被Dockerfile文件中位于其后的其它指令

(如ENV、ADD、COPY等)所調用

調用格式為$varible_name或${varible_name}

格式:

ENV <key> <value>

ENV <key>=<value>

 

1、第一種格式中,<key>之后的所有內容均會被視作其<value>的組成部分,因此,一次只

能設置一個變量;

2、第二種格式可用一次設置多個變量,每個變量為一個”<key>=<value>”的鍵值對,如果

<value>中包含空格,可以反斜線(\)進行轉義,也可通過對<value>加引號進行標識;另

外,反斜線也可用于續行;

3、定義多個變量時,建議使用第二種方式,以便在同一層中完成所有功能

 

示例:

22

docker build -t tinyhttpd:v8 ./

docker run –name tinyweb1 –rm -P tinyhttpd:v8 printenv

23

也可在啟動鏡像時定義變量改變docker鏡像中的已定義變量

docker run –name tinyweb1 –rm -P -e WEB_SERVER_PACKAGE=”nginx-1.15.1″ tinyhttpd:v8 printenv

24

 

 

RUN

功能:用于指定docker build過程中運行的程序,其可以是任何命令

格式:

RUN <comand>

RUN [“<excutable>”, <parm1>”, <parm2>”]

1、第一種格式中,<comand>通常是一個shel命令,且以“/bin/sh -c”來運行

它,這意味著此進程在容器中的PID不為1,不能接收Unix信號,因此,當使

用docker stop <container>命令停止容器時,此進程接收不到SIGTERM信號;

2、第二種語法格式中的參數是一個JSON格式的數組,其中<excutable>為要

運行的命令,后面的<parmN>為傳遞給命令的選項或參數;然而,此種格式

指定的命令不會以“/bin/sh -c”來發起,因此常見的shel操作如變量替換以及通

配符(?,*等)替換將不會進行;不過,如果要運行的命令依賴于此shel特性的話,

可以將其替換為類似下面的格式。

RUN [“/bin/bash”, -c”, <excutable>”, <parm1>”]

注意:json數組中,要使用雙引號

 

示例:

vim Dockfile

25

docker build -t tinyhttpd:v9 ./

docker run -name tinyweb1 -rm tinyhttpd:v9 lscd /usr/local/src

26

 

CMD

作用:類似于RUN指令,CMD指令也可用于運行任何命令或應用程序,不

過,二者的運行時間點不同

27

RUN指令運行于映像文件構建過程中,而CMD指令運行于基于Dockerfile構

建出的新映像文件啟動一個容器時

CMD指令的首要目的在于為啟動的容器指定默認要運行的程序,且其運行結

束后,容器也將終止;不過,CMD指定的命令其可以被docker un的命令行選

項所覆蓋

在Dockerfile中可以存在多個CMD指令,但僅最后一個會生效

格式:

CMD <comand>

CMD [“<excutable>”, “<parm1>”, “<parm2>”]

CMD [“<parm1>”,<parm2>”]

 

前兩種語法格式的意義同RUN

第三種則用于為ENTRYPOINT指令提供默認參數

 

ENTRYPOINT

功能:1、類似CMD指令的功能,用于為容器指定默認運行程序,從而使得容器像

是一個單獨的可執行程序

2、與CMD不同的是,由ENTRYPOINT啟動的程序不會被docker run命令行指定的參數

所覆蓋,而且,這些命令行參數會被當作參數傳遞給ENTRYPOINT指定指定的程序

不過,docker run命令的-entrypoint選項的參數可覆蓋ENTRYPOINT指令指定的程序

格式:

ENTRYPOINT <comand>

ENTRYPOINT [“<excutable>”, <parm1>”, <parm2>”]

 

默認是在 /bin/sh中執行 所以可以定制腳本執行 再通過cmd 傳遞過來的命令(以exec $*)

作為第一進程

可以利用腳本來生成配置模板 通過 -e 創建容器的時候修改變量值 來實現你想實現的

配置文件等。

docker run命令傳入的命令參數會覆蓋CMD指令的內容并且附加到ENTRYPOINT命令最

后做為其參數使用

Dockerfile文件中也可以存在多個ENTRYPOINT指令,但僅有最后一個會生效

 

示例:

vim Dockerfile

28

29

docker build -t myweb:v2 ./

docker run –name myweb1 –rm -it myweb:v2 cat /etc/nginx/conf.d/www.conf

30

前端運行

docker run –name myweb1 –rm -it myweb:v3

 

USER

功能:用于指定運行image時的或運行Dockerfile中任何RUN、CMD或ENTRYPOINT

指令指定的程序時的用戶名或UID

注意:默認情況下,container的運行身份為rot用戶

格式:

USER <UID>|<UserName>

 

需要注意的是,<UID>可以為任意數字,但實踐中其必須為/etc/paswd中某用戶的有效

UID,否則,docker un命令將運行失敗

 

 

 

HEALTHCHECK

功能:健康性狀態檢查

The options that can appear before CMD are:

–interval=DURATION (default: 30s) 每隔30秒探測一次

–timeout=DURATION (default: 30s) 服務器的超時時長

–start-period=DURATION (default: 0s) 初始化多少秒后再探測

–retries=N (default: 3)? 探測幾次

The command’s exit status indicates the health status of the container. The possible

values are:

?0: success – the container is healthy and ready for use (表示成功)

?1: unhealthy – the container is not working correctly (表示失?。?/p>

?2: reserved – do not use this exit code

 

示例:

vim Dockerfile

31

32

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/104623

(0)
wangxczwangxcz
上一篇 2018-08-06
下一篇 2018-08-07

相關推薦

  • linux學習-2周

    文本處理工具、cat/rev/more/less/head/tail/cut/paste/wc/sort/uniq/diff/grep

    2018-04-08
  • Linux的命令

    Linux的命令 命令格式 COMMAND [OPTIONS…] [ARGUMENTS…]選項:用于啟用或關閉命令的某個或某些功能短選項:-c 例如:-l, -h長選項:–word 例如:–all, –human-readable參數:命令的作用對象: 比如文件名和作用名 注意 1. *多個選項以及…

    Linux筆記 2018-04-01
  • 學習liunx 系統的筆記

    理論和實際操作相結合

    Linux筆記 2018-04-01
  • liunx基礎

    在shell中可執行的命令有兩類: 執行外部命令hash 緩存表 ? hash 常見用法 :

    Linux筆記 2018-04-01
  • linux是隨身筆記part1

    第一周學習

    2018-06-25
  • 正則表達式、linux文件處理三劍客:grep、sed、awk

    基本的正則表達式元字符:默認工作于貪婪模式; 字符匹配: .:匹配任意單個字符; []:匹配指定范圍內的任意單個字符; [^]:匹配范圍外的任意單個字符; [:digit:]數字、[:lower:]小寫字母、[:upper:]大寫字母、[:alpha:]所有字母、[:space:]空白符、[:alnum:]字母數字、[:punct:]標點符號 匹配次數: *…

    Linux筆記 2018-03-28
欧美性久久久久