简介
在本实验中,你将学习如何高效使用 docker container exec
命令在运行的 Docker 容器内执行命令。我们将首先启动一个用于执行的容器,然后探索如何在运行中的容器内执行单条命令,以及如何启动交互式 shell 进行更复杂的操作。
此外,本实验还将介绍如何通过设置环境变量和为 exec
进程指定工作目录来自定义执行环境,帮助你掌握管理和与运行中容器交互的技能。
在本实验中,你将学习如何高效使用 docker container exec
命令在运行的 Docker 容器内执行命令。我们将首先启动一个用于执行的容器,然后探索如何在运行中的容器内执行单条命令,以及如何启动交互式 shell 进行更复杂的操作。
此外,本实验还将介绍如何通过设置环境变量和为 exec
进程指定工作目录来自定义执行环境,帮助你掌握管理和与运行中容器交互的技能。
在本步骤中,你将学习如何启动一个 Docker 容器并在其中执行命令。Docker 容器是轻量级、可移植且自包含的单元,能够封装应用程序及其依赖项。
首先,让我们从 Docker Hub 拉取 ubuntu
镜像。该镜像包含一个最小化的 Ubuntu 操作系统环境。
docker pull ubuntu:latest
你将看到显示镜像正在下载的输出。下载完成后,你可以基于该镜像启动容器并执行简单命令。我们将使用 echo
命令打印一条消息。
docker run ubuntu:latest echo "Hello from Docker container!"
让我们分解这个命令:
docker run
:这是创建并启动新容器的命令ubuntu:latest
:指定容器使用的镜像。ubuntu
是镜像名称,latest
是标签,表示最新版本echo "Hello from Docker container!"
:这是在容器内部执行的命令你应该会在终端看到输出 Hello from Docker container!
,这确认容器已成功启动且命令已执行。
在上一步骤中,我们启动了一个容器并执行命令后容器随即退出。本步骤将学习如何在已经运行的容器内部执行命令,这对于检查运行中容器的状态或执行管理任务非常有用。
首先,让我们启动一个持续运行的容器。我们将再次使用 ubuntu
镜像,并运行一个保持容器存活的命令,如 sleep infinity
。
docker run -d ubuntu:latest sleep infinity
使用的选项说明:
-d
:该选项以分离模式运行容器,即在后台运行且不会阻塞你的终端sleep infinity
:容器内的这个命令将使容器无限期休眠,保持容器运行状态现在,让我们获取运行中容器的 Container ID。你可以使用 docker ps
命令列出运行中的容器。
docker ps
你将看到类似如下的输出,显示你的运行中容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu:latest "sleep infinity" About a minute ago Up About a minute <container_name>
从输出中复制 CONTAINER ID
。现在,我们可以使用 docker exec
命令在这个运行中的容器内执行命令。请将 <container_id>
替换为你复制的实际 ID。
docker exec / < container_id > ls
该命令将在指定容器内执行 ls /
,列出容器文件系统中根目录的内容。你将看到类似 Linux 系统的目录和文件列表。
这演示了如何在不停止或重启容器的情况下,在运行中的容器内执行命令。
在上一步骤中,我们在运行中的容器内执行了单个命令。通常你可能需要更深入地与运行中的容器交互,比如调试问题或探索其文件系统。本步骤将学习如何在运行中的容器内打开交互式 Shell 会话。
我们将继续使用你在上一步骤中启动的 ubuntu
容器。如果容器没有运行,你可以使用上一步骤的命令重新启动它:
docker run -d ubuntu:latest sleep infinity
使用 docker ps
获取运行中的 ubuntu
容器的 Container ID:
docker ps
现在,使用带有 -it
选项的 docker exec
命令在容器内打开交互式终端会话。请将 <container_id>
替换为你运行中容器的实际 ID。
docker exec -it < container_id > bash
让我们看看新增的选项:
-i
:该选项保持 STDIN
开启状态(即使未连接),这是交互式会话必需的-t
:该选项分配一个伪终端(pseudo-TTY),这是 Shell 会话所需的bash
:这是在容器内执行的命令,此处指 Bash Shell运行此命令后,你的终端提示符应该会改变,表示你现在已进入容器的 Bash Shell。现在你可以在容器环境中执行命令了。例如尝试列出当前目录的文件:
ls
你现在可以直接与容器的文件系统和环境进行交互。要退出容器 Shell 并返回主机终端,只需输入:
exit
现在你应该回到了原始终端会话。这种交互式 Shell 访问是调试和管理容器的强大工具。
在本步骤中,你将学习如何为通过 docker exec
执行的命令专门设置环境变量。这使你可以向容器内运行的进程传递配置或其他信息,而无需永久修改容器的环境。
我们将继续使用前几步中运行的 ubuntu
容器。如果容器未运行,请使用以下命令启动:
docker run -d ubuntu:latest sleep infinity
使用 docker ps
获取运行中的 ubuntu
容器的 Container ID:
docker ps
现在,让我们在容器内执行命令并为该特定执行设置环境变量。我们将使用 printenv
命令来显示环境变量。请将 <container_id>
替换为你容器的 ID。
docker exec -e MY_VARIABLE="Hello from LabEx" MY_VARIABLE < container_id > printenv
让我们看看新增的选项:
-e MY_VARIABLE="Hello from LabEx"
:该选项为正在执行的 printenv
命令设置名为 MY_VARIABLE
的环境变量,其值为 "Hello from LabEx"
你应该会在终端看到输出 Hello from LabEx
,这确认环境变量已成功为 printenv
进程设置。
为了证明这个环境变量仅对 exec
进程有效,而不是容器的核心进程,让我们再次执行 printenv MY_VARIABLE
但不带 -e
选项:
docker exec MY_VARIABLE < container_id > printenv
这次你应该看不到任何输出,或者可能会收到变量未设置的错误提示。这表明环境变量仅对带有 -e
标志执行的命令有效。
使用 docker exec -e
设置环境变量是向容器内运行的进程传递动态配置的便捷方式。
在这最后一步中,你将学习如何为通过 docker exec
执行的命令设置工作目录。默认情况下,docker exec
会在容器配置的工作目录(通常是 /
)中运行命令。你可以使用 -w
选项来覆盖这一默认设置。
我们将继续使用运行中的 ubuntu
容器。如果容器未运行,请使用以下命令启动:
docker run -d ubuntu:latest sleep infinity
使用 docker ps
获取运行中的 ubuntu
容器的 Container ID:
docker ps
现在,让我们执行一个打印容器内当前工作目录的命令。我们将使用 pwd
命令。请将 <container_id>
替换为你容器的 ID。
docker exec < container_id > pwd
你应该会看到输出 /
,这是 ubuntu
镜像中的默认工作目录。
现在,让我们再次执行 pwd
命令,但这次我们将使用 -w
选项将工作目录设置为 /tmp
。
docker exec -w /tmp < container_id > pwd
让我们看看新增的选项:
-w /tmp
:该选项将为 pwd
命令设置容器内的工作目录为 /tmp
现在你应该会看到 /tmp
作为输出。这证明你可以为通过 docker exec
执行的命令指定不同的工作目录。当你需要执行针对容器内特定位置文件的操作命令时,这个功能非常有用。
至此,关于在 Docker 容器中执行命令的实验就结束了。你已经学习了如何启动容器执行命令、在运行中的容器内执行命令、打开交互式 Shell 会话、设置环境变量以及为 exec
进程设置工作目录。
在本实验中,你学习了如何使用 docker run
启动 Docker 容器并在其中执行命令。随后你掌握了通过 docker container exec
命令在已运行的容器内执行命令,这对于检查或管理活跃容器至关重要。
此外,你还探索了 docker container exec
的高级功能,包括为执行进程设置环境变量以及指定工作目录,这些功能让你在与运行中的容器交互时获得更强的控制力和灵活性。