如何使用 docker container diff 命令检查容器文件系统变更

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker container diff 命令来检查 Docker 容器内的文件系统变更。我们将从运行一个简单的 Nginx 容器开始,然后使用 docker container diff 来检查容器创建时初始的文件系统修改。

完成初步检查后,你将在运行中的容器内进行一些更改。最后,你将再次使用 docker container diff 来观察并理解这些修改导致的文件系统差异。这个动手练习将为你提供使用这一实用 Docker 命令的实践经验,帮助你调试和理解容器的行为。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555107{{"如何使用 docker container diff 命令检查容器文件系统变更"}} docker/ps -.-> lab-555107{{"如何使用 docker container diff 命令检查容器文件系统变更"}} docker/rm -.-> lab-555107{{"如何使用 docker container diff 命令检查容器文件系统变更"}} docker/exec -.-> lab-555107{{"如何使用 docker container diff 命令检查容器文件系统变更"}} docker/inspect -.-> lab-555107{{"如何使用 docker container diff 命令检查容器文件系统变更"}} docker/pull -.-> lab-555107{{"如何使用 docker container diff 命令检查容器文件系统变更"}} docker/images -.-> lab-555107{{"如何使用 docker container diff 命令检查容器文件系统变更"}} end

运行 Nginx 容器

在这一步骤中,我们将学习如何在 Docker 容器内运行一个简单的 Nginx 网页服务器。Docker 允许我们将应用程序及其依赖打包到容器中,确保它们能在不同环境中稳定运行。

首先,我们需要确保系统上已有 Nginx 镜像。我们可以使用 docker pull 命令从 Docker Hub 拉取官方的 Nginx 镜像。该命令会将镜像下载到你的本地机器。

docker pull nginx:latest

你将看到镜像正在下载的输出信息。下载完成后,可以通过列出系统上的镜像来验证是否可用:

docker images

输出中应该能看到 nginx 镜像。

现在,让我们运行 Nginx 容器。我们将使用 docker run 命令。-d 参数表示以分离模式(后台)运行容器,-p 80:80 参数将主机的 80 端口映射到容器内的 80 端口,这样我们就能通过主机浏览器访问 Nginx 网页服务器。我们还通过 --name my-nginx-container 为容器指定了一个名称,便于识别。

docker run -d -p 80:80 --name my-nginx-container nginx

运行命令后,Docker 会输出一个长字符串,即容器 ID。这表示容器已在后台成功启动。

要验证容器是否正在运行,可以使用 docker ps 命令列出所有运行中的容器:

docker ps

你应该能看到 my-nginx-container 的状态显示为 Up

最后,让我们从主机访问 Nginx 网页服务器。由于我们映射了 80 端口,可以使用 curllocalhost 的 80 端口发送 HTTP 请求。

curl localhost

你将在输出中看到默认的 Nginx 欢迎页面 HTML。这确认了 Nginx 容器正在运行且可访问。

使用 docker container diff 检查初始文件系统变更

在这一步骤中,我们将探索如何检查 Docker 容器启动时发生的文件系统变更。Docker 使用分层文件系统,当容器运行时,会在镜像层之上添加一个新的可写层。docker container diff 命令允许我们查看自容器创建以来在这个可写层中引入的差异。

docker container diff 命令需要以容器名称或 ID 作为参数。我们将使用上一步启动的 Nginx 容器名称 my-nginx-container

docker container diff my-nginx-container

当你在容器启动后立即运行此命令时,很可能会看到一个文件和目录列表。输出显示了容器文件系统相对于基础镜像的变更。输出格式通常为:

  • A 表示添加了文件或目录
  • C 表示文件或目录被修改
  • D 表示文件或目录被删除

你看到的初始变更通常与容器的启动过程相关,例如临时文件、日志文件的创建,或系统目录的修改。这些是在容器启动时在其可写层中创建或修改的文件和目录。

理解这些初始变更有助于我们了解容器启动时的底层运作机制,以及可写层是如何被填充的。

在容器内进行修改

在这一步骤中,我们将在运行的 Nginx 容器内对文件系统进行一些修改,以此演示容器内的变更如何记录在其可写层中。

我们将使用 docker exec 命令在容器内执行命令。该命令允许我们在运行中的容器内执行指定命令,需要提供容器名称 (my-nginx-container) 和要运行的命令。

首先,在容器的 /tmp 目录下创建一个新文件。我们将使用 touch 命令:

docker exec my-nginx-container touch /tmp/my_new_file.txt

此命令会在 my-nginx-container 容器内执行 touch /tmp/my_new_file.txt。如果命令执行成功,你将不会看到任何输出。

接下来,修改默认的 Nginx 首页文件。Nginx 的默认欢迎页面通常位于容器内的 /usr/share/nginx/html/index.html。我们将使用 echo 命令向该文件追加内容:

docker exec my-nginx-container echo "<h1>Hello from LabEx!</h1>" >> /usr/share/nginx/html/index.html

此命令会将 HTML 字符串 "

Hello from LabEx!

" 追加到容器内的 index.html 文件中。

要验证修改是否生效,你可以再次从主机使用 curl 访问 Nginx 服务器:

curl localhost

现在你应该能看到原始的 Nginx 欢迎页面内容后跟着 "

Hello from LabEx!

",这确认了容器内的 index.html 文件已被修改。

我们进行的这些修改(创建新文件和修改现有文件)都被记录在 my-nginx-container 容器的可写层中。在下一步中,我们将再次使用 docker container diff 来查看这些具体变更。

使用 docker container diff 检查更新后的文件系统变更

在这最后一步中,我们将再次使用 docker container diff 命令来观察上一步所做的文件系统变更。这将清晰地展示我们在容器内的操作如何反映在其可写层中。

回顾上一步,我们在 my-nginx-container 容器内创建了新文件 /tmp/my_new_file.txt 并修改了 /usr/share/nginx/html/index.html 文件。现在,让我们再次对容器运行 docker container diff 命令。

docker container diff my-nginx-container

这次输出应该包含我们做的变更。你会看到类似以下的内容:

A /tmp/my_new_file.txt
C /usr/share/nginx/html/index.html

A /tmp/my_new_file.txt 这行表示在 /tmp 目录下新增了一个名为 my_new_file.txt 的文件。
C /usr/share/nginx/html/index.html 这行表示 /usr/share/nginx/html/ 目录下的 index.html 文件被修改了。

这个输出确认了 docker container diff 能有效显示自容器启动以来对文件系统所做的修改。这些变更存储在容器的可写层中,与基础镜像层是分离的。这是 Docker 分层文件系统的基本概念,也是容器维护其状态的方式。

当容器被删除时,这个可写层也会被移除,除非使用卷 (volumes) 或绑定挂载 (bind mounts) 进行持久化存储(这些内容将在其他实验中探讨)。

要进行清理,你可以停止并删除容器:

docker stop my-nginx-container
docker rm my-nginx-container

至此,我们完成了对 docker container diff 的探索。你已经学会了如何检查容器启动时的初始文件系统变更,以及如何查看在运行中的容器内所做的修改。

总结

在本实验中,我们学习了如何使用 docker run 运行一个简单的 Nginx 容器,通过端口映射确保其可访问性,并使用 docker ps 验证其运行状态。随后,我们探索了 docker container diff 命令,用于检查容器创建时由镜像层引入的初始文件系统变更。

接着,我们实践了在运行中的容器文件系统内进行修改,并再次使用 docker container diff 来观察和理解 Docker 如何跟踪和反映这些变更,突出了该命令在识别容器当前状态与其基础镜像之间差异方面的实用价值。