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

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


当前回答

docker exec-it<container_id或name>bash

OR

docker exec-it<container_id或name>/bin/bash

其他回答

Use:

docker attach <container name/id here>

另一种方法(尽管有危险)是使用attach,但如果按Ctrl+C退出会话,也会停止容器。如果您只是想看看发生了什么,请使用docker-logs-f。

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)

在我的情况下,出于某些原因,我需要检查每个容器中所有涉及网络的信息。因此,以下命令必须在容器中有效。。。

ip
route
netstat
ps
...

我检查了所有这些答案,没有一个对我有用。我在其他网站上搜索过信息。我不会在这里添加超级链接,因为它不是用英语编写的。因此,我只是为与我有相同要求的人发布了一个总结解决方案。

假设您有一个名为light test的运行容器。按照以下步骤操作。

docker inspect light test-f{{.NetworkSettings.SandboxKey}}。此命令将得到类似/var/run/docker/netns/xxxx的回复。然后是ln-s/var/run/docker/netns/xxxxx/var/run/netns/xxxx。目录可能不存在,请先执行mkdir/var/run/netns。现在您可以执行ip netns exec xxxx ip addr show来探索容器中的网络世界。

PS.xxxx始终是从第一个命令接收的相同值。当然,任何其他命令都是有效的,即ip netns exec xxxx netstat-antp|grep 8080。

另一种选择是使用nsenter。

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

码头工人组成(码头工人4卢比)

docker-compose exec php bash

我在Linux笔记本电脑上使用Docker for Drupal。运行容器后,我使用“docker compose exec php bash”与容器连接,以便运行drush突击队。这对我来说很好。

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。