title: Dockerfile定制镜像
date: 2018-06-28 21:54:39
tags: -Docker
-nodejs
thumbnail: http://blogpic.blackgan.cn/blog/image/9.jpg
使用Dockerfile定制镜像
在之前的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件,如果我们把每一层的修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是Dockerfile。
Dockerfile是一个文本文件,其中包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就相当于描述该层应当如何构建。
Dockerfile中常用指令
在一个空白目录中,建立一个文本文件,名为Dockerfile:1
2FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
FROM指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。FROM就是指定基础镜像。
FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
除了选择现有的镜像为基础镜像外,Docker还存在一个特殊的镜像,名为scratch。这个镜像是虚拟的存在。表示一个空白的镜像。
MAINTAINER
指定创建镜像的用户,同时也会将该信息写入镜像中的author属性中
ARG
用以定义构建时需要的参数,例如ARG a或者ARG a=123
ENV
用户定义镜像的环境变量1
2//例如:
ENV MYDIR /mydir
通过ENV定义的环境变量,可以在后面的所有指令中使用。
WORKDIR
指定容器的一个目录,容器启动时执行的命令会在该目录下执行,相当于设置了容器的工作目录
COPY
从Docker build所在的主机上读取资源并复制到镜像中1
2//复制当前文件夹下的所有资源到对应的容器下的目录资源
COPY . /usr/src/app
Add
和COPY指令的格式和性质基本是一致的,但是在COPY的基础上增加了一些功能。可以支持通过url来复制。
EXPOSE
容器内部服务开启的端口,主机上还得在启动container时,做host-container的端口映射。
CMD
容器启动命令,容器就是进程,既然是进程,那么在启动容器的时候,需要制定所运行的程序和参数,CMD指令就是用于指定默认的容器主进程的启动命令的。
RUN执行命令
RUN指令是用来执行命令行命令的。由于命令行的强大能力,RUN指令在定制镜像是最常用的指令。
Dockfile中每个指令都会建立一层,RUN也不例外。每一个RUN的行为,就和手动建立镜像的过程一样,新建立一层,在其上执行这些命令,执行结束之后,commit这一层的修改,构成新的镜像。
同时我们也需要注意,Unions FS是有最大层数限制的,比如 AUFS,曾经是最大不得超过 42 层,现在是不得超过127 层。
在写Dockerfile的时候,要经常提醒自己,这并不是在写Shell脚本,而是在定义每一层该如何构建。
docker build构建镜像
使用docker build命令构建镜像,其格式为1
docker build [选项] <上下文路径>
镜像构建上下文(Context)
Docker 在运行时分为Docker引擎(服务端守护进程)和客户端工具。而如docker命令这样的客户端工具,则是通过Docker引擎提供的一组REST API来与Docker 引擎交互,从而完成各种功能。
docker build命令构建镜像,其实也并非在本地进行构建,而是在服务器,也就是Docker引擎中构建的。那么在这种C/S架构中,如何才能让服务器获得本地文件呢?
这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径, docker
build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样
Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
Context上下文详解: