在新的 Docker 容器中启动 Bash 终端

Isaac Tony 2023年1月30日 2022年4月20日
  1. 使用 Bash 交互式 Shell
  2. 使用 docker exec 命令
  3. 使用 docker attach 命令
在新的 Docker 容器中启动 Bash 终端

Docker 容器是打包应用程序所有依赖项的标准单元,使我们能够在任何环境中轻松运行它们。容器最近变得非常流行,现在大多数开发人员都严重依赖容器来管理他们的应用程序和依赖项。

Docker 通过在 docker 容器中启动 bash 终端,为我们提供了多种访问 shell 实例的方法。这在 docker 容器内运行某些命令时特别有用。

此外,这也可能是出于调试原因,或者你可能想检查所有配置是否正确。本文探讨了我们可用于运行容器和未运行容器的不同方法。

使用 Bash 交互式 Shell

Bash 是 Linux 系统中常见的命令处理器,它允许用户输入导致操作的命令。如果你与基于 Unix 的系统或 WSL 进行了一些交互,你可能会通过 bash 与各种命令进行交互。

同样,我们也可以直接访问 docker 容器中的 Linux 终端并执行命令,就像使用普通 Linux bash 一样。这种方法的一个优点是我们可以使用未运行的容器来执行此操作,这与诸如 docker exec 命令之类的其他命令不同。

如下所示,我们将使用来自 docker 注册表的官方 rabbitmq 映像来创建一个 docker 容器并直接访问容器内的 bash。你可以使用任何其他命令执行此操作;你要确保事先拥有该镜像。

docker pull rabbitmq
docker images

现在我们有了镜像,我们可以交互地创建 docker 容器。这意味着我们可以在运行的同时在 docker 容器内运行命令,如下所示。

$ docker run -it rabbitmq bash

输出:

root@f418a3286aae:/#

如你所见,我们现在位于 docker 容器中,并且我们成功地在新容器中运行了 bash。现在我们可以像使用真正的终端一样执行命令了。

例如,我们可以列出这个容器内的文件和目录,如下所示。

root@f418a3286aae:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys  tmp  usr  var
root@f418a3286aae:/#

使用 docker exec 命令

或者,我们也可以使用 docker exec 命令在新的 docker 容器中运行 bash。但是,与之前的方法不同,此命令要求我们已经让容器运行;否则,该命令将不起作用。

使用 docker ps -a 命令确认我们的容器正在运行。如果你要使用的容器没有运行,你可能需要使用 docker start 命令后跟容器 ID 或名称来启动它。

docker ps

我们将在 -it 标签旁边使用 docker exec 命令。exec 命令允许我们在运行的容器中执行命令,而 -it 标签允许我们以交互方式打开容器。

我们可以执行如下所示。

$ docker exec -it f418a3286aae bash

输出:

root@f418a3286aae:/# ls
bin  boot  dev  etc  home  isaac  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys tmp  tonyloi  usr  var

现在我们已经在这个 docker 容器中成功启动了 bash,我们可以在容器中运行各种命令。我们也可以对没有 bash 的容器使用 sh

这也是一个命令,它将打开一个基本的 shell 提示,我们可以在容器中运行我们的命令。

$ docker exec -it f418a3286aae sh

输出:

# ls
bin  boot  dev  etc  home  isaac  isaactonyloi  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys  tmp  tonyloi  usr  var

使用 docker attach 命令

我们还可以使用 docker attach 命令在正在运行的 docker 容器中启动 bash。这允许我们使用容器的 ID 将本地标准输入、输出和错误流附加到正在运行的容器。

然后我们可以运行各种命令,接受输入,调试指定的容器。我们需要一个正在运行的容器来附加我们的输出、输入和错误流。

我们可以使用容器名称或 id 来实现这一点,如下所示。

代码:

$ docker container attach f418a3286aae

输出:

root@f418a3286aae:/# ls
bin  boot  dev  etc  home  isaac  isaactonyloi  lib  lib32  lib64  libx32  media  mnt  opt  plugins  proc  root  run  sbin  srv  sys  tmp  tonyloi  usr  var
root@f418a3286aae:/#
Author: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn