dockerfile是一种文本格式的文件,用于描述如何构建Docker镜像。在Dockerfile中,我们可以定义基础镜像、安装依赖、添加文件等操作,最终生成一个可以直接运行的容器镜像。
Dockerfile的原理可以分为以下几个步骤:
- FROM
FROM 是 Dockerfile 中的第一个指令,用于指定基础镜像名称以及其版本信息。一切都是从一个基础镜像开始构建的。FROM 接收一个参数,表示所使用的基础镜像名称。
示例:
FROM ubuntu:18.04
#意思是以一个 Ubuntu 18.04 作为当前镜像的基础镜像构建。- MAINTAINER
MAINTAINER 指令用于指定镜像的维护者信息。这是一个可选项,一般也是我们不加的,因为这个用处不大。
示例:
MAINTAINER someone@example.com- RUN
RUN 指令用于在 Docker 容器中运行指定的命令。可以使用 RUN 运行各种命令,比如 apt-get 安装、pip 安装等等。最好将 apt-get 和 pip 安装命令放在同一行中,以免出现多个镜像层。
示例:
RUN apt-get update && apt-get install -y
nginx
php-fpm
php-mysql- USER
USER 指令用于设置在容器中运行命令时的用户身份(用户名或用户 ID)。
示例:
USER someone
#切换为某个用户- ADD / COPY
ADD 和 COPY 指令用于将 中的文件或目录复制到容器中的 。两者的细微区别在于,ADD 指令支持更多的功能,例如获取网络资源并自动解压缩压缩包,由此可见copy添加文件的体积会更小,所以日常使用会更多。
示例:
COPY ./app /app
ADD ./app.tar.gz /
日常工作常常以下指令组合- CMD
CMD 指令用于在启动容器时执行指定的命令。一个 Dockerfile 文件只能包含一个 CMD 指令,该指令可以被覆盖(强制替换),只运行最后一条,或者docker run运行时候的参数覆盖,和run的区别是run是docker build 构建镜像阶段执行操作的一条指令,cmd是启动容器后调用,用于docker run阶段运行。
示例:
CMD [“nginx”, “-g”, “daemon off;”]
#这里运行了一个 nginx 服务器- ENTRYPOINT
ENTRYPOINT 指令与 CMD 极为相似,但是它不会被覆盖,而是始终会运行。ENTRYPOINT 与 CMD 指令的一个重要区别是,每次运行容器时,都会将 CMD 参数附加到 ENTRYPOINT 参数上,比如如下图,如果需要更改nginx配置文件路径,在docker run时候指定路径即可。
示例:
ENTRYPOINT [“ping”]
CMD [“-c”, “5”, “localhost”]
#运行时默认运行 ping localhost 命令,该命令会ping 5次localhost。- ENV
ENV 指令用于设置环境变量。它可以设置一个或多个键值对,这些键值对可以在容器运行时被使用。可以用 $key 格式来使用值。
示例:
ENV MY_NAME=“Alice”
MY_EMAIL=“alice@example.com”- EXPOSE
EXPOSE 指令用于指定容器应该监听哪些网络端口。它不会创建端口映射,只是声明容器应该监听哪些端口。
示例:
EXPOSE 80/tcp- WORKDIR
WORKDIR 指令用于设置工作目录,相当于切换到该目录。一旦指定了一个工作目录,后续的指令都将在该目录下执行。
示例:
WORKDIR /app- VOLUME
VOLUME 指令用于在运行时创建挂载点(也称为数据卷)。数据卷可以是主机文件系统中的目录,也可以是其他容器中的目录,可以把docker中的数据实时挂载到本地的目录中,避免误删目录造成数据丢失。可以通过docker inspect [image] 查看容器的详细信息,找到mounts节点,可以找到本地的数据的挂在的目录。
示例:
VOLUME /app/logs
Dockerfile 创建完成后,可以使用 docker build 命令根据 Dockerfile 构建一个镜像。
Docker build常用的指令包括两个参数:
◆ -t 指定镜像的名字,
◆ -f 显示指定构建镜像的 Dockerfile 文件
Dockerfile 是一种文本文件,用于定义 Docker 镜像的构建过程。当我们运行 docker build 命令时,Docker 会依据 Dockerfile 中的指令来构建镜像。
构建 Docker 镜像的主要步骤如下: