一、Dockerfile 概念
Docker 鏡像是一個特殊的檔案系統,除了提供容器運作時所需的程式、庫、資源、配置等檔案外,還包含了一些為運作時準備的一些配置參數(如匿名卷、環境變量、使用者等)。鏡像不包含任何動态資料,其内容在建構之後也不會被改變。
鏡像的定制實際上就是定制每一層所添加的配置、檔案。如果我們可以把每一層修改、安裝、建構、操作的指令都寫入一個腳本,用這個腳本來建構、定制鏡像,那麼之前提及的無法重複的問題、鏡像建構透明性的問題、體積的問題就都會解決。這個腳本就是 Dockerfile。
Dockerfile 是一個文本檔案,其内包含了一條條的指令(Instruction),每一條指令建構一層,是以每一條指令的内容,就是描述該層應當如何建構。有了 Dockerfile,當我們需要定制自己額外的需求時,隻需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲指令的麻煩。
先來看一下我們最常用的centos的Dockerfile
在hub.docker.com中所有centos
含義:
1. 每條保留字指令都必須為大寫字母且後面要跟随至少一個參數
2. 指令按照順序, 從上到下, 一條指令就是一層
3. #表示注釋
4. 每條指令都會建立一個新的鏡像層, 并對鏡像進行送出
1. docker從基礎鏡像運作一個容器
2. 執行一條指令并對容器修改
3. 執行類似docker commit的操作送出一個新的鏡像層
4. docker在基于剛送出的鏡像運作一個新容器
5. 執行dockerfile中的下一條指令直到所指令都執行完成
二. Dockerfile案例
Docker hub中99%的鏡像都是通過在base鏡像中安裝和配置需要的軟體建構出來的.
最基礎的base鏡像是scratch, 這是所有鏡像的祖先
目标: 練習使用WORKDIR, FROM, EVN, RUN, CMD指令
以centos鏡像為例. 我們看
1) 設定進入容器的目錄不是根目錄
2) 為centos安裝vim和ifconfig指令
下面來詳細看看其含義
這個指令可以查詢鏡像建構的各個層
檢視tomcat的dockerfile.
最後一行是啟動tomcat的指令. 是以, 我們運作tomcat鏡像的時候, 會啟動tomcat
下面, 我們在指令行中使用其他CMD指令. 按照規則, docker run中最後的參數将替換dockerfile中的參數
運作結果:
沒有啟動tomcat,而是進入了檢視目前目錄的檔案.
我們來看一個案例, curl http://ip.cn 是查詢目前網絡資訊
第一步: 編寫一個dockerfile
第二步: 建構dockerfile
第三步: 運作容器
運作結果
第四步: 我們還想檢視header. 于是追加一個參數-i即可
如果使用CMD就會以docker run中的指令替換dockerfile, 這時我們應該使用ENTRYPOINT.
重新build, 然後在docker run啟動的時候增加 -i指令
檔案名叫Dockerfile. 固定叫法
檔案内容如下
domo-docker: 是生成的新的docker鏡像的名字.
. 表示的是檔案生成在目前目錄
建構的時候, 首先會判斷基礎鏡像是否存在, 如果不存在, 則下載下傳
我們看到生産了一個64.2M的鏡像. 版本定義了一個最新版本
運作鏡像, 列印輸出hello docker
以上我們就自己定義了一個dockerfile,并運作起來了.
練習COPY ADD指令
按照如下操作執行
touch c.txt
apache-tomcat-9.0.8.tar.gz
jdk.tar.gz
其中後兩個檔案是tomcat和jdk的壓縮包, 我們提前下載下傳好,放到檔案夾裡即可. 如下圖所示: