镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
命令 | 作用 |
---|---|
FROM image:tag
|
指定基础镜像,有点继承的意思 |
MAINTAINER user_name
|
声明镜像的创建者 |
ENV key value
|
设置环境变量,可以设置多条,比如 ENV VERSION=1.0 |
RUN command
|
核心命令,多个命令用&&连接即可 |
ADD source_dir/file dest_dir/file
|
将宿主机的文件负复制到容器内,如果是一个压缩文件,将会自动解压缩 |
COPY source_dir/file dest_dir/file
|
和ADD命令类似,但是不能自动解压缩 |
WORKDIR path_dir
|
指定当前的工作目录,由于分层的概念,每一个命令的工作目录都不同,因此需要使用该命令显示指定工作目录 |
CMD args | 在构建容器的时候使用,会docker run 后的args覆盖 |
ENTRYPOINT args | 和CMD相似,但是不会被docker run后的args覆盖 |
VOLUME | 将本地文件夹挂载到容器中 |
vim /etc/docker/daemon.json
{ "registry-mirrors":["https://rxx4pnmv.mirror.aliyuncs.com"] }
Dockerfile
# 初始镜像,默认拉去lastest的 FROM centos # 指定镜像的构建者 MAINTAINER chenjiabing666 # 切换工作目到usr,这个是容器中的目录 WORKDIR /usr # 新建 /usr/local/java目录 RUN mkdir /usr/local/java # 添加本地的jdk到容器中并且解压 ADD jdk-8u172-linux-x64.tar.gz /usr/local/java/ # 设置环境变量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_181 ENV CLASSPATH $JAVA_HOME/lib;$JAVA_HOME/jre/lib ENV PATH $PATH:$JAVA_HOME/bin
docker build -t jdk8 . docker run --name jdk -di jdk8