以前介绍过相关的文章以下: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, 结果以下: