天天看點

Dockerfile詳細介紹

作者:孫工精品

1、DockerFile介紹

1.1、簡介

Dockerfile是用來建構Docker鏡像的文本檔案,是由一條條建構鏡像所需的指令和參數構成的腳本。

Dockerfile詳細介紹

1.2、官網介紹

Dockerfile詳細介紹

https://docs.docker.com/engine/reference/builder/

1.3、建構三步

  • 編寫Dockerfile檔案
  • docker build指令建構鏡像
  • docker run依鏡像運作容器執行個體

2、DockerFile建構過程解析

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

2.1、總結

從應用軟體的角度來看,Dockerfile、Docker鏡像與Docker容器分别代表軟體的三個不同階段, Dockerfile是軟體的原材料 Docker鏡像是軟體的傳遞品 Docker容器則可以認為是軟體鏡像的運作态,也即依照鏡像運作的容器執行個體 Dockerfile面向開發,Docker鏡像成為傳遞标準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。

Dockerfile詳細介紹

1、Dockerfile,需要定義一個Dockerfile,Dockerfile定義了程序需要的一切東西。Dockerfile涉及的内容包括執行代碼或者是檔案、環境變量、依賴包、運作時環境、動态連結庫、作業系統的發行版、服務程序和核心程序(當應用程序需要和系統服務和核心程序打交道,這時需要考慮如何設計namespace的權限控制)等等;

2 、Docker鏡像,在用Dockerfile定義一個檔案之後,docker build時會産生一個Docker鏡像,當運作 Docker鏡像時會真正開始提供服務;

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

3、DockerFile常用保留字指令

Dockerfile内容基礎知識

1、每條保留字指令都必須為大寫字母且後面要跟随至少一個參數

2、指令按照從上到下,順序執行

3、#表示注釋

4、每條指令都會建立一個新的鏡像層并對鏡像進行送出

3.1、FROM

基礎鏡像,目前新鏡像是基于哪個鏡像的,指定一個已經存在的鏡像作為模闆,第一條必須是from

3.2、MAINTAINER

鏡像維護者的姓名和郵箱位址

3.3、RUN

容器建構時需要運作的指令 兩種格式 shell格式

Dockerfile詳細介紹

RUN yum -y install vim ,exec格式

Dockerfile詳細介紹

RUN是在 docker build時運作

3.4、EXPOSE

目前容器對外暴露出的端口

3.5、WORKDIR

指定在建立容器後,終端預設登陸的進來工作目錄,一個落腳點

3.6、USER

指定該鏡像以什麼樣的使用者去執行,如果都不指定,預設是root

3.7、ENV

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

3.7、ADD

将主控端目錄下的檔案拷貝進鏡像且會自動處理URL和解壓tar壓縮包

3.8、COPY

類似ADD,拷貝檔案和目錄到鏡像中。 将從建構上下文目錄中 <源路徑> 的檔案/目錄複制到新的一層的鏡像内的 <目标路徑> 位置 COPY src dest COPY ["src", "dest"] <src源路徑>:源檔案或者源目錄 <dest目标路徑>:容器内的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動建立。

3.9、VOLUME

容器資料卷,用于資料儲存和持久化工作

3.10、CMD

指定容器啟動後的要幹的事情

Dockerfile詳細介紹

注意:Dockerfile 中可以有多個 CMD 指令,但隻有最後一個生效,CMD 會被 docker run 之後的參數替換

它和前面RUN指令的差別 CMD是在docker run 時運作。 RUN是在 docker build時運作

3.11、ENTRYPOINT

也是用來指定一個容器啟動時要運作的指令 類似于 CMD 指令,但是ENTRYPOINT不會被docker run後面的指令覆寫, 而且這些指令行參數會被當作參數送給 ENTRYPOINT 指令指定的程式,指令格式和案例說明

Dockerfile詳細介紹

ENTRYPOINT可以和CMD一起用,一般是變參才會使用 CMD ,這裡的 CMD 等于是在給 ENTRYPOINT 傳參。 當指定了ENTRYPOINT後,CMD的含義就發生了變化,不再是直接運作其指令而是将CMD的内容作為參數傳遞給ENTRYPOINT指令,他兩個組合會變成 <ENTRYPOINT> "<CMD>"

案例如下:假設已認證 Dockerfile 建構了 nginx:test 鏡像:

Dockerfile詳細介紹
是否傳參 按照dockerfile編寫執行 傳參運作
Docker指令 docker run nginx:test docker run nginx:test -c /etc/nginx/new.conf
衍生出的實際指令 nginx -c /etc/nginx/nginx.conf nginx -c /etc/nginx/new.conf

3.12、總結

Dockerfile詳細介紹

4、DockerFile案例

自定義鏡像mycentosjava8,要求:Centos7鏡像具備vim+ifconfig+jdk8

4.1、準備編寫Dockerfile檔案

FROM centos:7
MAINTAINER sun<[email protected]>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安裝vim編輯器
RUN yum -y install vim
#安裝ifconfig指令檢視網絡IP
RUN yum -y install net-tools
#安裝java8及lib庫
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安裝包必須要和Dockerfile檔案在同一位置
ADD jdk-8u181-linux-x64.tar.gz /usr/local/java/
#配置java環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_181
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash           
Dockerfile詳細介紹

4.2、建構

docker build -t 新鏡像名字:TAG .

docker build -t centosjava8:0.1 .           

注意,上面TAG後面有個空格,有個點

Dockerfile詳細介紹

4.3、運作

docker run -it 新鏡像名字:TAG

docker run -it centosjava8:0.1 /bin/bash           
Dockerfile詳細介紹
Dockerfile詳細介紹

5、UnionFS(聯合檔案系統)

Union檔案系統(UnionFS)是一種分層、輕量級并且高性能的檔案系統,它支援對檔案系統的修改作為一次送出來一層層的疊加,同時可以将不同目錄挂載到同一個虛拟檔案系統下(unite several directories into a single virtual filesystem)。Union 檔案系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。特性:一次同時加載多個檔案系統,但從外面看起來,隻能看到一個檔案系統,聯合加載會把各層檔案系統疊加起來,這樣最終的檔案系統會包含所有底層的檔案和目錄