Docker學習之路(四) Dockerfile編寫

Docker學習之路(四) Dockerfile

在第一天的學習中 此次嘗試了 自己提交一個鏡像 即commit命令

複習:如何根據一個容器 commit 爲一個全新鏡像

docker commit -m="提交信息" -a="作者信息" 使用的容器ID/容器名 要提交爲的鏡像名:Tag

DockerfIle 瞭解

Dockerfile 呢, 也是docker 構建鏡像的一種方式,類似於一個構建鏡像的腳本文件。

官方解釋

image-20200524103408193

我們查看官網的鏡像倉庫 隨便搜索一個鏡像,發現每一個鏡像都是有很多版本號的 那麼這些發佈的鏡像又是從哪裏來的呢? 他們就是通過dockerfile文件來構建的一個個鏡像。

image-20200524103203614

我們點開 centos7 版本 發現來到了 github地址,果然 centos7 構建也是由一個dockerfile文件執行命令構建完成的。

image-20200524103642712

看了 官網dockerfile的解釋 ,是在文件中連續編寫幾個構建鏡像的指令 最後纔會成爲一個完整的鏡像,文件中 幾個紅色全大寫的應該就是指令了 ,指令的意義以及dockerfile 文件內容以及 執行流程下邊慢慢梳理。

DockerfIle指令

dockfile 文件 就是通過其中編寫的一個個指令 ,我們執行dockerfile 文件中的指令 指令一層層疊加 最後就形成了咱的鏡像。

Dockerfile由多條指令組成,每條指令在編譯鏡像時執行相應的程序完成某些功能,由指令+參數組成,以逗號分隔,#作爲註釋起始符,指令不區分大小寫,但是一般指令使用大些,參數使用小寫

dockerfile 指令初略說明
指令 參數
FROM 構建我們鏡像所需的基礎鏡像
MAINTAINER 構建鏡像的作者信息 (官網最新已棄用) 採用LABEL
RUN 構建鏡像時 需要運行的命令
CMD 設置容器 啓動時需要運行的命令 命令會被覆蓋
LABEL 設置鏡像標籤
EXPOSE 申明鏡像暴露的端口 類似命令 -p xxx:xxx
VOLUME 定義數據捲進進行掛載 類似命令 -v
ENV 設置鏡像環境變量 命令 -e
COPY 編譯鏡像時 將文件複製到鏡像中 docker cp 外路徑 容器內路徑
ADD ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)
ENTRYPOINT 類似於 CMD 指令 但命令不會被覆蓋
WORKDIR 指定工作目錄。用 WORKDIR 指定的工作目錄,會在構建鏡像的每一層中都存在
ONBUILD 用於延遲構建命令的執行。
HEALTHCHECK 用於指定某個程序或者指令來監控 docker 容器服務的運行狀態。
dockerfile 指令詳細說明
FROM
指令:FROM 
功能描述:設置基礎鏡像 
語法:FROM < image>[:< tag> | @< digest>]   
示例:咱們上方的 centos7 鏡像 設置的基礎鏡像爲:FROM scratch
提示:鏡像都是從一個基礎鏡像(操作系統或其他鏡像)生成,可以在一個Dockerfile中添加多條FROM指令,一次生成多個鏡像 
注意:如果忽略tag選項,會使用latest鏡像
MAINTAINER
指令:MAINTAINER  
功能描述:構建鏡像的作者信息   一般在設置作者信息的時候 採用 作者名+郵箱的形式  最新官網已棄用 建議使用 LABEL  示例:LABEL maintainer="[email protected]"
語法:MAINTAINER < name>
示例:MAINTAINER <[email protected]>
RUN
指令:RUN
功能描述:用於執行後面跟着的命令行命令
語法:
shell 格式: RUN <命令行命令>  
示例:<命令行命令> 等同於,在終端操作的 shell 命令。  RUN ls -a
exec 格式	: RUN ["可執行文件", "參數1", "參數2"]
示例:RUN ["./test.php", "dev", "offline"] 等價於 RUN ./test.php dev offline
CMD
指令:CMD 
功能描述:設置容器 啓動時需要運行的命令
語法:
CMD <shell 命令> 
CMD ["<可執行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 該寫法是爲 ENTRYPOINT 指令指定的程序提供默認參數
提示:類似於 RUN 指令,用於運行程序,但二者運行的時間點不同:
        CMD 在docker run 時運行。
        RUN 是在 docker build。
        
注意:構建鏡像後,通過docker run 啓動容器的時候 cmd命令會被覆蓋,即Dockerfile中只能有一條CMD命令,如果寫了多條則最後一條生效 
ENTRYPOINT
指令:COPY
語法:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
示例:
ENTRYPOINT ["nginx", "-c"] # 定參
CMD ["/etc/nginx/nginx.conf"] # 變參 
功能描述:類似於 CMD 指令,但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。 
注意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最後一個生效。
CMD 和ENTRYPONIT 區別

我們之前說了 cmd 命令 在 docker run 啓動的時候 cmd 命令會被覆蓋 而ENTRYPOINT 會進行追加

實戰理解:

一個用 cmd 構建鏡像

編寫構建文件 dockerfilecmd

FROM centos
CMD echo "aaaa"
CMD ["ls","-a"]
docker build -f /docker/dockerfile/dockerfilecmd-t cmdcentos .

用ENTRYPOINT 執行shell命令構建鏡像

添加 dockerfile-entrypoint 文件

FROM centos
ENTRYPOINT ["ls","-a"]
docker build -f /docker/dockerfile/dockerfile-entrypoint -t entrypiintcentos .

二者區別 cmd 在 docker run 命令後 加入 -l 運行報錯 因爲 之前的 ls -a 被覆蓋爲了 l ,l 命令是沒有的,所以報錯 entrypoint 在 docker run 命令後 加入 -l 其原生的 ls -a 追加了 l 變爲了 ls -al,因而詳細展示了目錄。

image-20200524141034157

WORKDIR
指令:WORKDIR 
功能描述:設置RUN CMD ENTRYPOINT ADD COPY指令的工作目錄 ,該WORKDIR指令可以解析先前使用設置的環境變量 ENV
語法:WORKDIR < Path> 
示例:WORKDIR /a
提示:如果工作目錄不存在,則Docker Daemon會自動創建 
          Dockerfile中多個地方都可以調用WORKDIR,如果後面跟的是相對位置,則會跟在上條WORKDIR指定路徑後(如WORKDIR /A   WORKDIR B   WORKDIR C,最終路徑爲/A/B/C)
ONBUILD
LABEL
指令:LABEL 
功能描述:設置鏡像的標籤 
延伸:鏡像標籤可以通過docker inspect查看 
格式:LABEL < key>=< value> < key>=< value>
示例:LABEL version="1.0"
提示:不同標籤之間通過空格隔開 
注意:鏡像會繼承基礎鏡像中的標籤,如果存在同名標籤則會覆蓋
EXPOSE
指令:EXPOSE 
功能描述:該EXPOSE指令通知Docker容器在運行時監聽指定的網絡端口。您可以指定端口是偵聽TCP還是UDP,如果未指定協議,則默認值爲TCP。
語法:EXPOSE < port> < port> …
示例:
延伸:鏡像暴露端口可以通過docker inspect查看 
提示:容器啓動時,Docker Daemon會掃描鏡像中暴露的端口,如果加入-P參數,Docker Daemon會把鏡像中所有暴露端口導出,併爲每個暴露端口分配一個隨機的主機端口(暴露端口是容器監聽端口,主機端口爲外部訪問容器的端口) 
注意:EXPOSE只設置暴露端口並不導出端口,只有啓動容器時使用-P/-p才導出端口,這個時候才能通過外部訪問容器提供的服務
VOLUME
指令:VOLUME 
功能描述:設置容器的掛載點 
語法:
VOLUME [“/data”] 
VOLUME /data1 /data2 
提示:啓動容器時,Docker Daemon會新建掛載點,並用鏡像中的數據初始化掛載點,可以將主機目錄或數據卷容器掛載到這些掛載點  在啓動容器 docker run 的時候,我們可以通過 -v 參數修改掛載點。
ENV
指令:ENV 
功能描述:設置鏡像中的環境變量 
語法:ENV < key>=< value>…|< key> < value> 
示例:ENV PASSWORD=123456
注意:環境變量在整個編譯週期都有效,第一種方式可設置多個環境變量,第二種方式只設置一個環境變量 
提示: ENV設置的變量值在整個編譯過程中總是保持不變的
COPY
指令:COPY
功能描述:複製指令,從上下文目錄中複製文件或者目錄到容器裏指定路徑。
語法:COPY <源路徑1>...  <目標路徑>   
示例:COPY /leilei/home/* /mydir/
ADD
指令:COPY
功能描述:複製指令,從上下文目錄中複製文件或者目錄到容器裏指定路徑。ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:
語法:ADD <源路徑1>...  <目標路徑>   
示例:ADD /leilei/home/* /mydir/
注意:
ADD 的優點:在執行 <源文件> 爲 tar 壓縮文件的話,壓縮格式爲 gzip, bzip2 以及 xz 的情況下,會自動複製並解壓到 <目標路徑>。
ADD 的缺點:在不解壓的前提下,無法複製 tar 壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。
指令:ONBUILD 
功能描述:用於延遲構建命令的執行。簡單的說,就是 Dockerfile 裏用 ONBUILD 指定的命令,在本次構建鏡像的過程中不會執行(假設鏡像爲 test-build)。當有新的 Dockerfile 使用了之前構建的鏡像 FROM test-build ,這是執行新鏡像的 Dockerfile 構建時候,會執行 test-build 的 Dockerfile 裏的 ONBUILD 指定的命令。

語法:ONBUILD [INSTRUCTION] 

HEALTHCHECK
指令:HEALTHCHECK 
功能描述:健康檢查 用於指定某個程序或者指令來監控 docker 容器服務的運行狀態。
語法:
HEALTHCHECK [選項] CMD <命令>:設置檢查容器健康狀況的命令
HEALTHCHECK NONE:如果基礎鏡像有健康檢查指令,使用這行可以屏蔽掉其健康檢查指令

HEALTHCHECK [選項] CMD <命令> : 這邊 CMD 後面跟隨的命令使用,可以參考 CMD 的用法。

實戰: Dockerfile 文件生成鏡像

我們在宿主機上 /docker/ 下創建一個文件

touch dockerfile

在文件中 編寫咱們的指令

vim dockerfile

文件內容

#指定基礎鏡像
FROM centos
#指定掛載
VOLUME ["volumes"]
#指定版本
LABEL version="6.6.6"
#指定作者
LABEL author="leilei"
CMD '---build--success--'
CMD /bin/bash

使用 dokcer build 命令根據 Dockerfile 進行構建 -f 指定 Dockerfile 文件位置 -t 指定構建 鏡像名:Tag 注意後邊有個小 .

docker build -f /docker/dockerfile/dockerfile01 -t leileicentos:1.2 .

image-20200524134139828

構建成功後 會有兩個successfully 語句

image-20200524134205362

查看鏡像並運行

image-20200524134347315

發現我們進入容器後 直接來到了所指定的功能合作目錄 /usr/local/下,並且我們安裝的 nginx 以及vim 命令可以使用了 還可以使用 docker inspect 查看運行容器的詳細信息

image-20200524134531500

特別注意:構建語句後邊有個 . 符號

特別注意:構建語句後邊有個 . 符號

特別注意:構建語句後邊有個 . 符號

截止這裏 dockerfile 的初步使用就完了 後續更新 開發項目 通過docker 構建鏡像並運行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章