以前介紹過相關的文章以下:html
Docker容器系列文章|Docker技術入門(一)java
Docker容器系列文章|Docker技術入門(二)linux
Docker容器系列文章|這20個Docker Command,有幾個是你會的?web
Docker可使用Dockerfile的內容來自動構建鏡像。Dockerfile也是一個文件,其中有建立鏡像、運行指令等一系列的命令,且每行只支持一個運行命令。docker
dockerfile指令忽略大小寫,建議大寫,#做爲註釋,每行只支持一條指令,指令能夠帶多個參數。apache
dockerfile指令有:vim
Dockerfile指令一共有如下種:segmentfault
一、FROM
用來指定基礎鏡像,而後經過在基礎鏡像上構建新的鏡像,基礎鏡像通常有遠程或本地倉庫。而且Dockerfile文件第一行必須的FROM指令,若是一個Dockerfile須要建立多個鏡像,可使用多個FROM指令。centos
#具體使用用法以下: FROM < image_name > #默認是latest版本 FROM <image:version> #指定版本
二、MAINTAINER
指定鏡像的建立者信息瀏覽器
#具體使用法以下: MAINTAINER < name >
三、RUN
運行全部基礎鏡像能支持的命令,一樣也可使用多條RUN指令,可使用來換行
#具體使用法以下: RUN < command > RUN ["executable", "param1", "param2" ... ] (exec form)
四、CMD
用於容器啓動時的指定操做,它能夠是命令,也能夠是腳本,但只執行一次,若是有多少默認只會執行最後一個。
#具體使用法以下: CMD [「executable」 ,」Param1」, 「param2」]使用exec執行,推薦 CMD command param1 param2,在/bin/sh上執行 CMD [「Param1」, 「param2」] 提供給ENTRYPOINT作默認參數。
五、EXPOSE
指定容器的端口映射(容器與物理機),運行容器時加上-p參數指定EXPOSE設置的端口。EXPOSE能夠設置多個端口號,相應地運行容器配套屢次使用-p參數。能夠經過docker port +容器須要映射的端口號和容器ID來參考宿主機的映射端口。
#具體使用法以下: EXPOSE <port> [port1 , port2 ............]
六、ENV
在鏡像中用於設置環境變量的,而後RUN命令可使用此設置的環境變量,在容器啓動後也以經過docker inspect查看環境變量,能夠經過docker run --env key=value來設置或修改環境變量。
#具體使用法以下: ENV <key> <value> ENV JAVA_HOME /usr/local/jdk
七、ADD
複製指定的源文件、目錄、URL到容器的指定目錄中。全部拷貝到container中的文件和文件夾權限爲0755,uid和gid爲0。
若是源是一個目錄,那麼會將該目錄下的全部文件添加到container中,不包括目錄;
若是源文件是可識別的壓縮格式,則docker會幫忙解壓縮(注意壓縮格式);
若是源是文件且目標目錄中不使用斜槓結束,則會將目標目錄視爲文件,源的內容會寫入目標目錄;
若是源是文件且目標目錄中使用斜槓結束,則會源文件拷貝到目標目錄下。
#具體使用法以下: ADD <源> <目標>
八、COPY
複製本地主機的源(默認爲Dockerfile所在的目錄)到容器中的目標中,目標路徑不存在時會自動建立。
#具體使用法以下: COPY <源> <目標> COPY web/index.html /var/web/
路徑必須是絕對路徑,若是不存在,會自動建立對應目錄
路徑必須是Dockerfile 所在路徑的相對路徑
若是是一個目錄,只會複製目錄下的內容,而目錄自己則不會被複制
九、ENTRYPOINT
指定容器啓動後執行的命令,多行只執行最後一行。而且不可被docker run提供的參數覆蓋。
#具體使用法以下: ENTRYPOINT "command" "param1" "param2"
十、VOLUME
建立一個能夠從本地主機或其它容器掛載的掛載點,通常用於存放數據。與docker run -v也能夠實現此功能。
#具體使用法以下: VOLUME [directory_name] VOLUME /docker_data
十一、USER
指定容器運行時使用的用戶或UID,後面RUN、CMD、ENTRYPIONT都會使用此用戶來運行命令。
#具體使用法以下: USER [username/uid]
十二、WORKDIR
指定RUN、CMD、ENTRYPIONT指定的命令的運行目錄。可使用多個WORKDIR指令,後續參數若是是相對路徑,則會基於以前的命令指定的路徑。如:WORKDIR /data WORKDIR work。最終的路徑就是/data/work。path路徑也能夠是環境變量。
#具體使用方法以下: WORKDIR [path]
1三、ONBUILD
配置當前所建立的鏡像做爲其它新建立鏡像的基礎鏡像時,所執行的操做指令。就是,這個鏡像建立後,若是其它鏡像以這個鏡像爲基礎,會先執行這個鏡像的ONBUILD命令。
#具體使用法以下: ONBUILD [INSTRUCTION]
接下來,咱們經過構建一個Tomcat鏡像,來演示Dockerfile的使用方法,前提是安裝Docker環境,如何安裝Docker環境就不在此贅述了。請猛戳下面的文字:
[root@master tomcat]# ll 總用量 190504 -rw-r--r-- 1 root root 9552281 6月 7 15:07 apache-tomcat-8.5.31.tar.gz -rw-r--r-- 1 root root 32 7月 3 09:41 index.jsp -rw-r--r-- 1 root root 185515842 9月 20 2017 jdk-8u144-linux-x64.tar.gz [root@master tomcat]# cat index.jsp welcome to mingongge's web site [root@master tomcat]# pwd /root/docker/tomcat [root@master tomcat]# vim Dockerfile #config file start# FROM centos MAINTAINER mingongge <微信公衆號:民工哥技術之路> #add jdk and tomcat software ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-8.5.31.tar.gz /usr/local/ ADD index.jsp /usr/local/apache-tomcat-8.5.31/webapps/ROOT/ #config java and tomcat ENV ENV JAVA_HOME /usr/local/jdk1.8.0_144 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.31/ ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin #config listen port of tomcat EXPOSE 8080 #config startup command of tomcat CMD /usr/local/apache-tomcat-8.5.31/bin/catalina.sh run #end of config-file#
構建過程
[root@master tomcat]# docker build -t tomcat-web . #這個.不用註釋了吧相信懂的人天然懂的 Sending build context to Docker daemon 195.1 MB Step 1/11 : FROM centos ---> 49f7960eb7e4 Step 2/11 : MAINTAINER mingongge <微信公衆號:民工哥技術之路> ---> Running in afac1e218299 ---> a404621fac22 Removing intermediate container afac1e218299 Step 3/11 : ADD jdk-8u144-linux-x64.tar.gz /usr/local/ ---> 4e22dafc2f76 Removing intermediate container b1b23c6f202a Step 4/11 : ADD apache-tomcat-8.5.31.tar.gz /usr/local/ ---> 1efe59301d59 Removing intermediate container aa78d5441a0a Step 5/11 : ADD index.jsp /usr/local/apache-tomcat-8.5.31/webapps/ROOT/ ---> f09236522370 Removing intermediate container eb54e6eb963a Step 6/11 : ENV JAVA_HOME /usr/local/jdk1.8.0_144 ---> Running in 3aa91b03d2d1 ---> b497c5482fe0 Removing intermediate container 3aa91b03d2d1 Step 7/11 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ---> Running in f2649b5069be ---> 9cedb218a8df Removing intermediate container f2649b5069be Step 8/11 : ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.31/ ---> Running in 39ef620232d9 ---> ccab256164fe Removing intermediate container 39ef620232d9 Step 9/11 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin ---> Running in a58944d03d4a ---> f57de761a759 Removing intermediate container a58944d03d4a Step 10/11 : EXPOSE 8080 ---> Running in 30681437d265 ---> b906dcc26584 Removing intermediate container 30681437d265 Step 11/11 : CMD /usr/local/apache-tomcat-8.5.31/bin/catalina.sh run ---> Running in 437790cc642a ---> 95204158ee68 Removing intermediate container 437790cc642a Successfully built 95204158ee68
經過構建的鏡像啓動容器
[root@master tomcat]# docker run -d -p 8080:8080 tomcat-web b5b65bee5aedea2f48edb276c543c15c913166bf489088678c5a44fe9769ef45 [root@master tomcat]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b5b65bee5aed tomcat-web "/bin/sh -c '/usr/..." 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp vigilant_heisenberg
瀏覽器輸入http://server-ip:8080, 結果以下: