我开始和Docker合作了。我正在使用WordPress的基本图像和docker合成。

我正在尝试ssh到其中一个容器中,以检查在初始构建期间创建的文件/目录。我试着运行docker compose运行containername ls-la,但没有任何效果。即使是这样,我也希望有一个控制台,在那里我可以遍历目录结构,而不是运行一个命令。使用Docker的正确方法是什么?


当前回答

另一种选择是使用nsenter。

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

其他回答

2022年解决方案

考虑另一种选择

你为什么需要它?

有一堆基于发行版基本映像的现代docker映像(它们也没有/bin/bash/bin/sh),因此无法将exec-it{container name}bash嵌入其中。

如何在任何容器中剥壳

使用开启器:

需要在环境开启器wordpress中添加别名可以在任何地方运行docker run--rm-it-v/var/run/docker.sock:/var/run/dooker.sock artekaxboy/opener wordpress

您可以使用要连接的任何容器的名称、id或图像名称,而不是wordpress


它的工作原理

Opener是一组打包成docker图像的python脚本。它通过任何唯一属性(名称、id、端口、图像)查找目标容器,并尝试使用bash连接到目标。如果找不到bash,则开启器尝试使用sh进行连接。最后,如果找不找到sh,则任何一个开启器都会将busybox安装到目标容器中,并使用busybox shell连接到目标,在断开连接时,开启器会删除busybox。

历史笔记:在我写下这个答案时,问题的标题是:“如何将ssh插入docker容器?”

正如其他答案所证明的,使用docker exec而不是SSH在本地可访问的运行容器中执行预安装的命令(包括shell)并与之交互是很常见的:

docker exec -it (container) (command)

注:以下答案基于Ubuntu(2016年)。对于非Debian容器,需要对安装过程进行一些翻译。

比方说,出于您自己的原因,您确实希望使用SSH。这需要几个步骤,但可以做到。以下是在容器内运行的命令,用于设置它。。。

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客户端来运行图形应用程序(如果它们安装在容器中):

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

以下是一些相关资源:

openssh服务器不会在Docker容器中启动如何在后台模式下将bash或ssh导入正在运行的容器?你能在Linux Docker容器中运行GUI应用程序吗?通过搜索可以找到其他有用的图形访问方法:Docker X11如果你在Docker容器中运行SSHD,你就错了!

您可以通过传递选项-ti与docker容器中的终端交互

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

-t代表终端-i代表交互式

使用以下命令启动Docker容器中的会话:

sudo docker exec -i -t (container ID) bash

要检查文件,请运行docker run-it<image>/bin/sh以获得交互式终端。图像列表可以通过docker图像获得。与docker exec相反,这种解决方案也适用于图像未启动(或运行后立即退出)的情况。