在Docker
中建立鏡像最經常使用的方式,就是使用Dockerfile
。Dockerfile
是一個Docker
鏡像的描述文件,Dockerfile
包含了一條條的指令,每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建。html
Dockerfile
思惟導圖Dockerfile
示例# FROM指定所需依賴的基礎鏡像 ,格式:FROM <image>:<tag>
FROM java:8
# 持久化到指定目錄
VOLUME /tmp
# ADD複製文件,格式:ADD <src> <dest>
ADD eureka-server-1.0-SNAPSHOT.jar app.jar
# RUN在容器構建過程當中執行的命令,格式:RUN <command>
RUN bash -c "touch /app.jar"
# EXPOSE聲明須要對外暴露的端口
EXPOSE 8761
#ENTRYPOINT 指定docker容器啓動時執行的命令
##"-Djava.security.egd=file:/dev/./urandom" 加快隨機數產生過程
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
複製代碼
Dockerfile
經常使用指令指明構建的新鏡像是來自於哪一個基礎鏡像,例如:java
FROM centos:6
複製代碼
指明鏡像維護者及其聯繫方式(通常是郵箱地址),例如:mysql
MAINTAINER DuebassLei <1130122701@qq.com>
複製代碼
不過,MAINTAINER
並不推薦使用,更推薦使用LABEL來指定鏡像做者,例如:sql
LABEL maintainer="DuebassLei"
複製代碼
構建鏡像時運行的Shell
命令,例如:docker
RUN ["yum", "install", "httpd"]
RUN yum install httpd
複製代碼
啓動容器時執行的Shell
命令,例如:centos
CMD ["-C", "/start.sh"]
CMD ["/usr/sbin/sshd", "-D"]
CMD /usr/sbin/sshd -D
複製代碼
聲明容器運行的服務端口,例如:bash
EXPOSE 80 443
複製代碼
設置環境內環境變量,例如:app
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
複製代碼
拷貝文件或目錄到鏡像中,例如:dom
ADD <src>...<dest>
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html
複製代碼
***PS:***若是是URL或壓縮包,會自動下載或自動解壓。ssh
拷貝文件或目錄到鏡像中,用法同ADD,只是不支持自動下載和解壓,例如:
COPY ./start.sh /start.sh
複製代碼
啓動容器時執行的Shell
命令,同CMD
相似,只是由ENTRYPOINT
啓動的程序不會被docker run命令行指定的參數所覆蓋,並且,這些命令行參數會被看成參數傳遞給ENTRYPOINT指定指定的程序,例如:
ENTRYPOINT ["/bin/bash", "-C", "/start.sh"]
ENTRYPOINT /bin/bash -C '/start.sh'
複製代碼
***PS:***Dockerfile
文件中也能夠存在多個ENTRYPOINT
指令,但僅有最後一個會生效。
指定容器掛載點到宿主機自動生成的目錄或其餘容器,例如:
VOLUME ["/var/lib/mysql"]
複製代碼
***PS:***通常不會在Dockerfile中用到,更常見的仍是在docker run的時候指定-v數據卷。
爲RUN、CMD和ENTRYPOINT執行Shell命令指定運行用戶,例如:
USER <user>[:<usergroup>]
USER <UID>[:<UID>]
USER edisonzhou
複製代碼
爲RUN、CMD、ENTRYPOINT以及COPY和AND設置工做目錄,例如:
WORKDIR /data
複製代碼
告訴Docker如何測試容器以檢查它是否仍在工做,即健康檢查,例如:
HEALTHCHECK --interval=5m --timeout=3s --retries=3 \
CMD curl -f http:/localhost/ || exit 1
複製代碼
一些選項的說明:
--interval=DURATION (default: 30s)
:每隔多長時間探測一次,默認30秒-- timeout= DURATION (default: 30s)
:服務響應超時時長,默認30秒--start-period= DURATION (default: 0s)
:服務啓動多久後開始探測,默認0秒--retries=N (default: 3)
:認爲檢測失敗幾回爲宕機,默認3次一些返回值的說明:
0
:容器成功是健康的,隨時可使用1
:不健康的容器沒法正常工做2
:保留不使用此退出代碼在構建鏡像時,指定一些參數,例如:
FROM centos:6
ARG user # ARG user=root
USER $user
複製代碼
這時,咱們在docker build時能夠帶上自定義參數user了,以下所示:
docker build --build-arg user=DuebassLei Dockerfile .
複製代碼