使用dockerfile定制镜像

下面先来尝试一个nginx镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

空目录下新建一个名为Dockerfile的文件,并且添加以下内容

1
2
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

1
RUN 命令行命令

exec格式

1
RUN ["可执行文件","参数1","参数2"]

dockerfile的指令每执行一次都会在docker上新建一层,所以过多无意义的层,会造成镜像过度膨大,比如

1
2
3
4
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://redis网址"
RUN tar -xvf redis.tar.gz

以上会创建3层镜像,可以简化为以下形式

1
2
3
4
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "网址" \
&& tar -xvf redis.tar.gz

这样只会创建一层镜像。

开始构建镜像

在dockerfile文件的存放目录下,执行构建动作。

比如构建一个nginx:v3

1
docker build -t nginx:v3 .

.是指上下文路径,是指docker在构建镜像时有时候想要使用到本机文件(比如复制),docker build得知这个路径后,会将路径下的所有内容打包。

注:docker的运行模式是c/s,docker是s,我们是c,实际的构建过程是在docker引擎下完成的,所以这个时候无法用到我们本机的文件,这就需要把我们本机的指定目录下的文件一起打包提供给docker使用。

指令详解:

COPY

复制指令,从上下文目录中复制文件或者 目录容器里指定路径

1
2
COPY 源路径1 源路径2 目标路径
COPY ["源路径1","源路径2","目标路径"]

比如

1
COPY hom?.txt /mydir/

CMD

1
2
3
CMD shell命令
CMD ["可执行文件或命令","param1","param2"]
CMD ["param1", "param2"]为ENTRYPOINT指定的程序提供参数

ENTRYPOINT

类似cmd,但是不会被docker run的命令行参数指定的指令所覆盖。而且这些命令行参数会被当作参数送给entrypoint指定的程序,就像上面cmd第三行。

1
2
3
4
FROM nginx

ENTRYPOINT ["nginx","-c"]#定参
CMD ["/etc/nginx/nginx.conf"]#变参

1.不传参运行

1
docker run nginx:test

容器会默认运行以下命令

1
nginx -c /etc/nginx/nginx.conf

2.传参运行。