进入Docker容器Shell的方法

进入Docker容器Shell的方法

技术背景

在使用Docker进行开发和部署过程中,有时需要进入容器的Shell环境,以便检查容器内部的文件系统、运行命令、调试应用程序等。例如,在使用WordPress基础镜像和docker-compose时,可能需要进入容器查看初始构建时创建的文件和目录。

实现步骤

1. 使用docker exec命令

这是最常用的方法,适用于正在运行的容器。docker exec可以在现有容器内运行任意命令。

1
docker exec -it <mycontainer> sh

其中,-i选项保持标准输入打开,-t选项分配一个伪终端设备,-it组合使用可获得交互式Shell。<mycontainer>是目标容器的名称或ID,可以通过docker ps命令查看。
示例:

1
2
3
4
5
6
7
8
$ docker ps
d2d4a89aaee9 larsks/mini-httpd "mini_httpd -d /cont 7 days ago Up 7 days web

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

2. 使用docker compose exec命令

如果你使用的是docker compose,可以使用docker compose exec命令,它默认具备-i-t的行为,并且允许通过compose.yaml文件中的服务名称来引用容器。
例如,有如下compose.yaml文件:

1
2
3
services:
web:
image: docker.io/alpinelinux/darkhttpd

可以使用以下命令进入容器:

1
docker compose exec web sh

等效的docker exec命令可能是:

1
docker exec -it myproject-web-1 sh

3. 容器已退出的情况

如果容器已经退出,可以使用docker run命令创建一个新容器并进入其Shell:

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

或者:

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

其中,--rm选项表示容器结束时自动删除,-it选项使容器以交互式模式运行并分配伪终端,--entrypoint选项指定容器的入口点为Shell程序,image_name是Docker镜像的名称。

4. 使用SSH进入容器(不常用)

如果确实需要使用SSH进入容器,需要在容器内进行一些设置:

1
2
3
4
5
6
7
8
9
10
11
12
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)

然后可以使用SSH客户端连接到容器:

1
ssh -X username@IPADDRESS

核心代码

以下是一些常用的进入容器Shell的命令示例:

1
2
3
4
5
6
7
8
# 使用docker exec进入正在运行的容器
docker exec -it <container_name_or_id> sh

# 使用docker compose exec进入容器
docker compose exec <service_name> sh

# 容器已退出时创建新容器并进入
docker run --rm -it --entrypoint /bin/bash <image_name>

最佳实践

  • 选择合适的Shell:不同的容器可能使用不同的Shell,如bashshash等。对于基于Alpine Linux的容器,可能没有bash,可以使用shash
  • 使用别名:可以在~/.bash_profile等文件中设置别名,简化进入容器的命令。例如:
1
2
3
4
#usage: dbash [container_id]
dbash() {
docker exec -it "$1" /bin/bash
}

这样,就可以使用dbash [container_id]来进入容器。

常见问题

  • docker exec命令失败:如果容器中没有要执行的命令,会导致docker exec命令失败。例如,容器中没有sh,会出现类似以下的错误:
1
2
OCI runtime exec failed: exec failed: unable to start container process:
exec: "sh": executable file not found in $PATH: unknown

此时需要检查容器中可用的命令,或者考虑其他方法。

  • docker attach连接到错误的输出docker attach会连接到容器的标准输出,如果容器正在运行Web服务器等进程,可能会连接到该进程的输出,而不是获得一个Shell。因此,通常不使用docker attach来进入容器的Shell。

进入Docker容器Shell的方法
https://119291.xyz/posts/2025-04-22.methods-to-access-docker-container-shell/
作者
ww
发布于
2025年4月23日
许可协议