如何进入Docker容器的Shell

如何进入Docker容器的Shell

技术背景

在使用Docker进行开发和部署过程中,有时需要进入容器内部进行调试、查看文件、执行命令等操作。然而,进入Docker容器的Shell并非像传统的SSH连接那样直接,本文将介绍多种进入Docker容器Shell的方法。

实现步骤

使用docker exec命令

docker exec 可以在现有的容器内运行任意命令,若要在容器内运行 bashsh,可使用以下命令:

1
docker exec -it <mycontainer> sh

其中,-i 选项用于保持标准输入(stdin)连接,若不指定 -i,Shell 会直接退出;-t 选项用于分配一个 tty 设备,若不指定 -t,交互式体验会不佳,例如没有 Shell 提示符或作业控制。<mycontainer> 可以是目标容器的名称或 ID,可通过 docker ps 命令获取。

示例

1
2
3
4
5
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web
$ docker exec -it web ip addr
# 或者
$ docker exec -it d2d4a89aaee9 ip addr

使用 docker compose exec 命令

若使用 docker compose,可使用 docker compose exec 命令,它默认具备 -i-t 的行为,且允许通过 compose.yaml 文件中的服务名来引用容器。

1
2
3
4
# compose.yaml
services:
web:
image: docker.io/alpinelinux/darkhttpd
1
docker compose exec web sh

对应的 docker exec 命令可能如下:

1
docker exec -it myproject-web-1 sh

容器已退出的情况

若容器已退出,可使用以下命令创建新容器并进入其 Shell:

1
2
3
$ docker run --rm -it --entrypoint /bin/bash image_name
# 或者
$ docker run --rm -it --entrypoint /bin/sh image_name

--rm 选项表示容器完成后自动删除;-it 选项用于交互式运行容器并分配伪终端;--entrypoint /bin/bash--entrypoint /bin/sh 用于指定容器的入口点为 Shell 程序;image_name 是容器所基于的 Docker 镜像名称。

使用 SSH 进入容器

若确实需要使用 SSH 进入容器,可在容器内执行以下命令进行设置:

1
2
3
4
5
6
7
8
9
apt-get update
apt-get install openssh-server
mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd
useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password
apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

之后,可使用 X11 转发将图形应用程序运行到 SSH 客户端:

1
2
ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

其他方法

  • Windows 系统:在 Windows 上使用 Docker 并想进入容器 Shell,可使用以下命令:
1
winpty docker exec -it <container_id> sh

同时需确保已安装 Git Bash

  • Alpine 镜像:若镜像基于 Alpine,由于 /bin/bash 不存在,可使用以下命令:
1
2
3
docker exec -it 9f7d99aa6625 ash
# 或者
docker exec -it 9f7d99aa6625 sh
  • Windows 容器:要连接到 Windows 容器的 cmd,可使用以下命令:
1
docker exec -it d8c25fde2769 cmd
  • 使用 goinside 工具:可通过以下命令安装 goinside 命令行工具:
1
sudo npm install -g goinside

然后使用以下命令进入 Docker 容器:

1
goinside docker_container_name
  • 使用 opener 工具:对于基于 distroless 基础镜像的容器,可使用 opener 工具进入。需在环境中 添加别名,例如:
1
opener wordpress

或者直接运行:

1
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock artemkaxboy/opener wordpress

核心代码

使用 docker exec 进入容器

1
docker exec -it <container_id_or_name> sh

创建新容器并进入 Shell

1
docker run --rm -it --entrypoint /bin/bash image_name

使用 docker compose exec 进入容器

1
docker compose exec web sh

最佳实践

  • 优先使用 docker exec 命令,因为它简单直接,可在不影响容器原有进程的情况下执行新命令。
  • 若使用 docker compose,使用 docker compose exec 命令可更方便地通过服务名进入容器。
  • 尽量避免在容器中安装 SSH 服务,因为这会增加容器的复杂性和安全风险。

常见问题

容器中没有 shbash

对于一些最小化镜像,可能没有 shbash,可尝试使用其他可用的 Shell,如 ash。若都没有,可考虑使用 opener 工具。

无法获取交互式 Shell

确保在命令中使用 -i-t 选项,若在 Windows 上使用,还需使用 winpty

容器已退出

可使用 docker run 命令创建新容器并进入其 Shell,同时使用 --rm 选项确保容器退出后自动删除。


如何进入Docker容器的Shell
https://119291.xyz/posts/2025-05-15.how-to-get-into-a-docker-containers-shell/
作者
ww
发布于
2025年5月15日
许可协议