文章目錄
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.gz
與jdk-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總結