Dockerfile


前言

Docker系列文章:

此篇是Docker系列的第五篇,大家一定要按照我做的Demo都手敲一遍,印象會更加深刻的,加油!

什么是DockerFile

Dockfile是一種被Docker程序解釋的腳本,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程序將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支持的命令,Docker程序解決這些命令間的依賴關系。Docker程序將讀取Dockerfile,根據指令生成定制的鏡像(Image)。相比鏡像這種黑盒子,Dockerfile這種顯而易見的腳本更容易被使用者接受,它明確鏡像是怎么產生的。有了Dockerfile,當我們需要定制自己額外的需求時,只需在Dockerfile上添加或者修改指令,重新生成鏡像即可,省去了敲命令的麻煩,每次增加一條命令就相當於在鏡像的基礎增加一層。

Dockerfile基本結構


Dockerfile一般分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令,Dockerfile的指令是忽略大小寫的,建議使用大寫,使用#作為注釋,每一行只支持一條指令,每條指令可以攜帶多個參數。

Dockerfile指令介紹

關於每個核心指令我都做自己學習時候可執行指令,大家耐心看,可以將指令拷貝執行一下,感悟會更加深刻。

FROM(指定基礎鏡像)

指定基礎鏡像,必須為第一個命令;后續的指令都依賴於該指令指定的鏡像。FROM指令指定的基礎鏡像可以是官方遠程倉庫中的,也可以位於本地倉庫。

#使用
FROM <image>
FROM <image>:<tag>
#demo
FROM mysql:5.7
#解釋
tag是可選的,如果不使用這兩個值時,會使用latest版本的基礎鏡像
MAINTAINER(用來指定鏡像創建者信息)

構建指令,用於將鏡像制作者相關的信息寫入到鏡像中。當我們對該鏡像執行docker inspect命令時,輸出中有相應的字段記錄該信息。

#使用
MAINTAINER <name>
#demo
MAINTAINER wtz wtz@163.com
RUN(構建鏡像時執行的命令)

RUN用於在鏡像容器中執行命令,其有以下兩種命令執行方式:

#shell執行方式
#使用
RUN <command>
#demo
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz 
#exec執行方式
#使用
RUN ["executable""param1""param2"]
#demo
RUN ["/etc/execfile""arg1""arg1"]
#備注
RUN指令創建的中間鏡像會被緩存,並會在下次構建中使用。如果不想使用這些緩存鏡像,可以在構建時指定--no-cache參數,如:docker build --no-cache
ADD(添加文件)

將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget;

#使用
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用於支持包含空格的路徑
#demo
ADD test.txt /test/    #添加test文件到 /test/
COPY(拷貝文件)

拷貝文件,不會自動解壓文件,也不能訪問網絡資源;

CMD(構建容器后調用)

指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條命令,只有最后一條會被執行。如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。后面這兩點一定要注意,我做了一些對應的demo,大家可以參考一下。

#支持三種格式:
#使用exec執行,推薦方式;
CMD ["executable","param1","param2"]
#在/bin/sh中執行,提供給需要交互的應用;
CMD command param1 param2
#提供給ENTRYPOINT的默認參數;
CMD ["param1","param2"
  1. CMD使用demo
#編寫dockerfilecmdtest
vim dockerfilecmdtest
FROM centos
CMD ["ls","-a"]
#構建鏡像
docker build -f dockerfilecmdtest -t centoscmdtest .
#查看鏡像
docker images
#啟動鏡像
docker run 8000ab3673ac

  1. 驗證用戶啟動容器時候指定了運行的命令,則會覆蓋掉CMD指定的命令;
#啟動鏡像時候執行-l 查看詳細的文件內容 
docker run 8000ab3673ac -l
#我們執行一個 ls -al 發現就可以執行
docker run 8000ab3673ac ls -al
  1. 如果CMD指定了多條命令,只有最后一條會被執行;
#編輯dockerfilecmdtest
vim dockerfilecmdtest
#增加一條
CMD echo "This is a test."
#構建鏡像
docker build -f dockerfilecmdtest -t centoscmdtest .
#查看啟動鏡像
docker iamges
docker run 86f69e6e6cbe
ENTRYPOINT(構建容器后調用)

類似於CMD指令,配置容器啟動后執行的命令,並且不被docker run提供的參數覆蓋。
每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最后一個起效。
可以搭配CMD命令使用:變參會使用CMD ,這里的CMD等於是在給ENTRYPOINT傳參。

#支持兩種格式
#使用exec執行
ENTRYPOINT ["executable""param1""param2"]
#shell中執行
ENTRYPOINT command param1 param2
  1. ENTRYPOINT使用demo並且驗證ENTRYPOINT提供的參數不被docker run提供的參數覆蓋;
#編寫dockerentrypointtest
vim dockerentrypointtest
FROM centos
ENTRYPOINT ["ls","-a"]
#構建鏡像
docker build -f dockerentrypointtest -t dockerentrypointtest .
#啟動鏡像
docker images
docker run 1ff15d1bff30 -l
#刪除鏡像
docker rmi 1ff15d1bff30

  1. 搭配CMD命令動態傳遞參數;
#編輯dockerentrypointtest
vim dockerentrypointtest
FROM ubuntu  
CMD ["-a"]  
ENTRYPOINT ["/usr/bin/ls"
#啟動容器
docker run 601d1c5b2cdd
ENV(設置環境變量)

設置環境變量,定義了環境變量,那么在后續的指令中,就可以使用這個環境變量。容器啟動后,可以通過docker inspect查看這個環境變量,也可以通過在docker run --env key=value時設置或修改環境變量。

#使用
ENV <key> <value>
EXPOSE(指定於外界交互的端口)

設置指令,該指令會將容器中的端口映射成宿主機器中的某個端口。當你需要訪問容器的時候,可以不是用容器的IP地址而是使用宿主機器的IP地址和映射后的端口。要完成整個操作需要兩個步驟,首先在Dockerfile使用EXPOSE設置需要映射的容器端口,然后在運行容器的時候指定-p選項加上EXPOSE設置的端口,這樣EXPOSE設置的端口號會被隨機映射成宿主機器中的一個端口號。也可以指定需要映射到宿主機器的那個端口,這時要確保宿主機器上的端口號沒有被使用。EXPOSE指令可以一次設置多個端口號,相應的運行容器的時候,可以配套的多次使用-p選項。

#使用
EXPOSE <port> [<port>...]
VOLUME(指定支持化的目錄)

創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放需要持久化的數據。Volume設置指令,使容器中的一個目錄具有持久化存儲數據的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用;

#使用
VOLUME ["<mountpoint>"]
WORKDIR(切換目錄)

設置指令,可以多次切換(相當於cd命令);

#格式
WORKDIR /path/to/workdir
USER(指定用戶)

指定運行容器時的用戶名或UID,默認是root,后續的RUN也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶;

#使用
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group

實戰

創建一個自帶tomcat的centos鏡像;

  1. 編輯DockerFile;
#編輯文件centostomcat
vim centostomcat
#基礎鏡像
FROM centos
#作者
MAINTAINER wtz "171776704@qq.com"
#拷貝文件當前目錄文件到/usr/local/中
COPY test.txt  /usr/local/test.txt
#拷貝當前目錄下的文件tomcat和jdk到/usr/local/並解壓
ADD jdk-8u141-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.46.tar.gz /usr/local/
#安裝vim
RUN yum -y install vim
#生命變量
ENV INSTALLPATH /usr/local
WORKDIR $INSTALLPATH
#配置環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_141
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/$CLASSPATH
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.46
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.46
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA/bin
#對外暴露8080端口
EXPOSE 8080
#啟動tomact 並查看日志
CMD /usr/local/apache-tomcat-9.0.46/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.46/logs/catalina.out
  1. 構建鏡像;
docker build -f centostomcat -t dockerfiletomcat .
  1. 啟動鏡像,訪問8088端口,發現tomact已經啟動起來了;
docker run -d  -it --name tomcattest -p 8088:8080 dockerfiletomcat
curl localhost:8088
  1. 進入鏡像內部檢查/usr/local目錄下是否存在test.txt文件,是否安裝Java;
#進入鏡像
docker exec -it 141eec62a29a /bin/bash
ls
java -version

結束

歡迎大家點點關注,點點贊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM