Skip to content

Docker - 容器与 Shell

容器是 Docker 镜像的活实例。一旦运行一个镜像,您通常需要与正在运行的容器进行交互,也许是为了在其中执行命令或管理其生命周期。

您可以使用 docker run 命令并配合 -it 标志来启动一个容器并立即获得一个交互式 shell。

# 示例:启动一个 Ubuntu 容器并获取 bash shell
docker run -it ubuntu bash
  • -i (interactive,交互式):即使未附加,也保持 STDIN 打开。
  • -t (tty):分配一个伪终端 (pseudo-TTY)。

以这种方式启动的交互式容器会话中,您可以在其中运行命令,就像登录到那个系统一样。要不停止容器而退出 shell,请使用分离序列:Ctrl+P 后跟 Ctrl+Q。

如果您只是输入 exit 或按下 Ctrl+D,主进程(此处为 bash)将终止,容器也会停止。

在运行中的容器中执行命令 (docker exec)

Section titled “在运行中的容器中执行命令 (docker exec)”

在已经运行的容器中运行命令的标准且最灵活的方式是使用 docker exec。这对于调试、检查日志或执行管理任务非常有用,而无需停止和重新启动容器。

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  • -i, --interactive:保持 STDIN 打开。
  • -t, --tty:分配一个伪终端 (pseudo-TTY)。
  • -d, --detach:在后台运行命令。
  • -w, --workdir:指定容器内的工作目录。

首先,在后台启动一个容器(使用 -d 进入分离模式):

# 在后台启动一个名为 'my-webserver' 的 nginx 容器
docker run -d --name my-webserver nginx:stable-alpine

现在,使用 docker exec 与其交互:

# 在 'my-webserver' 容器内部获取交互式 bash shell
docker exec -it my-webserver sh # Alpine 镜像默认使用 'sh'
# 运行单个命令(列出 /usr/share/nginx/html 中的文件)
docker exec my-webserver ls /usr/share/nginx/html
# 非交互式地检查 nginx 版本
docker exec my-webserver nginx -v

对于通用交互,docker exec 比 nsenter 或直接附加到容器主进程等旧方法更受欢迎,因为它更简单且专为此任务构建。

附加到运行中的容器 (docker attach)

Section titled “附加到运行中的容器 (docker attach)”

docker attach 命令将您终端的标准输入、输出和错误流连接到正在运行的容器的主进程(Dockerfile 中由 CMD 或 ENTRYPOINT 指定的进程)。这与 docker exec 不同。

docker attach CONTAINER

主要在需要直接与容器主运行应用程序交互时使用 docker attach,特别是当它设计为交互式使用或您想查看其直接输出时。请谨慎:退出附加会话通常会使容器停止,如果主进程终止的话。

对于获取 shell 或运行任意命令,docker exec 几乎总是更好的选择。