Docker 镜像与制作(二)Dockerfile介绍

Dockerfile介绍

DockerFile 可以说是一种可以被 Docker 程序解释的脚本, DockerFile 是由一条条的命令组成的,每条命令对应 linux 下面的一条命令, Docker 程序将这些DockerFile 指令再翻译成真正的 linux 命令,其有自己的书写方式和支持的命令, Docker 程序读取 DockerFile 并根据指令生成 Docker 镜像,相比手动制作镜像的方式, DockerFile 更能直观的展示镜像是怎么产生的,有了 DockerFile,当后期有额外的需求时,只要在之前的 DockerFile 添加或者修改响应的命令即可重新生成新的 Docke 镜像,避免了重复手动制作镜像的麻烦。

FROM 指定基础镜像

定制镜像,需要先有一个基础镜像,在这个基础镜像上进行定制。FROM 就是指定基础镜像,必需放在有效指令的第一行。

怎么选择合适的镜像呢?官方有nginx、redis、mysql、httpd、tomcat等服务类的镜像,也有操作系统类,如:centos、ubuntu、debian等。

例:

FROM centos:latest

MAINTAINER 指定维护者信息

格式

MAINTAINER <name>

RUN 执行命令

RUN 指令是用来执行命令的。shell命令功能丰富,所以RUN 指令经常用来调用shell指令。

格式

RUN <command> 
# 或 
RUN ["executable", "param1", "param2"]

第一种不用多说,第二种方式:RUN ["/bin/bash", "-c", "echo hello world"]
Dockerfile中,每一个指令都会创建一层镜像,RUN写多了,创建的镜像层数就会增多,所以一般RUN 指令的写法为

RUN yum -y install epel-release \
      && yum -y install nginx \
      && rm -rf /usr/share/nginx/html/*
      && echo "<h1> docker test nginx </h1>" > /usr/share/nginx/html/index.html

CMD 启动容器时执行的命令

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

支持三种格式

# 使用 exec 执行,推荐方式;
CMD ["executable","param1","param2"] 

# 在 /bin/sh 中执行,提供给需要交互的应用;
CMD command param1 param2 

# 提供给 ENTRYPOINT 的默认参数;
CMD ["param1","param2"] 

如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。

扫描二维码关注公众号,回复: 9549036 查看本文章

EXPOSE 分配端口号

告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口

格式

EXPOSE <port> [<port>...]

ENV 环境变量

指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。

格式

ENV <key> <value>

例如

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD 复制/解压

该命令将复制指定的 <src> 到容器中的 <dest>。 其中<src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

格式

ADD <src> <dest>

COPY 复制

复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>

格式

COPY <src> <dest>

当使用本地目录为源目录时,推荐使用 COPY

ENTRYPOINT 容器启动后执行的命令

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

两种格式:

ENTRYPOINT ["executable", "param1", "param2"]

# shell中执行
ENTRYPOINT command param1 param2

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效

VOLUME 挂载点

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

格式

VOLUME ["/data"]

USER 指定用户名

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。

格式

USER daemon。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,
例如:

RUN groupadd -r postgres && useradd -r -g postgres postgres

要临时获取管理员权限可以使用 gosu,而不推荐 sudo。

WORKDIR 工作目录

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。

格式

WORKDIR /path/to/workdir。

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd

则最终路径为 /a/b/c。

ONBUILD

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

格式

ONBUILD [INSTRUCTION]

例如,Dockerfile 使用如下的内容创建了镜像 image-A。

...
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
...

如果基于 image-A 创建新的镜像时,新的Dockerfile中使用 FROM image-A指定基础镜像时,会自动执行ONBUILD 指令内容,等价于在后面添加了两条指令。

FROM image-A

#Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild

构建镜像

格式

docker build [选项] 路径

-t选项,指定镜像的标签信息

docker build -t nginx:v1 /usr/local/src/

构建时,目录除了构建所需要的文件,不要有其它文件

发布了254 篇原创文章 · 获赞 346 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_42758707/article/details/100810986