Docker 是一种流行的容器化平台,可将应用程序和其依赖项打包到一个独立的、可移植的容器中。Dockerfile 是构建 Docker 镜像的文本文件,它包含了一系列的指令和配置,用于定义镜像的构建过程。本文将深入解释 Dockerfile 的工作原理,并介绍常用的 Dockerfile 指令和构建命令,以帮助读者更好地理解和使用 Docker。
1.Dockerfile 简介
Dockerfile 是一个文本文件,其中包含了一系列的指令和配置,用于自动化地构建 Docker 镜像。通过定义 Dockerfile,我们可以指定基础镜像、安装软件、复制文件、设置环境变量等一系列操作,以创建一个完整的容器化应用环境。
2.Dockerfile 指令解析
下面是一些常见的 Dockerfile 指令的解释和示例用法:
2.1 FROM
FROM 指令用于指定基础镜像。一个 Dockerfile 可以以 FROM 指令开始,以引入一个基础镜像作为构建环境的起点。示例:
FROM ubuntu:18.04
该指令从 Docker Hub
上拉取一个名为 "ubuntu"
的镜像,并指定标签为 "18.04"
。
2.2 RUN
RUN 指令用于在镜像中执行命令。可以使用该指令安装软件包、执行编译操作等。示例:
RUN apt-get update && apt-get install -y curl
该指令更新 apt 包管理工具的软件包列表,并安装 curl 软件包。
2.3 COPY
COPY 指令用于将文件或目录从构建环境复制到镜像中。示例:
COPY app.py /app/
该指令将构建环境中的 app.py 文件复制到镜像中的 /app/ 目录下。
2.4 ADD
ADD 指令类似于 COPY 指令,但它支持更多功能,如自动解压缩压缩包等。尽量使用 COPY 指令,除非确实需要 ADD 的高级功能。示例:
ADD archive.tar.gz /data/
该指令将构建环境中的 archive.tar.gz 压缩包复制到镜像中的 /data/ 目录下,并自动解压缩。
2.5 CMD
CMD 指令用于指定容器启动时默认执行的命令。一个 Dockerfile 中只能存在一个 CMD 指令。示例:
CMD ["python", "app.py"]
该指令在容器启动时执行 python app.py 命令。
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
2.6 ENTRYPOINT
ENTRYPOINT 指令类似于 CMD 指令,但它不会被 docker run 命令行中的参数覆盖。示例:
ENTRYPOINT ["python"] CMD ["app.py"]
该指令将 python 设置为容器的默认执行命令,并且可以通过 docker run 的参数指定要执行的 app.py 文件。
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile
构建了 nginx:test
镜像:
FROM nginx ENTRYPOINT ["nginx", "-c"] # 定参 CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行
docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)
nginx -c /etc/nginx/new.conf
2.7 ENV
ENV 指令用于设置环境变量。可以在 Dockerfile 中使用这些环境变量,并且它们会传递到容器运行时环境。示例:
ENV APP_HOME /app WORKDIR $APP_HOME
该指令设置一个名为 APP_HOME 的环境变量,并将其值设为 /app。接下来的 WORKDIR 指令将工作目录切换到环境变量 $APP_HOME 指定的路径。
2.8 ARG
ARG 指令用于定义构建参数,可以在构建镜像时传递参数。示例:
ARG VERSION RUN echo $VERSION
该指令定义了一个名为 VERSION 的构建参数,并在构建过程中输出其值。
2.9 EXPOSE
EXPOSE 指令用于声明容器运行时监听的端口。示例:
EXPOSE 8080
该指令声明容器将监听主机的 8080 端口。
2.10 WORKDIR
WORKDIR 指令用于设置工作目录。该目录将用作后续指令(如 RUN、CMD)的默认路径。示例:
WORKDIR /app
该指令将工作目录切换到 /app。
2.11 VOLUME
VOLUME 指令用于在镜像中创建一个或多个挂载点,并声明容器可以将这些挂载点暴露给主机或其他容器。示例:
VOLUME /data
该指令在镜像中创建一个名为 /data 的挂载点。
2.12 USER
USER 指令用于指定容器运行时的用户或用户组。示例:
USER nobody
该指令将容器运行时的用户设置为 "nobody"。