欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker Dockerfile详解

程序员文章站 2024-03-25 16:07:46
...

在前面的一篇文章中,我们介绍了如何构建镜像,其中使用Dockerfile文件是最为常用的一种方式,在本篇文章中我们将详细介绍Dockerfile构建镜像的过程以及其命令参数等等。

首先我们来看看Dockerfile构建镜像的过程:

  1. 从基础镜像运行一个容器
  2. 执行一条指令对容器做出修改
  3. 执行类似docker commit的操作,提交一个新的镜像层
  4. 再基于刚提交的镜像运行一个容器
  5. 执行Dockerfile的下一条指令,直至所有的指令执行完毕

从上述构建镜像的过程中我们知道使用Dockerfile的过程中会构建多个中间镜像。这样给我带来了极大的好处,当构建镜像的过程中如果出错就可以使用中间层镜像进行调试。

在了解了Dockerfile构建镜像的整个过程之后,下面我们来看看Dockerfile文件的格式以及一些主要指令。

在Dockerfile文件中,可以使用“#”开头作为注释。其中指令全部大写,格式如下:

INSTRUCTION argument

在Dockerfile中主要有以下指令:

FROM
RUN
MAINTAINER
EXPOSE
CMD
ENTRYPOINNT
ADD
COPY
VOLUME
WORKDIR
ENV
USER
ONBUILD

FROM指令用来指定基础镜像,是指已经存在的镜像,必须是第一条非注释指令。

MAINTAINER <name>指令用来指定镜像的作者的信息。

RUN指令用来指定当前镜像中运行的命令,它有两种运行格式:

RUN <command>(shell模式)
RUN ["executable","param1","param2"] (exec模式)

EXPOSE <port> [<port>...]指令用来指定运行该镜像的容器使用的端口。(需要主要的是Docker不会自动打开该端口,所以运行命令时需要我们使用-p参数来打开)。

CMD指令是用于在容器运行时执行命令的,如果在容器运行时指定命令,将会覆盖这里设置的值。它有下面两种设置方式:

CMD ["executable","param1","param2"]  (exec模式)
CMD command param1 param2 (shell模式)

如下例所示:

CMD ["/usr/sbin/nginx","-g","daemon off;"]

ENTRYPOINT指令和CMD类似,但是在容器运行时指定命令并不会覆盖设置的值。它也有两种运行模式:

ENTRYPOINT ["executable","param1","param2"]  (exec模式)
ENTRYPOINT command param1 param2 (shell模式)

如下例所示:

ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]

COPY以及ADD的指令用于将一个文件拷贝到使用Dockerfile文件构建的镜像中,如使用下面命令将一个网页复制到nginx的根目录下:

COPY index.html /usr/share/nginx/html

如果只是单纯的复制功能,Docker推荐使用COPY指令,ADD指令包含了类似tar的解压功能。

WORKDIR指令用来指定Docker的工作目录。

ENV <key> <value>指令用来设置环境变量。

USER指令用来指定运行镜像会用什么样的用户来运行。

ONBUILD是指镜像触发器,当一个镜像被其他镜像作为基础镜像时执行
如Dockerfile文件的内容如下所示:

FROM ubuntu:14.04
MAINTAINER ljcan "aaa@qq.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
#CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
ONBUILD COPY index.html /usr/share/nginx/html

接着我们构建一个镜像:

docker build -t="test_onbuild" .

然后运行容器,如下图所示,可以看到docker并没有将index.html拷贝到nginx的目录下:
Docker Dockerfile详解
那要让它实现COPY功能该怎么做呢?我们修改脚本:

#刚刚创建的镜像作为基础镜像
FROM test_onbuild
MAINTAINER ljcan "aaa@qq.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
#CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
ONBUILD COPY index.html /usr/share/nginx/html

然后重新构建镜像:

docker build -t="test_onbuild1" .

然后运行容器,就可以看到已经将index.html拷贝到nginx的目录下:
Docker Dockerfile详解
至此,本篇文章讲述完Dockerfile文件构建镜像的过程以及它的主要指令,如果有任何问题欢迎留言讨论,谢谢!!!