在之前的学习中,我们曾经了解过,如何使用Dockerfile进行镜像的构建:
《【Docker学习总结】10.Docker-构建镜像》
上篇学习总结中,第2部分介绍了Dockerfile以及如何编写一个构建支持Nginx的镜像的Dockerfile指令文件。
本篇我们就来学习,Dockerfile都支持哪些指令。
一、指令格式
Dockerfile的指令包含另种格式,分别是“注释”和“指令”:
# Comment
INSTRUCTION agrument
其中注释前面以“#”号开头,后面跟着注释信息;指令是大写的指令名称,加小写的指令参数。
我们拿《【Docker学习总结】10.Docker-构建镜像》中编写过的Dockerfile指令来分析:
#指定使用那个基础镜像
FROM centos
MAINTAINER jackzhucoder jackzhucoder@126.com
LABEL Discription="基于centos的nginx镜像" version="1.0"
WORKDIR /usr/local/src
RUN yum install -y wget
RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz
RUN tar -zxvf nginx-1.8.0.tar.gz
WORKDIR nginx-1.8.0
#安装nginx所依赖的包
RUN yum -y install gcc-c++
RUN yum -y install pcre pcre-devel
RUN yum -y install zlib zlib-devel
RUN yum -y install openssl openssl-devel libssl-dev
RUN ./configure
RUN make
RUN make install
EXPOSE 80
上面的指令分别包含了2行注释,和16行指令。这16行指令分别包含了下面6种指令:
● FROM
● MAINTAINER
● RUN
● EXPOSE
● LABEL
● WORKDIR
下面我们详细介绍一下上面的指令。
二、指令介绍
(1)FROM
FROM指令包含了两种格式的参数:
● FROM <image>
● FROM <image>:<tag>
第一种是镜像名,第二种是镜像名:标签名。
通过FROM指令指定的镜像名,要满足以下标准:
● 已经存在的镜像
● 该镜像是基础镜像
● 必须是第一条非注释指令
(2)MAINTAINER
格式:MAINTAINER <name>
MAINTAINER指令用来指定镜像的作者信息,包含镜像的所有者和联系信息。如同commit的“-a”属性。
(3)RUN
在Dockerfile中最重要的指令就是“RUN”指令。
RUN指令指定了当前镜像中运行的命令,它包含了两种格式:
● RUN <command> (shell模式)
● RUN ["executable","param1","param2"] (exec模式)
在shell模式下, RUN指令是由“/bin/sh -C command”的形式来执行命令,就像下面的形式:
RUN echo hello
在exec模式下,RUN指令可以用来指定其它形式的shell来运行指令。如下所示:
RUN ["/bin/bash","-c","echo hello"]
前面我们讲过镜像的分层概念,每一个RUN指令都会在当前镜像的上层创建一个新的镜像,来运行指定的命令。
(4)EXPOSE
格式:EXPOSE <port>[<port>...]
EXPOSE指令用来指定运行该镜像的容器使用的端口。它可以指定一个或多个端口,在一个Dockerfile文件中,可以使用多个EXPOSE命令。
虽然我们在镜像构建中,指定了暴露的端口号,但是在容器运行时,仍需要手动指定容器的端口映射,如:
docker run -p 80 -d jackzhucoder/df_test1 nginx -g "deamon off;"
也就是说,在Ddockerfile中,使用EXPOSE指令来指定的端口,只是告诉Docker该容器内的应用程序会使用特定的端口,但是出于安全的考虑,Docker并不会自动的打开端口,而是需要在使用时在run命令中添加对端口的映射指令。
(5)LABEL
LABEL指令用于设置构建的镜像的标签信息,可以是任何的标签对,例如指定镜像的基本描述信息,以及版本信息。
使用“docker inspect 镜像名”可查看镜像的相关信息:
(6)WORKDIR
WORKDIR本身的意思是“工作目录”,其作用是在从镜像创建一个新容器时,在容器内部设置工作目录。我们可以使用这个指令在构建中为后续的指令指定工作目录。
需要注意的是,WORKDIR通常会使用绝对路径,如果使用了相对路径,那么工作路径会在最后的绝对路径的下面一直传递下去。例如像下面这种情况:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
其中的a和b文件夹就是在绝对路径“/a”文件夹下的。
当然,Dockerfile还有其它的重要指定,下一篇我们继续学习剩余的Docker指令。
参考资料:
《极客学院Docker学习》教学视频