Skip to content

Dockerfile

在前面的章节中,我们使用了从 Docker Hub 下载的预构建镜像,例如 ubuntu、nginx 或 jenkins/jenkins。这些镜像是由其他人使用 Dockerfile 创建的。

Dockerfile 是一个简单的文本文件,其中包含一系列指令,告诉 Docker 如何构建自定义镜像。它自动化了设置环境、安装依赖、复制应用程序代码和配置运行时的过程。

  • 自动化: 自动化镜像创建过程,使其可重复且可靠。
  • 版本控制: Dockerfile 可以与您的应用程序代码一起提交到版本控制系统(如 Git)中,跟踪应用程序环境的变化。
  • 可重现性: 确保任何人都可以从 Dockerfile 构建出完全相同的镜像,从而实现一致的环境。
  • 文档: Dockerfile 本身就是关于镜像如何构建的文档。
  • 效率: 如果 Dockerfile 的某些部分没有改变,Docker 的层缓存机制可以显著加快构建速度。

Dockerfile 由一系列指令组成,每条指令占一行。指令通常大写,后跟参数。

步骤 1:创建文件

在您的项目根目录或专门的目录中创建一个名为 Dockerfile 的文件(文件名必须是 Dockerfile,大写 ‘D’ 且没有扩展名)。

步骤 2:添加指令

以下是一个简单的 Dockerfile 示例及其分解说明:

# 使用注释解释步骤
# 这是一个示例 Dockerfile
# 指令 1:指定基础镜像
FROM ubuntu:22.04
# 指令 2:添加元数据(例如维护者信息)
LABEL maintainer="Your Name <you@example.com>"
# 指令 3:构建期间运行命令(例如安装软件)
RUN apt-get update && apt-get install -y --no-install-recommends nginx && apt-get clean && rm -rf /var/lib/apt/lists/*
# 复制文件从构建上下文到镜像中
# COPY ./my-app-code /app
# 指令 4:将文件从构建上下文复制到镜像中
# 指令 5:声明容器将监听的端口
EXPOSE 80
# 指令 6:定义容器启动时要运行的默认命令
CMD ["nginx", "-g", "daemon off;"]

关于结构和常用指令的关键点:

  • #:用于添加注释。
  • FROM:指定基础镜像。每个 Dockerfile 都必须以 FROM 开头。
  • LABEL:向镜像添加元数据(键值对)(替换已弃用的 MAINTAINER)。
  • RUN:在镜像构建过程中执行命令(例如安装软件包)。每个 RUN 指令都会创建一个新的镜像层。
  • COPY:将文件或目录从您的本地机器(构建上下文)复制到镜像中。
  • EXPOSE:告知 Docker 容器在运行时监听指定的网络端口(仅作为文档说明)。
  • CMD:指定当容器从镜像启动时要执行的默认命令。Dockerfile 中只有最后一个 CMD 指令会生效。

步骤 3:保存文件。

保存后,您可以在与 Dockerfile 相同的目录中使用 docker build 命令来创建您的自定义镜像。我们将在下一章介绍构建过程。