简介
在本实验中,你将学习如何进入正在运行的 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 的一项基础技能,可以帮助你直接排查应用问题并检查容器环境。



