简述
Docker 镜像的定制实际上就是定制每一层所添加的配置、文件。我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,就可以解决很多类似于无法重复、镜像构建透明性的问题,这个脚本就是 Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建
本文还是以 tomcat 镜像为基础,通过Dockerfile来定制一个属于自己的 tomcat 镜像
常用Dockerfile命令
命令 | 作用 |
---|---|
FROM | 指定基础镜像 |
RUN | 执行命令 |
COPY | 将从构建上下文目录中 源路径 的文件或目录复制到新的一层的镜像内的 目标路径 位置 |
ADD | ADD 指令和 COPY 的格式和性质基本一致,如果 源路径 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 目标路径 去 |
CMD | 与RUN指令相似,也是执行命令,有shell和exec两种格式 |
EXPOSE | 用于暴露容器运行时的端口号 |
WORKDIR | 指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录 |
除了了解一些常用的 Dockerfile 命令之外,还有一点我们需要明白的是 镜像构建上下文(Context)
首先我们要理解 Docker 定制镜像的工作原理。Docker 在运行时分为 Docker 引擎(服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API,而像 Docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,完成各种操作。因此,虽然表面上我们好像是在本机执行各种 Docker 功能,但是实际上一切都是使用的远程调用形式在服务端完成。
当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、ADD 指令等。而 Docker 通过命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。
所以,这就需要用户在构建镜像的时候,指定构建镜像上下文的路径,Docker 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
Dockerfile定制镜像
- 从docker官网中拉取tomcat镜像
docker pull tomcat
- 进入 /usr/local/ 目录下创建文件夹
mkdir -p docker/tomcat
cd docker/tomcat
- 书写Dockerfile文件
vi Dockerfile
FROM tomcat
WORKDIR /usr/local/tomcat/webapps/ROOT/
RUN rm -fr *
RUN echo "Hello Docker" > /usr/local/tomcat/webapps/ROOT/index.html
- 构建镜像 ( .代表上下文 )
docker build -t mytomcat .
通过上面4个步骤,我们可以通过 docker images 查看本机上的所有镜像,可以发现多了一个 mytomcat 镜像,说明我们 Dockerfile 定制镜像已经成功了!
可以启动这个tomcat看看在构建镜像是写入 Hello Docker 的页面是否存在
docker run -p 8080:8080 mytomcat