如何在 Docker 容器中运行 docker exec 命令?(使用 docker exec 进入容器)
要在正在运行的 Docker 容器中执行命令,请使用:
docker exec -it <container_id> <command>
例如,打开一个 bash shell:
docker exec -it mycontainer bash
运行单条命令:
docker exec mycontainer ls /app
Docker 是一款广泛使用的开源工具,它借助容器技术简化了应用的部署、扩展和管理。通过 Docker 容器,开发人员可以将应用及其依赖打包成可移植的容器,确保在不同环境中保持一致。
要在 VPS 上运行 Docker exec?请确保您的服务器拥有足够的资源,欢迎了解 BlueVPS Docker VPS 主机。
Docker exec 有什么作用?
docker exec 是 Docker 的关键命令之一,可让用户在正在运行的容器中执行命令。借助这一功能,您可以直接与容器的进程和环境交互,因此它在排查故障或管理应用时非常有用。
Docker 用途广泛,兼容 Linux、Windows 和 macOS 等多种操作系统,甚至可以安装在虚拟专用服务器(VPS)上。安装 Docker 时需要根据所选平台按照特定的配置步骤进行。
如何使用 docker exec 命令?
在使用 docker exec 命令之前,请确保系统上已正确安装 Docker。然后,确定要在其中运行命令的具体容器。
在本指南中,您将了解 docker exec 命令。我们将通过不同的用例,演示如何在 Docker 容器中以 root 身份运行 docker exec。
前提条件
- 确认您的系统上安装了最新版本的 Ubuntu。
- 按照 Docker 官方文档中的步骤安装 Docker。
- 将您的用户添加到 Docker 组,这样运行 Docker 命令时无需每次输入管理员密码。
启动 Docker 容器
为了演示 docker exec 命令的用法,我们先启动一个容器。
首先,拉取一个镜像到 Docker 容器:
# docker pull redis
下面以 Redis 容器为例:
# docker run -d --name myredis redis
该命令以分离模式(-d 参数)启动一个 Redis 容器,使其在后台运行。这个名为 myredis 的容器将作为我们执行命令的示例环境。
在 Docker 容器中运行命令(Docker 容器)
要在容器中执行命令,首先需要获取它的容器 ID。您可以使用以下命令列出所有正在运行的容器,从而找到容器 ID:
# docker ps
获取容器 ID(例如 6a8b7d170a12)后,就可以用它在容器中运行命令。

Docker exec 命令语法(以 root 身份运行 Docker exec)
docker exec 命令的一般语法如下:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
以下是常用选项:
-d, --detach: 在后台运行命令。
--detach-keys: 设置用于从容器分离的自定义按键序列。
-e, --env: 为命令指定环境变量。
--env-file: 从文件加载环境变量。
-i, --interactive: 即使未连接到终端,也保持标准输入(STDIN)打开。
--privileged: 授予命令扩展权限。
-t, --tty: 为命令分配伪终端。
-u, --user: 以指定用户或 UID 运行命令。
-w, --workdir: 设置命令在容器内的工作目录。
以非交互模式使用 docker exec 进入容器(docker exec 进入容器)
在非交互模式下,您可以在正在运行的容器中执行单条命令。例如,要查看运行中容器内的 Redis 版本,请使用以下命令:
# docker exec <container_id> redis-server --version
该命令在指定容器内运行 redis-server --version(请将 <container_id> 替换为实际 ID,例如 6a8b7d170a12),并直接在终端中获取并显示 Redis 版本。
在交互式 shell 中运行命令
交互模式允许您在容器内打开一个 shell 会话,从而运行多条命令并探索容器环境。要进入交互式 shell,请使用以下语法:
docker exec -it CONTAINER COMMAND [ARG...]
例如,要在正在运行的 Redis 容器中打开 shell,请使用:
# docker exec -it 6a8b7d170a12 bash
请将 <container_id> 替换为您的 Redis 容器 ID(例如 6a8b7d170a12)。该命令会在容器内打开一个 shell 会话,让您与环境交互并执行多条命令。
示例:在交互式 shell 中运行命令(Docker bash)
进入 shell 后,您可以执行 Redis 专用命令。例如:
# redis-cli ping
该命令检查容器内运行的 Redis 服务器状态,如果运行正常则返回 PONG。现在,您可以根据需要探索容器的文件系统和环境。

以其他用户身份运行 Docker exec(以指定用户运行 docker exec)
默认情况下,docker exec 会在容器内以 root 身份执行命令。不过,您也可以为命令指定其他用户。要以特定用户身份运行命令,请使用以下语法:
docker exec -u USERNAME CONTAINER COMMAND [ARG...]
例如,要在 Redis 容器中以 redis 用户身份运行“whoami”命令,可以使用:
# docker exec -u redis 6a8b7d170a12 whoami

使用环境变量运行命令
您可以使用以下语法,在设置特定环境变量的同时在容器内运行命令:
docker exec -e VAR_NAME=VAR_VALUE CONTAINER COMMAND [ARG...]
例如,要在 Redis 容器中使用自定义环境变量运行 env 命令,请使用:
# docker exec -e MY_VARIABLE='testing_env' <container_id> env
该命令将 MY_VARIABLE 设置为 testing_env,然后运行 env 命令显示容器的环境变量。这种方法适用于将 API 密钥等敏感数据安全地传入容器,而不会在容器环境中暴露它们。
Docker Exec 示例(常见用例)
docker exec 命令让您无需停止或重启容器,就能在活动的 Docker 容器中运行命令。它被广泛用于故障排查、维护、诊断和一次性管理操作。一个典型的 docker exec 示例是在正在运行的容器中打开交互式 shell,以检查文件、核实进程或排查应用问题。
docker exec 的常见用例包括:
1. 在正在运行的容器中打开 shell。
使用 docker exec -it 配合 Bash 或其他 shell,检查文件、进程、权限和容器环境。
2. 查看配置文件。
管理员可以检查应用设置、环境变量、挂载目录和文件权限。手动修改的内容在容器重新创建后可能会丢失,因此永久性的更新应写入镜像或挂载的配置中。
3. 运行数据库命令。
docker exec 可用于启动数据库客户端、执行 SQL 查询、应用迁移、创建备份或执行维护任务。
4. 查看系统信息。
ps、top、df、free 和 env 等命令有助于诊断资源使用情况、运行中的进程、磁盘空间和环境设置。
5. 清除应用缓存。
在代码、路由、模板或配置变更后,可以执行框架专用的缓存命令。
6. 测试网络连通性。
curl、ping、wget 或 nslookup 等工具有助于验证容器、数据库、API 和外部服务之间的连接。
7. 运行维护脚本。
您可以执行数据导入、权限修复、队列命令、计划任务测试以及其他一次性操作。
这些 Docker exec 示例说明了为什么该命令对于容器调试和管理至关重要。不过,它主要应用于临时任务,而持久性的更改应放在 Dockerfile、Docker Compose 配置、环境变量或挂载卷中。
如何进入正在运行的 Docker 容器
有时您需要在应用仍在运行时查看容器内部,例如检查文件、核对配置、测试命令、查看进程或查找错误原因。大多数情况下,进入 Docker 容器都是通过 docker exec 完成的,因为它可以在现有容器中启动 shell,而无需重新创建或停止容器。
首先查看当前有哪些活动容器:
docker ps
复制所需的容器名称或 ID,然后打开交互式 shell:
docker exec -it container_name /bin/bash
该命令会在容器内创建一个终端会话。-i 选项保持输入流打开,-t 则提供可用的终端界面。
并非每个镜像都包含 Bash。精简镜像,特别是基于 Alpine Linux 的镜像,通常只提供标准的 sh shell。这种情况下,请使用:
docker exec -it container_name /bin/sh
当您需要通过 exec 进入 Docker 容器而 Bash 不可用时,这是常用的做法。
用户有时会搜索 docker get into container 或 docker login into container,但这些说法可能会造成误解。docker login 命令并不会打开容器,它用于向 Docker Hub 或其他容器镜像仓库进行身份验证。要访问正在运行的容器的环境,正确的命令是 docker exec。
对于使用 Docker Compose 启动的服务,语法略有不同:
docker compose exec service_name sh
进入容器后,您可以查看目录、运行诊断工具、核实环境变量或执行一次性维护任务。要关闭 shell,请输入 exit 或按 Ctrl + D。这只会结束交互式会话,容器本身会继续运行。
Docker Exec Shell:Bash 与 Sh
使用 docker exec shell 时,首先要决定是启动 bash 还是 sh。正确的选择取决于容器镜像中包含的操作系统和工具。
Bash 是一款功能丰富的 shell,常见于 Ubuntu、Debian 及类似发行版。它支持命令历史、Tab 补全、别名、脚本功能以及其他让故障排查和管理更加便捷的工具。如果您需要在正在运行的容器中使用 bash,这通常是首选:
docker exec -it container_name /bin/bash
然而,许多轻量级镜像(例如 Alpine Linux)为了控制镜像体积而不包含 Bash。它们提供的是兼容 POSIX 的 sh shell,足以完成大多数管理任务:
docker exec -it container_name /bin/sh
如果不确定有哪种 shell 可用,可以先尝试 Bash。如果命令返回 /bin/bash 不存在的错误,改用 sh 即可。这种方法适用于绝大多数精简 Docker 镜像。
在实际使用中,两种 shell 都可以让您在容器内检查文件、查看日志、编辑配置和运行命令。Bash 提供更舒适的交互体验,而 sh 则在各种容器镜像之间具有最大的兼容性。
Docker Exec、Docker Run 与 Docker Attach 对比
Docker 提供了多个用于与容器交互的命令,但它们解决的是不同的问题。了解何时使用哪个命令,有助于避免常见错误,在排查故障或管理生产工作负载时尤其如此。
|
命令 |
作用 |
是否创建新容器 |
是否作用于运行中的容器 |
典型用例 |
|
docker run |
从镜像创建并启动新容器 |
是 |
否 |
启动应用或服务 |
|
docker exec |
在现有容器中启动新的命令或 shell |
否 |
是 |
调试、维护、运行一次性命令 |
|
docker attach |
连接到容器的主进程及其标准输入/输出 |
否 |
是 |
查看主应用或与之交互 |
对于大多数管理和故障排查任务,推荐使用 docker exec,因为它可以让您在正在运行的容器内工作,而不会干扰其主进程。
结论
本指南介绍了与 Docker 容器交互的多种方式,包括以非交互方式运行命令、进入交互式 shell、使用环境变量,以及以 root 和其他用户身份执行 docker exec。这些方法为管理 Docker 容器提供了充分的灵活性。更多详情,请参阅官方 Docker exec 文档。
需要为容器提供可靠的运行环境?在 BlueVPS 的高性能服务器上部署您的 Docker 实例,享受不限流量、可扩展的资源和专属的托管环境。
blog