Docker(六):Dockerfile

一. Dockerfile是什麼?

    Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。

  • 構建三步驟
    編寫Dockerfile文件 >> docker build >> docker run

  • 文件大概長什麼樣?
    以CentOS爲例,https://hub.docker.com/_/centos/
    在這裏插入圖片描述
    二. Dockerfile構建過程解析

  • Dockerfile內容基礎知識
    1:每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
    2:指令按照從上到下,順序執行
    3:#表示註釋
    4:每條指令都會創建一個新的鏡像層,並對鏡像進行提交

  • Docker執行Dockerfile的大致流程
    (1)docker從基礎鏡像運行一個容器
    (2)執行一條指令並對容器作出修改
    (3)執行類似docker commit的操作提交一個新的鏡像層
    (4)docker再基於剛提交的鏡像運行一個新容器
    (5)執行dockerfile中的下一條指令直到所有指令都執行完成

從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段,

  • Dockerfile是軟件的原材料
  • Docker鏡像是軟件的交付品
  • Docker容器則可以認爲是軟件的運行態。
    Dockerfile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
    在這裏插入圖片描述
    1 Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等;

2 Docker鏡像,在用Dockerfile定義一個文件之後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;

3 Docker容器,容器是直接提供服務的。

三. DockerFile體系結構(保留字指令)

  • FROM
    基礎鏡像,當前新鏡像是基於哪個鏡像的

  • MAINTAINER
    鏡像維護者的姓名和郵箱地址

  • RUN
    容器構建時需要運行的命令

  • EXPOSE
    當前容器對外暴露出的端口

  • WORKDIR
    指定在創建容器後,終端默認登陸的進來工作目錄,一個落腳點

  • ENV
    用來在構建鏡像過程中設置環境變量.
    ENV MY_PATH /usr/mytest
    這個環境變量可以在後續的任何RUN指令中使用,這就如同在命令前面指定了環境變前綴一樣;也可以在其它指令中直接使用這些環境變量, 比如:WORKDIR $MY_PATH

  • ADD
    將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包

  • COPY
    類似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置

COPY src dest
COPY ["src", "dest"]
  • VOLUME
    容器數據卷,用於數據保存和持久化工作

  • CMD
    指定一個容器啓動時要運行的命令.
    Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換.

  • ENTRYPOINT
    指定一個容器啓動時要運行的命令.
    ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啓動程序及參數

  • ONBUILD
    當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發
    在這裏插入圖片描述
    四. 案例

  • Base鏡像(scratch)
    Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的。

  • 自定義鏡像mycentos

  1. Docker Hub默認的CentOS鏡像可能沒有我們想要的功能,如vim編輯器,ifconfig支持等。
    在這裏插入圖片描述
  2. 自定義 mycentos 鏡像使其具備:
    登陸後的默認路徑
    vim編輯器
    查看網絡配置ifconfig支持
    在這裏插入圖片描述
  3. 構建
docker build -t 新鏡像名字:TAG .       #. 表示當前目錄

在這裏插入圖片描述
4. 運行

docker run -it 新鏡像名字:TAG 

在這裏插入圖片描述
可以看到,我們自己的新鏡像已經支持vim/ifconfig命令,擴展成功了。

  1. 列出鏡像的變更歷史
docker history 鏡像名

在這裏插入圖片描述

  • CMD/ENTRYPOINT 鏡像案例
    兩者都是指定一個容器啓動時要運行的命令。
    CMD:Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換。如執行 docker run -it -p 8888:8080 tomcat ls -l 會直接列出tomcat的Dockerfile中定義的WORKDIR目錄下的文件。
    ENTRYPOINT :docker run 之後的參數會被當做參數傳遞給 ENTRYPOINT,之後形成新的命令組合。

case 1: 製作CMD版可以查詢IP信息的容器
在這裏插入圖片描述
在這裏插入圖片描述

curl命令解釋:curl命令可以用來執行下載、發送各種HTTP請求,指定HTTP頭部等操作。
如果系統沒有curl可以使用yum install curl安裝,也可以下載安裝。
curl是將下載文件輸出到stdout.
使用命令:curl http://www.baidu.com
執行後,www.baidu.com的html就會顯示在屏幕上了
這是最簡單的使用方法。用這個命令獲得了http://curl.haxx.se指向的頁面,同樣,如果這裏的URL指向的是一個文件或者一幅圖都可以直接下載到本地。如果下載的是HTML文檔,那麼缺省的將只顯示文件頭部,即HTML文檔的header。要全部顯示,請加參數 -i。

case 2:製作ENTROYPOINT版查詢IP信息的容器
在上面的示例中,如果我們希望顯示 HTTP 頭信息,就需要加上 -i 參數。
在這裏插入圖片描述
這裏爲什麼加上 -i 會報錯呢?
之前我們說過,跟在鏡像名後面的是 command,運行時會替換 CMD 的默認值。因此這裏的 -i 替換了原來的 CMD,而不是添加在原來的 curl -s http://ip.cn 後面。而 -i根本不是命令,所以自然找不到。那麼如果我們希望加入 -i 這參數,我們就必須重新完整的輸入這個命令: $ docker run myip curl -s http://ip.cn -i
在這裏插入圖片描述
在這裏插入圖片描述

  • ONBUILD命令:當構建一個被繼承的Dockerfile時運行該命令,父鏡像在被子鏡像繼承後,父鏡像的ONBUILD被觸發。
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 自定義鏡像Tomcat9
  1. mkdir -p /mydockerfile/tomcat9
  2. 在上述目錄下touch c.txt
  3. 將jdk jdk-8u171-linux-x64.tar.gz和tomcat apache-tomcat-9.0.8.tar.gz安裝的壓縮包拷貝進上一步目錄
  4. 在/mydockerfile/tomcat9目錄下新建Dockerfile文件

在這裏插入圖片描述
5. 構建
6. run
7. 驗證
8. 結合前述的容器卷將測試的web服務test發佈

五. 小結
在這裏插入圖片描述

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