Contents

在Alpine 容器中启动shell

1. 概述

在本教程中,我们将研究如何在新的或正在运行的 Alpine Docker 容器中启动 shell。

2.简介

Docker 容器通常作为服务在后台运行,由 Docker 守护进程管理。但是,有时我们需要在容器环境中做一些事情,例如修改配置文件或安装额外的工具。我们可以使用容器中的交互式 shell 进程执行这些任务。

我们将演示如何使用docker rundocker exec等 Docker 命令来实现这一点。

3. 在 Alpine 容器中启动 Shell

Alpine 是最轻量级的 Linux 发行版。由于体积小,许多人使用 Alpine 作为他们的基础镜像。虽然我们在本文中使用的是 Alpine 容器,但这种方法也适用于其他 Docker 容器。

3.1. 在新容器中启动 Shell

要在新的 Alpine 容器中启动 shell 会话,让我们在终端中输入以下命令:

$ docker run -it alpine /bin/sh

现在让我们分解命令: 首先,docker run是一个 Docker 命令,用于创建 Docker 容器,语法如下:

docker run [OPTIONS] IMAGE[:tags] [COMMAND]

在我们的例子中,我们已经指示 Docker 创建一个基于图像alpine 的容器,并使用*-it标志运行命令/bin/sh*。

3.2. -it标志

如果我们在没有*-it*标志的情况下启动 shell 进程,容器将启动,然后几乎立即以状态 0 退出。在我们继续之前,了解 Docker 如何处理容器的标准 I/O 流 是很有用的。

根据文档,如果我们不添加 -a 选项,以前台模式运行的 Docker 容器 将仅附加其标准输出流 (STDOUT) 和标准错误流 (STDERR)。除此之外,我们还必须认清几个事实:

  • 如果容器内没有更多活动进程,则 Docker 容器将以状态 0 退出
  • 我们可以 以交互模式或非交互模式运行 shell 进程。在交互模式下,shell 通过终端上的标准输入流 (STDIN) 侦听命令。另一方面,在非交互模式下,shell 执行传递给它的脚本并退出

docker run命令文档 中,我们可以看到标志*-i将“保持 STDIN 打开,即使没有附加”。另一方面,标志-t*将为该容器进程分配一个伪终端。使用-it,我们可以启动一个正在侦听 STDIN 的交互式 shell 进程**。分配的伪终端将允许我们向 shell 进程的 STDIN 发送命令。

3.3. 在正在运行的容器中启动 Shell

要在正在运行的容器中启动 shell 进程,我们可以使用以下命令:

$ docker exec -it <container-name> /bin/sh

其中container-name应替换为容器名称或容器 ID。同样,我们在这里使用*-it*标志以交互模式启动 shell 进程。

请注意,要在正在运行的容器中启动 shell 进程,我们使用docker exec而不是docker run

3.4. 退出 Shell

最后,我们可以使用exit命令退出 shell,这将结束容器中的 shell 进程:

/# exit