未分类


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
2
FROM 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上下文详解:

分享到