使用 Exec 访问容器

DockerBeginner
立即练习

简介

在本实验中,你将学习如何进入正在运行的 Docker 容器。这是一项重要的调试技能。虽然容器通常设计为可随时销毁,但你经常仍需要检查正在运行的环境,以了解其中发生了什么。

如果要检查容器内的文件、查看正在运行的进程或排查问题,通常需要在该容器的环境中打开命令 shell。docker exec 命令可以在已经运行的容器中启动其他命令,无需重新构建或重启容器。

这里的「其他」非常重要。docker exec 不会替换容器的主进程,而是在相同的容器命名空间中启动另一个进程,同时保持原有服务继续运行。

本实验将依次完成以下步骤:

  • 在后台启动一个 Nginx 容器。
  • 使用 docker exec 在容器内部启动交互式 Bash shell。
  • 在容器内运行命令,识别其操作系统。
  • 退出容器并返回主机终端。

启动后台容器

在这一步中,你将使用 Nginx 镜像启动一个新的 Docker 容器。你会以「分离」模式运行容器,使其在后台运行,并为容器指定一个名称,以便稍后引用。

在终端中运行以下命令:

docker run -d --name web1 nginx

命令解析:

  • docker run:创建并启动容器的命令。
  • -d:以分离模式运行容器,也就是在后台运行。
  • --name web1:为容器指定名称 web1。
  • nginx:要使用的镜像。

验证容器是否正在运行:

docker ps

你应该能在正在运行的容器列表中看到 web1。

容器必须处于运行状态,因为 docker exec 需要进入已有的运行中容器。对于已经停止的容器,docker exec 无法在其中启动 shell。

进入容器

现在容器已经运行,你将使用 docker exec 命令在容器内部启动 shell 会话。这相当于「登录」容器,类似于通过 SSH 登录远程服务器。

执行以下命令:

docker exec -it web1 bash

命令解析:

  • docker exec:在已有容器内部执行命令。
  • -it:交互式会话必须使用的选项组合。
    • -i(interactive,交互式):保持输入流处于打开状态。
    • -t(tty):分配伪终端,使其表现得像真实的命令行提示符。
  • web1:目标容器的名称。
  • bash:要在容器内运行的命令。这里启动的是 Bash shell。

因此,docker exec 的实际含义就是「在容器内运行这个命令」。shell 只是常见用法之一;你也可以运行 ls、cat 或调试工具。

观察变化:

运行此命令后,命令行提示符会发生变化,类似于 root@<container-id>:/#。

这表示你现在执行的命令位于容器内部,与主机隔离。

这种隔离通常包括文件系统视图、进程命名空间和网络上下文。你仍然使用同一个内核,但现在看到的是容器限定范围内的环境,而不是主机的完整环境。

检查容器环境

现在你已经进入容器。你看到的文件系统属于容器,而不是 LabEx 环境。你可以通过查看操作系统信息来验证这一点。

在容器内的 shell 中运行以下命令:

cat /etc/os-release

你将看到描述 Nginx 镜像所使用 Linux 发行版的信息,通常是 Debian。

示例输出:

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
...

这说明容器拥有独立的操作系统环境,并且与主机分离。

更准确地说,容器拥有自己的用户空间文件系统和进程环境。它并没有独立的内核,但从容器内部看起来,仍然像一个独立的小型 Linux 系统。

退出并返回主机

完成容器的调试或检查后,你需要退出 shell 会话,返回主机。

在容器内输入以下命令:

exit

按下 Enter 键后,命令行提示符应返回标准的 LabEx 用户提示符。

发生了什么?

你已经关闭了容器内的 Bash 进程。但容器本身(web1)仍会在后台运行,因为主进程 Nginx 仍处于活动状态。

这就是 docker exec 生命周期的关键:结束交互式 shell 不会停止容器,除非该 shell 本身就是决定容器生命周期的主进程。

运行以下命令进行确认:

docker ps

你仍然可以看到 web1。

如需清理环境,可以停止并删除该容器:

docker rm -f web1

总结

在本实验中,你学习了如何使用 docker exec -it 访问正在运行的容器。你练习了以下操作:

  • 在后台启动容器。
  • 使用交互式 Bash shell 进入容器。
  • 验证容器内部的环境。
  • 在保持服务运行的同时安全退出。

这是使用 Docker 的一项基础技能,可以帮助你直接排查应用问题并检查容器环境。