Docker – 构建文件



Dockerfile 本质上是一组用简单文本格式编写的指令,Docker 基于这些指令构建 Docker 镜像。例如,它包含必须开始使用的基础镜像、软件安装指令、库、依赖项、文件复制以及应用程序环境中必要的运行命令。

可以把它想象成容器的食谱,列出食材和执行的烹饪步骤,最终生成一个可运行的 Docker 镜像,就像一道美味佳肴。

阅读本章以了解 Dockerfile 及其如何构建以创建和运行 Docker 镜像。

Dockerfile 指令

Dockerfile 指令是在构建 Docker 镜像过程中使用的一组命令。添加到 Dockerfile 中的每个指令都概述了最终运行应用程序的容器的环境和行为。

此处列出了**10 个基本的 Dockerfile 指令**以及示例,展示了如何使用它们 -

指令 描述
FROM 指定构建的基础镜像
RUN 在当前镜像的新层上运行命令并提交
COPY 将文件或目录从主机文件系统复制到镜像文件系统
WORKDIR 为任何后续指令设置工作目录。
ENV 设置环境变量
EXPOSE 通知 Docker 容器在运行时对特定网络端口感兴趣
CMD 为容器提供默认命令和/或参数
ENTRYPOINT 将容器配置为可执行文件运行
VOLUME 创建具有指定路径的挂载点,并将其标记为保存外部挂载的卷
USER 设置运行镜像时要使用的用户名或 UID

示例

让我们为一个简单的 Node.js 应用程序创建一个 Dockerfile -

# Use the official Node.js image as a base
FROM node:14

# Set the working directory
WORKDIR /app

# Copy package.json and package-lock.json to the working directory
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of the application code
COPY . .

# Expose port 3000 to the outside world
EXPOSE 3000

# Set environment variables
ENV NODE_ENV=production

# Default command to run when the container starts
CMD ["node", "index.js"]

此 Dockerfile 构建了一个 Node.js 应用程序的镜像,设置了环境,安装了依赖项,公开了端口,并定义了如何启动应用程序。

如何从 Dockerfile 构建镜像?

您可以使用一些重要的 Docker 命令通过 Docker 的命令行界面或 CLI 从 Dockerfile 构建 Docker 镜像。

让我们检查一下根据上述示例 Dockerfile 使用基本 Docker 命令构建、标记和运行镜像的分步指南。

构建 Docker 镜像

要从 Dockerfile 构建 Docker 镜像,请使用 docker build 命令 -

$ docker build -t my-node-app:v1 .
Build Docker Image
  • -t my-node-app:v1 - 要构建的镜像将名为“my-node-app”,标签为“v1”。
  • .(点) - 指定构建上下文,即包含 Dockerfile 的当前目录。

列出 Docker 镜像

此命令将列出当前系统上的所有 Docker 镜像。

$ docker images
List Docker Images

这将显示所有镜像的列表,以及它们的标签、大小和创建时间。

标记镜像

您可以使用 docker tag 命令将现有镜像标记到另一个标签或仓库名称。

$ docker tag my-node-app:v1 my-registry/my-node-app:v1
Tagging an Imag
  • my-node-app:v1 - 镜像名称和当前标签。
  • my-registry/my-node-app:v1 - 新仓库和标签的名称。

运行 Docker 容器

要基于特定镜像运行容器,请使用 docker run 命令 -

$ docker run -p 3000:3000 my-node-app:v1
  • -p 3000:3000 - 这会将主机的 3000 端口映射到容器内的 3000 端口(端口绑定)。
  • my-node-app:v1 - 这将是您要运行的镜像的名称以及该特定镜像的标签。

列出正在运行的容器

要查看当前正在运行的容器,可以使用 docker ps 命令 -

$ docker ps
List the Running Containers

这将返回正在运行的容器列表,以及它们的 ID、状态、端口和名称。

停止正在运行的容器

要停止正在运行的容器,请使用 docker stop 命令,后跟容器 ID 或名称 -

$ docker stop <container-id or container-name>
Stop a Running Container

您可以将“<container-id 或 container-name>”替换为您要停止的容器的实际 ID 或名称。

删除镜像

要从系统中删除镜像,可以使用 docker rmi 命令。这将采用镜像 ID 或标签作为参数。

$ docker rmi my-node-app:v1 
Removing an Image

什么是 .dockerignore 文件?

.dockerignore 文件与 .gitignore 的作用相同,定义了在 Docker 构建上下文中应忽略的文件和目录的模式。

当 Docker 构建镜像时,它会将整个上下文目录(使用 Docker build 命令指定)发送到 Docker 守护进程。这意味着,使用“.dockerignore”排除不需要的文件和目录可以加快构建速度并减小最终镜像的大小。

语法和用法

  • 在 Docker 构建上下文的根目录中创建一个“.dockerignore”文件。
  • 列出您希望 Docker 在构建过程中忽略的文件和目录(每行一个)。

示例 .dockerignore 文件

以下是 Node.js 应用程序的示例“.dockerignore”文件 -

node_modules
npm-debug.log
Dockerfile
.dockerignore
.git

解释

  • node_modules - 由于您希望将 npm install 用作构建的一部分,因此这会排除 node_module 目录,避免将所有不需要的依赖项复制到 Docker 镜像中。
  • npm-debug.log - 忽略 npm 调试日志,这些日志在 Docker 镜像中是不必要的。
  • Dockerfile - 这可以防止实际的 Dockerfile 本身被复制到 Docker 镜像中。
  • .dockerignore - 它有助于防止 .dockerignore 文件本身包含在构建上下文中。
  • .git - 排除 .git 目录,以避免复制不必要的 Git 仓库信息。

最佳实践

  • 包含特定文件 - 仅将容器中构建和运行应用程序在 Docker 中所需的那些文件和目录包含在内。
  • 使用通配符 - 星号 (*) 和双星号 (**) 可用于匹配文件和目录的通配符模式。
  • 保持简洁 -“.dockerignore”本身应尽可能简洁,以防止意外删除文件。

Dockerfile 中 COPY 和 ADD 指令的区别

COPY 和 ADD 都用于将文件从主机复制到 Docker 镜像中。但是,在大多数情况下,COPY 是更好的选择;它更加透明。如果您只需要将文件从源复制到镜像中的目标,则应使用 COPY 指令。

ADD 具有其他功能,例如自动解压缩文件和从远程 URL 获取文件的能力,但它会增加潜在的意外行为和可能的安全风险。如果您不需要这些功能,则 COPY 是首选指令,可以提高 Docker 文件的清晰度和可维护性。

结论

在本章中,我们讨论了 Dockerfile 的复杂性、使用它们的原因以及构建 Docker 镜像所需的几个重要的 Dockerfile 指令。

然后我们了解了一个 Dockerfile 的示例,以创建 NodeJs Docker 镜像以及可用于构建和标记镜像、运行容器、列出镜像和容器等的各种命令。

最后,我们讨论了为什么在构建上下文中使用 Dockerignore 文件是必要的。您现在已经具备了从 Dockerfile 创建和构建镜像的充分能力。

广告