Dockerfile

文章目录

  • [1. 前言](#1. 前言)
  • [2. Dockerfile 指令](#2. Dockerfile 指令)
  • [3. 编写Dockerfile](#3. 编写Dockerfile)
  • [4. 最佳实践](#4. 最佳实践)

1. 前言

Dockerfile 是一种用于定义和构建 docker 镜像的文本文件。它包含一系列的指令和参数,用于描述镜像的构建过程,包括基础映像、软件包安装、文件拷贝、环境变量设置等。通过编写Dockerfile ,可以将应用程序、环境和依赖项打包成一个独立的容器镜像,使其可以在不同的环境和平台上运行,实现应用程序的可移植性和可扩展性。

Dockerfile 的基本几个包含以下几个部分:

  • 基础镜像:使用FROM指令可以指定基础镜像,在此基础镜像基础上,我们可以来开发自己的镜像。基础镜像一般包含了基础操作系统(ubuntu/centos)以及一些预装的工具与软件
  • 维护者信息:包含维护者名字,版本和时间
  • 镜像操作指令:使用一系列指令来描述构建的过程
  • 容器启动指令:使用CMD或ENTRYPOINT指令来定义容器启动时要执行的命令

镜像的构建分为三个步骤:

  • 编写dockerfile 文件
  • 使用docker build来构建镜像
  • docker run 启动与运行镜像

2. Dockerfile 指令

Dockerfile 使用#进行注释,一个Dockerfile文件就是以下指令编写而成的一个文件:

指令 描述 格式
FROM 指定基础镜像,当前新镜像是基于哪个镜像的 FROM <image>[:<tag>] [AS <name>]
MAINTAINER 镜像维护者的姓名和邮箱地址,已被官方弃用,可以使用LABEL maintainer="..."来替代 MAINTAINER <name>
LABEL 用于向 Docker 镜像添加元数据(Metadata)。这些元数据是键值对形式的标签,用于描述镜像的各个方面,例如维护者信息、版本、描述、构建日期等,可以通过docker inspect 查看标签信息 LABEL <key>=<value> <key>=<value> <key>=<value> ...
USER 指定后续指令(RUN, CMD, ENTRYPOINT)以哪个用户身份运行。为了安全,应避免使用 root 用户。
RUN 容器构建时需要运行的命令,最佳实践:将多个RUN命令用 && 连接成一个,以减少镜像层数 RUN <command>
EXPOSE 当前容器对外保留出的端口 EXPOSE <port> [<port>/<protocol>...]
WORKDIR 指定在创建容器后,终端默认登录的进来工作目录 WORKDIR /path/to/workdir
ENV 用来在构建镜像过程中设置环境变量 ENV <key>=<value> ...
ARG 设置仅在构建过程中的临时变量。容器运行时无法访问 ARG <name>[=<default value>]
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 ADD [--chown=<user>:<group>] <src>... <dest>
COPY 类似ADD,拷贝文件和目录到镜像中,但不解压 COPY [--chown=<user>:<group>] <src>... <dest>
VOLUME 容器数据卷,用于数据保存和持久化工作 VOLUME <path>
CMD 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效 CMD command param1 param2
ENTRYPOINT 指定一个容器启动时要运行的命令,多个指令时不容易被覆盖 ENTRYPOINT ["executable", "param1", "param2"]
ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

3. 编写Dockerfile

创建Dockerfile 文件,并编写,下面提供一个最简单的镜像

bash 复制代码
# 用来注释
# 第一部分 基础镜像
FROM alpine

# 第二部分 维护者信息
LABEL maintiner="Peter·Pan爱编程" \
      name="demo"

# 第三部分 镜像操作指令
RUN echo dockerfiletest

# 第四部分 镜像启动指令
CMD ["echo successfully"]

用户可以从Docker Hub中找到更多的基础镜像

使用下面指令可以编译镜像

bash 复制代码
sudo docker build -t myalpine:v1.0 -f ./Dockerfile .

编译完成后,使用docker images能找到镜像:

使用docker run 运行镜像

bash 复制代码
sudo docker run -it --rm --name myalpine myalpine:v1.0 /bin/sh

4. 最佳实践

  1. 用多阶段构建:如上例所示,可以极大地减小最终镜像的大小。
  2. 合理排序指令:将最不可能变化的指令(如COPY requirements.txt和RUN install)放在前面,充分利用 Docker 的构建缓存,加速构建过程。多个RUN指令尽量使用&&来进行合并处理,减小镜像的大小
  3. .dockerignore:创建一个 .dockerignore 文件来排除不需要的文件(如.git, node_modules, .env),避免它们被复制到镜像中,增加大小并可能引发问题。
  4. 选择合适的基础镜像:优先选择官方、轻量级(如-slim, -alpine)的镜像。
  5. 一个容器一个进程:保持容器的单一职责,使其更易于管理、扩展和调试。