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

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


当前回答

$ docker exec -it <Container-Id> /bin/bash

或者根据外壳

$ docker exec -it <Container-Id> /bin/sh

您可以通过docker ps命令获取容器Id

-i=交互式

-t=分配伪TTY

其他回答

另一种选择是使用nsenter。

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

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

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

如果您正在使用Docker Compose,那么这将使您进入Docker容器。

docker-compose run container_name /bin/bash

在容器中,它会将您带到Dockerfile中定义的WORKDIR。您可以通过以下方式更改工作目录

WORKDIR directory_path # E.g  /usr/src -> container's path

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

注意:这个答案提升了我写的一个工具。

我已经创建了一个容器化的SSH服务器,您可以将其“粘贴”到任何正在运行的容器。这样,您可以使用每个容器创建合成。唯一的要求是容器具有Bash。

以下示例将启动一个连接到名为“mycontainer”的容器的SSH服务器。

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

当您连接到此SSH服务(使用您选择的SSH客户端)时,将在名为“我的容器”的容器中启动Bash会话。

有关更多指针和文档,请参阅:https://github.com/jeroenpeeters/docker-ssh