Docker核心概念間轉換關系:
什么是dockerfile?
dockerfile可以理解為構建docker images的源碼(原料)
docker可以通過讀取一個dockerfile來自動構建docker image
dockerfile 是一個文本文件,其中包含了按順序排列的構建指定鏡像所需的全部命令。
dockerfiles 采用特殊格式,使用一系列特別的指令。
dockerfile可以放在任意路徑,但文件名稱必須為Dockerfile,且D必須是大寫
dockerfile格式要求:
# Comment? 注釋信息
INSTRUCTION arguments?? 指令+參數
可以設置 .dockeringore 指定不打包進鏡像的文件列表
在docker build中執行的shell命令環境是由基礎鏡像所包含的命令集合
${ varriable:-default }? 如果變量未設置值,則給變量賦一個默認值
${ variable: +default } 如果已經給變量設置過值,則用default代替變量的值
注意:
指令不區分大小寫,然而,一般默認寫成大寫
Dockerfile中的指令會按照順序執行
第一個非注釋行,必須是’FROM’指令,指出基于哪個基礎鏡像
常用docker指令及說明:
下面將對這些常用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>事先不存在,它將會被自動創建,這包括其父目錄路徑
示例:
創建一個測試頁面,必須和Dockerfile在同一目錄中
echo This is a test Server > index.html
創建名稱為tinyhttpd:v1的鏡像
docker build -t tinyhttpd:v1 ./
可以看到自定義內容已寫入到生成的鏡像中
docker run –name tinyweb1 –rm tinyhttpd:v1 cat /data/web/html
示例:打包本地yum倉庫到鏡像
首先把本地庫文件移到至Dockerfile同一目錄下
編寫Dockerfile文件加入一行:
COPY yum.repos.d /etc/yum.repos.d/
docker build -t tinyhttpd:v2 ./
可看到本地倉庫已放入到生成的鏡像中
docker run –name tinyweb1 –rm tinyhttpd:v2 ls /etc/yum.repos.d/
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>指定目錄下
而當<src>為本地tar文件時,文件將被加壓到<dest>目錄下
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
docker build -t tinyhttpd:v5 ./
結果與v4版本相同
docker run –name tinyweb1 –rm tinyhttpd:v5 ls /usr/local/src/nginx-1.15.2
VOLUME
功能:用于在image中創建一個掛載點目錄,以掛載Docker host上的卷或其
它容器上的卷
格式:
VOLUME <mountpoint> 或
VOLUME [“<mountpoint>”]
如果掛載點目錄路徑下此前在文件存在,docker run命令會在卷掛載完成后將此
前的所有文件復制到新掛載的卷中
示例:
docker run –name tinyweb1 –rm tinyhttpd:v6
docker run –name tinyweb1 –rm tinyhttpd:v6 mount
EXPOSE
功能:用于為容器打開指定要監聽的端口以實現與外部通信,暴露端口
格式:EXPOSE <port>[/<protcol>] [<port>[/<protcol>] …
<protcol>用于指定傳輸層協議,可為tcp或udp二者之一,默認為TCP協議
EXPOSE指令可一次指定多個端口,例如
EXPOSE 121/udp 121/tcp
示例:
配置暴露dockerfile tcp 80端口
docker build -t tinyhttpd:v7 ./
本機默認可訪問,但80端口未暴露給其他主機
docker run –name tinyweb1 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html
加-P選項,可以暴露端口
切換另外一臺主機進行訪問:
我們也可以指定宿主機端口對應docker容器中暴露的端口
docker run –name tinyweb1 -p 80:80 –rm tinyhttpd:v7 /bin/httpd -f -h /data/web/html
此時訪問宿主機的80端口,成功訪問
ENV
功能:用于為鏡像定義所需的環境變量,并可被Dockerfile文件中位于其后的其它指令
(如ENV、ADD、COPY等)所調用
調用格式為$varible_name或${varible_name}
格式:
ENV <key> <value> 或
ENV <key>=<value>
1、第一種格式中,<key>之后的所有內容均會被視作其<value>的組成部分,因此,一次只
能設置一個變量;
2、第二種格式可用一次設置多個變量,每個變量為一個”<key>=<value>”的鍵值對,如果
<value>中包含空格,可以反斜線(\)進行轉義,也可通過對<value>加引號進行標識;另
外,反斜線也可用于續行;
3、定義多個變量時,建議使用第二種方式,以便在同一層中完成所有功能
示例:
docker build -t tinyhttpd:v8 ./
docker run –name tinyweb1 –rm -P tinyhttpd:v8 printenv
也可在啟動鏡像時定義變量改變docker鏡像中的已定義變量
docker run –name tinyweb1 –rm -P -e WEB_SERVER_PACKAGE=”nginx-1.15.1″ tinyhttpd:v8 printenv
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
docker build -t tinyhttpd:v9 ./
docker run -name tinyweb1 -rm tinyhttpd:v9 lscd /usr/local/src
CMD
作用:類似于RUN指令,CMD指令也可用于運行任何命令或應用程序,不
過,二者的運行時間點不同
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
docker build -t myweb:v2 ./
docker run –name myweb1 –rm -it myweb:v2 cat /etc/nginx/conf.d/www.conf
前端運行
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
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/104623