###指定基礎鏡像第一條指令。scratch是虛擬的鏡像,表示一個空白的鏡像。 FROM centos:7.5
###維護人的信息(不推薦使用) MAINTAINER jockming.com ###推薦使用LABEL來指定鏡像做者 LABEL maintainer="jockming.com"
###在構建鏡像時,指定一些參數 FROM centos:7.5 ###ARG user=root ARG user USER $user ###在執行docker build時就能夠帶上自定義參數user了 docker build --build-arg user=root Dockerfile .
###爲RUN、CMD和ENTRYPOINT執行Shell命令指定運行用戶 USER <user>[:<usergroup>] USER <UID>[:<UID>] USER root
###爲RUN、CMD、ENTRYPOINT以及COPY和AND設置工做目錄 WORKDIR /data
###執行命令 ###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 ["<源路徑1>",... "<目標路徑>"]
###<源路徑> 能夠是多個、以及使用通配符,通配符規則知足Go的filepath.Match 規則,如:COPY hom* /mydir/ COPY hom?.txt /mydir/
###<目標路徑>使用 COPY 指令,源文件的各類元數據都會保留。好比讀、寫、執行權限、文件變動時間等。
###拷貝文件或目錄到鏡像中,用法同ADD,只是不支持自動下載和解壓
COPY ./start.sh /start.sh
###高級複製文件,文件會自動解壓,容器內不保留原文件 ###ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /<源路徑> 能夠是一個 URL ,下載後的文件權限自動設置爲 600 。 ADD <src>...<dest> ADD html.tar.gz /var/www/html ADD https://xxx.com/html.tar.gz /var/www/html
###設置容器內環境變量 ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/java/jdk1.8.0_241
###指定容器掛載點到宿主機自動生成的目錄或其餘容器 ###目的是爲了數據持久化,以及數據共享等 ###經過 VOLUME 指令建立的掛載點,沒法指定主機上對應的目錄,是自動生成的 VOLUME ["/var/lib/mysql","..."]
###暴露端口 EXPOSE 80 443 8080
###告訴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:保留不使用此退出代碼
###啓動容器時執行的Shell命令,同CMD相似,只是由ENTRYPOINT啓動的程序不會被docker run命令行指定的參數所覆蓋,並且,這些命令行參數會被看成參數傳遞給ENTRYPOINT指定指定的程序,例如: ENTRYPOINT ["/bin/bash", "-C", "/start.sh"] ENTRYPOINT /bin/bash -C '/start.sh'
PS:Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅有最後一個會生效。
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
touch Dockerfile
chmod +x 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
###進入到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
docker ps -a
docker logs -f 容器ID