Dockerfile深度剖析

Dockerfile主要是用來定製鏡像
 

Dockerfile指令集

FROM

###指定基礎鏡像第一條指令。scratch是虛擬的鏡像,表示一個空白的鏡像。 FROM centos:7.5

MAINTAINER

###維護人的信息(不推薦使用) MAINTAINER jockming.com ###推薦使用LABEL來指定鏡像做者 LABEL maintainer="jockming.com"

ARG

###在構建鏡像時,指定一些參數 FROM centos:7.5 ###ARG user=root ARG user USER $user ###在執行docker build時就能夠帶上自定義參數user了 docker build --build-arg user=root Dockerfile .

USER

###爲RUN、CMD和ENTRYPOINT執行Shell命令指定運行用戶 USER <user>[:<usergroup>] USER <UID>[:<UID>] USER root

WORKDIR

###爲RUN、CMD、ENTRYPOINT以及COPY和AND設置工做目錄 WORKDIR /data

RUN

###執行命令 ###shell 格式: RUN <命令> ,RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ###exec 格式: RUN ["可執行文件", "參數1", "參數2"] 。run能夠寫多個,每個指令都會創建一層,因此正確寫法應該是↓ RUN buildDeps='gcc libc6-dev make' \ && apt-get update \ && apt-get install -y $buildDeps \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \ && mkdir -p /usr/src/redis \ && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ && make -C /usr/src/redis \ && make -C /usr/src/redis install \ && rm -rf /var/lib/apt/lists/* \ && rm redis.tar.gz \ && rm -r /usr/src/redis \ && apt-get purge -y --auto-remove $buildDeps

COPY

###複製文本COPY <源路徑>... <目標路徑>
###COPY ["<源路徑1>",... "<目標路徑>"]
###<源路徑> 能夠是多個、以及使用通配符,通配符規則知足Go的filepath.Match 規則,如:COPY hom* /mydir/ COPY hom?.txt /mydir/
###<目標路徑>使用 COPY 指令,源文件的各類元數據都會保留。好比讀、寫、執行權限、文件變動時間等。
###拷貝文件或目錄到鏡像中,用法同ADD,只是不支持自動下載和解壓
 
COPY ./start.sh /start.sh

ADD

###高級複製文件,文件會自動解壓,容器內不保留原文件 ###ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /<源路徑> 能夠是一個 URL ,下載後的文件權限自動設置爲 600ADD <src>...<dest> ADD html.tar.gz /var/www/html ADD https://xxx.com/html.tar.gz /var/www/html

ENV

###設置容器內環境變量 ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/java/jdk1.8.0_241

VOLUME

###指定容器掛載點到宿主機自動生成的目錄或其餘容器 ###目的是爲了數據持久化,以及數據共享等 ###經過 VOLUME 指令建立的掛載點,沒法指定主機上對應的目錄,是自動生成的 VOLUME ["/var/lib/mysql","..."]

EXPOSE

###暴露端口 EXPOSE 80 443 8080

HEALTHCHECK

###告訴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:保留不使用此退出代碼

ENTRYPOINT

###啓動容器時執行的Shell命令,同CMD相似,只是由ENTRYPOINT啓動的程序不會被docker run命令行指定的參數所覆蓋,並且,這些命令行參數會被看成參數傳遞給ENTRYPOINT指定指定的程序,例如: ENTRYPOINT ["/bin/bash", "-C", "/start.sh"] ENTRYPOINT /bin/bash -C '/start.sh' 
PS:Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅有最後一個會生效。

CMD

shell 格式: CMD <命令> exec 格式: CMD ["可執行文件", "參數1", "參數2"...] CMD ["nginx", "-g", "daemon off;"]ENTRYPOINT:入口點 同CMD,指定容器啓動程序及參數。 經過--entrypoint 參數在運行時替換。 用例一:使用CMD要在運行時從新寫命令才能追加運行參數,ENTRYPOINT則能夠運行時接受新參數。 CMD ["-C", "/start.sh"] CMD ["/usr/sbin/sshd", "-D"] CMD /usr/sbin/sshd -D

案例

在/home/software/目錄下執行

建立文件

touch Dockerfile

賦權

chmod +x Dockerfile
Dockerfile文件內容以下:
# This dockerfile uses the centos7 image # VERSION 1 - EDITION 1 # Author: jockming #指定基礎鏡像 FROM centos:7 #指定維護者信息 LABEL maintainer="jockming.com" #設置工做目錄 #WORKDIR /usr/local/tomcat8/tomcat8080 #建立目錄 RUN mkdir -p /usr/local/java/ \ && mkdir -p /usr/local/tomcat8/ #複製jdk到鏡像中 ADD jdk-8u241-linux-x64.tar.gz /usr/local/java/ #設置環境變量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_241 ENV PATH $JAVA_HOME/bin:$PATH #複製tomcat到鏡像中,ADD命令會自動解壓 ADD apache-tomcat-8.5.32.tar.gz /usr/local/tomcat8/ #刪除安裝包,更名 RUN cd /usr/local/tomcat8/ \ && mv apache-tomcat-8.5.32 tomcat8080 #複製tomcat配置到鏡像中 COPY server.xml /usr/local/tomcat8/tomcat8080/conf #設置工做目錄 WORKDIR /usr/local/tomcat8/tomcat8080/ #暴露端口 EXPOSE 8080 #啓動容器是執行的命令,"./bin"是相對於工做目錄的 ENTRYPOINT ./bin/startup.sh && tail -F ./logs/catalina.out
準備jdk安裝包和tomcat安裝包,放到這個目錄下/home/software/
準備tomcat配置文件server.xml,放到這個目錄下/home/software/

構建鏡像

###進入到dockerfile文件所在的目錄執行如下命令 ###docker build -f DockerFile路徑 -t 名稱 . docker build -f ./Dockerfile -t tomcat8:v1 .

查看鏡像

docker images

運行鏡像

docker run -itd --name=tomcat8 -p 8080:8080 \ -v /app/webapps/:/usr/local/tomcat8/tomcat8080/webapps/ \ tomcat8:v1 /bin/bash
ps:在宿主機的目錄下解壓tomcat壓縮包,把webapps目錄下的全部文件複製到這個目錄下"/app/webapps/"。
因爲在指定數據卷時"-v /app/webapps/:/usr/local/tomcat8/tomcat8080/webapps/",宿主機目錄"/app/webapps/"下沒有文件,所以容器內的"/usr/local/tomcat8/tomcat8080/webapps/"這個目錄下也就沒有文件,到時候經過瀏覽器訪問不到,會報錯:404。
容器啓動後,就能夠經過瀏覽器直接訪問tomcat的默認目錄。
瀏覽器輸入:http://IP:8080

查看容器

docker ps -a

查看啓動日誌

docker logs -f 容器ID
相關文章
相關標籤/搜索