Docker Dockerfile详解
在前面的一篇文章中,我们介绍了如何构建镜像,其中使用Dockerfile文件是最为常用的一种方式,在本篇文章中我们将详细介绍Dockerfile构建镜像的过程以及其命令参数等等。
首先我们来看看Dockerfile构建镜像的过程:
- 从基础镜像运行一个容器
- 执行一条指令对容器做出修改
- 执行类似docker commit的操作,提交一个新的镜像层
- 再基于刚提交的镜像运行一个容器
- 执行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的目录下:
那要让它实现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的目录下:
至此,本篇文章讲述完Dockerfile文件构建镜像的过程以及它的主要指令,如果有任何问题欢迎留言讨论,谢谢!!!
上一篇: kubernetes(k8s) 之pod的生命周期(init容器和探针)
下一篇: kubernetes(k8s) 学习 (十一) k8s存储之 持久卷(PV) (静态 PV+nfspv的创建)
推荐阅读
-
docker之docker-machine安装
-
docker部署consul集群
-
Docker Dockerfile详解
-
Docker入门及安装(一)
-
Kubernetes K8S之Pod 生命周期与init container初始化容器详解
-
win10 docker安装mysql5.7
-
docker环境多种平台上的自动化安装---docker-machine(docker machine简介,创建docker machine)
-
MySQL的binlog日志详解
-
iostream 缓冲区详解(cin和cout)
-
Ext renderer参数详解 博客分类: webExtJs Extrenderer