Docker之Dockerfile
1、Dockerfile
1.1、dockerfile的基本介紹
Dockerfile 是一個用來構建鏡像的文本文件,該文本內容內包含了一條條構建鏡像所需的指令和參數。Dockerfile其內部包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。
DockerFile 對于 docker 鏡像而言,可以理解為就如同 java 中某個類的 .class 文件對應上該類的 .java 文件。
從應用軟件的角度來看,Dockerfile、 Docker鏡像與Docker容器分別代表軟件的三個不同階段:
- Dockerfile是軟件的原材料
- Docker鏡像是軟件的交付品
- Docker容器則可以認為是軟件的運行態。
Dockerfile面向開發,Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
1.2、dockerfile內容
Dockerfile 一般分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令、容器啟動時執行指令。
文件內容說明:
- 每條保留字指令都必須為大寫字母且后面要跟隨至少一個數
- 指令按照從上到下,順序執行
- 每條指令都會創建一個新的鏡像層,并對鏡像進行提交
- #表示注釋
2、Dockerfile常用指令
常用指令圖:

2.1、FROM(指定基礎鏡像)
FROM:指定基礎鏡像,即當前鏡像基于哪個鏡像創建的。該指令必須為第一個命令。
示例:
FROM centos:6
2.2、MAINTAINER(指定維護者信息)
指明鏡像維護者及其聯系方式(一般是郵箱地址),例如:
MAINTAINER xxx <xxx@qq.com>
不過,MAINTAINER并不推薦使用,更推薦使用LABEL來指定鏡像作者,例如:
LABEL maintainer="edisonzhou.cn"
2.3、RUN
鏡像構建時運行的命令,例如:
RUN ["yum", "install", "httpd"] RUN yum install vim #安裝vim模塊 RUN yum install net-tools
2.4、EXPOSE
聲明容器運行的該容器暴露的服務端口,例如:
EXPOSE 80 443
2.5、CMD
啟動容器時執行的Shell命令,例如:
CMD ["-C", "/start.sh"] CMD echo "success----ok" CMD /bin/bash
Dockerfile 文件中可以存在多個 CMD 指令,但僅有最后一個會生效。并且 CMD 啟動的程序會被 docker run 命令行最后所指定的參數所覆蓋。
2.6、WORKDIR
指定在創建并運行容器后,默認進去的容器的目錄。如果沒有指定,將默認進去容器內的根目錄 / 下。
也是為RUN、CMD、ENTRYPOINT以及COPY和AND設置工作目錄,例如:
WORKDIR /data
2.7、ENV
設置環境變量,例如:
ENV MY_PATH /usr/test ENV MYSQL_ROOT_PASSWORD 123456 ENV JAVA_HOME /usr/local/jdk1.8.0_45
設置的環境變量可以在后續的任何RUN指令中使用,也可以在其它指令中直接使用這些環境變量。比如:WORKDIR $MY_PATH
2.8、COPY
將宿主機目錄下的文件或者目錄拷貝進鏡像中,例如:
COPY ./start.sh /start.sh
2.9、ADD
將宿主機目錄下的文件或者目錄拷貝進鏡像中,相對于 COPY 命令的區別是如果是URL或壓縮包,會自動下載或自動解壓。
例如:
ADD 宿主機文件路徑 鏡像文件路徑 ADD html.tar.gz /var/www/html ADD https://xxx.com/html.tar.gz /var/www/html
2.10、VOLUME
指定容器掛載點到宿主機自動生成的目錄或其他容器,例如:
VOLUME ["/var/lib/mysql"]
一般不會在Dockerfile中用到,更常見的還是在docker run的時候指定-v數據卷。
2.11、ENTRYPOINT
啟動容器時執行的Shell命令,同CMD類似,只是由 ENTRYPOINT 啟動的程序不會被 docker run 命令行指定的參數所覆蓋,而且,這些命令行參數會被當作參數傳遞給 ENTRYPOINT 指定的程序。
例如:
ENTRYPOINT ["/bin/bash", "-C", "/start.sh"] ENTRYPOINT /bin/bash -C '/start.sh'
Dockerfile 文件中也可以存在多個 ENTRYPOINT 指令,但僅有最后一個會生效。
2.12、ONBUILD
用于設置鏡像觸發器,當所構建的鏡像被用做其它鏡像的基礎鏡像,該鏡像中的觸發器就會被觸發。
2.13、USER
指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創建所需要的用戶
# 格式: USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group # 示例: USER wen
使用USER指定用戶后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT 都將使用該用戶。鏡像構建完成后,通過 docker run 運行容器時,可以通過 -u 參數來覆蓋所指定的用戶。

浙公網安備 33010602011771號