如何进入Docker容器的Shell 技术背景 在使用Docker进行开发和部署过程中,有时需要进入容器内部进行调试、查看文件、执行命令等操作。然而,进入Docker容器的Shell并非像传统的SSH连接那样直接,本文将介绍多种进入Docker容器Shell的方法。
实现步骤 使用docker exec
命令 docker exec
可以在现有的容器内运行任意命令,若要在容器内运行 bash
或 sh
,可使用以下命令:
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 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-servermkdir /var/run/sshdchmod 0755 /var/run/sshd /usr/sbin/sshd useradd --create-home --shell /bin/bash --groups sudo username passwd username apt-get install x11-apps ifconfig | awk '/inet addr/{print substr($2,6)}'
之后,可使用 X11 转发将图形应用程序运行到 SSH 客户端:
1 2 ssh -X username@IPADDRESS xeyes
其他方法 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
或者直接运行:
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 服务,因为这会增加容器的复杂性和安全风险。 常见问题 容器中没有 sh
或 bash
对于一些最小化镜像,可能没有 sh
或 bash
,可尝试使用其他可用的 Shell,如 ash
。若都没有,可考虑使用 opener
工具。
无法获取交互式 Shell 确保在命令中使用 -i
和 -t
选项,若在 Windows 上使用,还需使用 winpty
。
容器已退出 可使用 docker run
命令创建新容器并进入其 Shell,同时使用 --rm
选项确保容器退出后自动删除。