Dockerfile 创建自定义容器的基础知识

2025-06-07

Dockerfile 创建自定义容器的基础知识

什么是 Dockerfile?

正如本系列上一篇文章所述,Docker 镜像是 Docker 容器的蓝图。Docker 镜像种类繁多,但有时没有一种镜像能完美契合您的特定用例,您可能需要创建自己的镜像。要创建 Docker 镜像,我们需要一个 Dockerfile,它是一个简单的文本文件,包含用于设置容器的分步说明。Docker 的一大优势在于,我们在创建自己的 Docker 镜像时,还可以利用其他用户的 Docker 镜像。

让我们举一个抽象的例子——假设您想使用 Dockerfile 为您最喜欢的数据库创建一个 Docker 镜像(注意:DockerHub 上已经提供了大多数数据库的 Docker 镜像)。您可能希望使用 Ubuntu 之类的操作系统。您无需编写 Dockerfile 来包含 Ubuntu 完整安装和配置的所有命令,只需使用一个 Ubuntu 镜像即可完成所有这些操作。我们将使用这个 Ubuntu Docker 镜像作为新镜像的“基础”。之后,您只需在 Dockerfile 中包含在系统上安装和运行数据库的 Linux 命令即可。

使用 Dockerfile 创建和构建自定义映像

如前所述,要创建我们自己的镜像,我们需要创建并编写自己的 Dockerfile。要创建一个 Dockerfile,只需生成一个名为“Dockerfile”的新文件(无需扩展名)。

touch Dockerfile

与 DockerHub 上的第三方 Docker 镜像不同,我们可以直接下载并运行它们。但每次修改 Dockerfile 时,我们都需要将其构建到 Docker 镜像中。为此,我们需要在文件中添加几行指令。

使用基础镜像

在此示例中,我将使用官方 Ubuntu 镜像作为 Dockerfile 的基础,因为我想搭建一个基于 Linux 的应用服务器。请确保使用 FROM 指令在 Dockerfile 的顶部声明基础镜像定义。

FROM ubuntu:18.04

在容器中执行命令

现在我们将学习如何使用 Dockerfile 执行 Linux 命令。在 Dockerfile 中,要在容器构建过程中执行的命令前面都会加上 RUN 指令。CMD 指令与 RUN 指令类似,但它用于在构建过程完成后执行命令。这通常是启动作业或软件的操作,只要容器处于活动状态,这些作业或软件就会一直运行,例如启动应用服务器以便处理请求。让我们扩展 Dockerfile 如下:

FROM ubuntu:18.04
RUN echo 'Hello World'
CMD echo 'Hello World'

构建并运行容器

现在,我们还可以使用 构建我们的 Docker 容器docker build -t my-image .。输入命令后,您应该看到我们的 Ubuntu 镜像从 DockerHub 中拉取(如果它尚未在您的计算机上),并注意我们所有的指令是如何在终端中列出的。“-t”标志用于为我们的镜像命名(在本例中,我将其命名为“my-image”)。为了检查它是否正确构建,我们需要使用命令 列出我们机器上的所有镜像docker images。要使用新镜像运行我们的容器,请使用docker run my-image您现在应该在命令行中打印一些内容:“Hello World”。但是等等 - 我们不是输出了两次吗?记住:RUN 指令命令在构建时执行,因此它们不会输出到控制台。这也是为什么我们在 Dockerfile 中在 CMD 之前使用 RUN 指令的原因。

将文件复制到容器中

使用 Dockerfile 创建自己的镜像最常见的原因是,你需要使用一些自己的代码或二进制文件来托管应用程序。Docker 提供了两条可用于此目的的指令:ADD 和 COPY。两者之间的区别非常小。ADD 可以接受额外的参数,允许你在从本地目录(从 tar 或 zip 文件)复制文件时提取文件,而 COPY 则不行。因此,通常情况下,只要你只是将文件复制到容器中,就使用 COPY。我决定创建一个非常简单的文本文件,以便复制该文件,然后将目录的内容输出到我的容器中。我的目录目前如下所示:

.
═── Dockerfile
└── helloworld.txt

COPY 指令需要两个参数。第一个参数是要复制的文件的路径,另一个参数是要将文件复制到的目录。

FROM ubuntu:18.04
COPY ./helloworld.txt .
CMD ls

我们需要重建镜像并运行它,使用之前使用的命令。输出如下:

bin
boot
dev
etc
helloworld.txt
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

现在我们可以看到,除了 helloworld.txt 文件之外,控制台中还列出了 Linux 根文件夹的内容。这意味着它成功了!目前看来,我们容器(或者更具体地说,是 ubuntu:18.04 docker 镜像)的默认工作目录就是 Linux 根文件夹!

更改 Docker 工作目录

更改 docker 工作目录就像使用 WORKDIR 指令一样简单。

FROM ubuntu:18.04
WORKDIR /usr/
COPY ./helloworld.txt .
CMD ls

我现在得到以下输出:

bin
游戏
helloworld.txt
包含
lib
本地
sbin
共享
src

结束语

希望你喜欢这篇 Dockerfile 入门教程!虽然还有很多内容需要学习,但我认为这些内容是创建任何容器的基石。还有一些关键的 Docker 特性及其对应的指令我在这里没有提到,特别是 EXPOSE 和 VOLUME。之所以没有提到,是因为它们通常使用命令行参数来定义,我在之前的 Docker 教程中已经介绍过。为了进一步学习并使用 Dockerfile 设置 nginx Web 服务器的实际示例,我推荐以下稍微高级一点的教程

文章来源:https://dev.to/marcbeaujean/dockerfile-step-by-step-creating-a-custom-container-2ccm
PREV
何时不从 Scratch 开始编码:后端版
NEXT
在 TypeScript 中索引对象