如何使用 docker container exec 命令在运行中的容器内执行命令

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何高效使用 docker container exec 命令在运行的 Docker 容器内执行命令。我们将首先启动一个用于执行的容器,然后探索如何在运行中的容器内执行单条命令,以及如何启动交互式 shell 进行更复杂的操作。

此外,本实验还将介绍如何通过设置环境变量和为 exec 进程指定工作目录来自定义执行环境,帮助你掌握管理和与运行中容器交互的技能。


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/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555108{{"如何使用 docker container exec 命令在运行中的容器内执行命令"}} docker/ps -.-> lab-555108{{"如何使用 docker container exec 命令在运行中的容器内执行命令"}} docker/exec -.-> lab-555108{{"如何使用 docker container exec 命令在运行中的容器内执行命令"}} docker/pull -.-> lab-555108{{"如何使用 docker container exec 命令在运行中的容器内执行命令"}} end

启动容器执行命令

在本步骤中,你将学习如何启动一个 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

在上一步骤中,我们在运行中的容器内执行了单个命令。通常你可能需要更深入地与运行中的容器交互,比如调试问题或探索其文件系统。本步骤将学习如何在运行中的容器内打开交互式 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 访问是调试和管理容器的强大工具。

为 exec 进程设置环境变量

在本步骤中,你将学习如何为通过 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 设置环境变量是向容器内运行的进程传递动态配置的便捷方式。

为 exec 进程设置工作目录

在这最后一步中,你将学习如何为通过 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 的高级功能,包括为执行进程设置环境变量以及指定工作目录,这些功能让你在与运行中的容器交互时获得更强的控制力和灵活性。