Docker容器系列文章|Docker容器技術之Docker file

以前介紹過相關的文章以下:html

Docker容器系列文章|Docker技術入門(一)java

Docker容器系列文章|Docker技術入門(二)linux

Docker容器系列文章|這20個Docker Command,有幾個是你會的?web

Docker file簡單介紹

Docker可使用Dockerfile的內容來自動構建鏡像。Dockerfile也是一個文件,其中有建立鏡像、運行指令等一系列的命令,且每行只支持一個運行命令。docker

Docker file分爲四部分組成:

  • 基礎鏡像信
  • 維護者信息
  • 鏡像操做指令
  • 容器啓動時執行指令

dockerfile指令忽略大小寫,建議大寫,#做爲註釋,每行只支持一條指令,指令能夠帶多個參數。apache

dockerfile指令有:vim

  • 構建指令:用於構建image,其指定的操做不會在運行image的容器中執行。
  • 設置指令:用於設置image的屬性,其指定的操做會在運行image的容器中執行。

Dockerfile指令

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]

經過Dockerfile快速構建鏡像

接下來,咱們經過構建一個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, 結果以下:

clipboard.png

clipboard.png

相關文章
相關標籤/搜索