Docker容器技術 |DockerFile文件解析


DockerFile是什麼

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

構建DockerFile文件的步驟:
①編寫Dockerfile文件
②docker build 獲得自定義的鏡像
③docker run

DockerFile構建過程解析

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

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

在這裏插入圖片描述
Dockerfile,Dockerfile定義了進程需要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等。

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

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

DockerFile保留字指令

在這裏插入圖片描述
BUILD

FROM      基礎鏡像,當前新鏡像是基於哪個鏡像的
MAINTAINER   鏡像維護者的姓名和郵箱地址:鏡像維護者的姓名和郵箱地址
COPY      類似ADD,拷貝文件和目錄到鏡像中。
ADD       將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
RUN       容器構建時需要運行的命令
ONBUILD     當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發

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

RUN
CMD       指定一個容器啓動時要運行的命令
ENV       用來在構建鏡像過程中設置環境變量

ENV MY_PATH /usr/mytest 這個環境變量可以在後續的任何RUN指令中使用,這就如同在命令前面指定了環境變量前綴一樣。也可以在其它指令中直接使用這些環境變量,比如:WORKDIR $MY_PATH

EXPOSE     當前容器對外暴露出的端口
VOLUME     容器數據卷,用於數據保存和持久化工作
ENTRYPOINT    指定一個容器啓動時要運行的命令

將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置。

案例1:自定義鏡像centos

在這裏插入圖片描述

Base鏡像(scratch) :大多數的鏡像都是通過在base鏡像中安裝和配置需要的軟件構建出來的,所以大多數DockerFile開頭都是 from scratch

①編寫:

由於從阿里雲拉下來的centos只是一個內核,不附帶vim、ifconfig等命令、默認進入即是/目錄,所以我們可以自定義設置它:

FROM centos
MAINTAINER gql<[email protected]>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
RUN yum -y install vim
RUN yum -y install net-tools
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

②構建
docker build -f /mydocker/Dockerfile1 -t mycentos:1.2 .

③運行
docker run -it mycentos:1.2

此時運行,鏡像就有了ifconfig和vim命令的功能。
在這裏插入圖片描述
還可以使用docker history 鏡像id列出鏡像的變更歷史,這裏的列表是順着加載倒着執行的,類似於棧。
在這裏插入圖片描述

案例2:ONBUILD命令案例

首先在宿主機的/mydocker下創建Dockerfile2,使用vim編寫以下命令:

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://ip.cn"]
ONBUILD RUN echo "father onbuild----------"

將Dockerfile2構建爲父鏡像:docker build -f /mydocker/Dockerfile2 -t my_father .

然後在宿主機的/mydocker下創建Dockerfile3,使用vim編寫以下命令:

FROM my_father
RUN yum install -y curl
CMD ["curl","-s","http://ip.cn"]

以my_father爲父鏡像,將Dockerfile3構建爲子鏡像:docker build -f /mydocker/Dockerfile3 -t my_son .

可以看到,在子鏡像構建的時候,父鏡像中的指令執行。
在這裏插入圖片描述

案例3:自定義tomcat9

①創建文件夾:/mydocker/my_tomcat9,並在其中創建c.txt

mkdir /mydocker/my_tomcat9
cd /mydocker/my_tomcat9
touch c.txt

另外還需要手動下載apache-tomcat-9.0.8.tar.gzjdk-8u171-linux-x64.tar.gz/mydocker/my_tomcat9

②再創建Dockerfile_tomcat

FROM         centos
MAINTAINER    gql<[email protected]>
#把宿主機當前上下文的c.txt拷貝到容器/usr/local/路徑下
COPY c.txt /usr/local/cincontainer.txt
#把java與tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安裝vim編輯器
RUN yum -y install vim
#設置工作訪問時候的WORKDIR路徑,登錄落腳點
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java與tomcat環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器運行時監聽的端口
EXPOSE  8080
#啓動時運行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

③構建:docker build -f /mydocker/my_tomcat9 -t my_tomcat9 .

④運行:
docker run -d -p 8080:8080 --name myt9 -v /mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true my_tomcat9

DockerFile總結

在這裏插入圖片描述
在這裏插入圖片描述

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