我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
仅适用于LINUX
我使用的最简单的方法是使用proc dir,容器必须运行以检查docker容器文件。
找出容器的进程id (PID)并将其存储到某个变量中 PID=$(docker inspect -f '{{. state。Pid}} ' your-container-name-here) 确保容器进程正在运行,并使用变量名进入容器文件夹 cd /proc/$ PID /根
如果您想在不找到PID编号的情况下访问dir,只需使用这个长命令
cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root
小贴士:
进入容器后,您所做的一切都会影响容器的实际进程,例如停止服务或更改端口号。
希望能有所帮助
注意:
此方法仅在容器仍在运行时有效,否则,如果容器已停止或删除,则目录将不再存在
其他回答
投票最多的答案是好的,除非你的容器不是一个真正的Linux系统。
许多容器(特别是基于go的容器)没有任何标准二进制文件(没有/bin/bash或/bin/sh)。在这种情况下,你需要直接访问实际的容器文件:
效果非常好:
name=<name>
dockerId=$(docker inspect -f {{.Id}} $name)
mountId=$(cat /var/lib/docker/image/aufs/layerdb/mounts/$dockerId/mount-id)
cd /var/lib/docker/aufs/mnt/$mountId
注意:您需要以root用户运行它。
我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。
我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:
sudo -s
cd /proc/$(pgrep java)/root/
voilá你在容器内。
基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。
我有一个未知的容器,它正在执行一些生产工作负载,不想运行任何命令。
所以,我使用docker diff。
这将列出容器已更改的所有文件,因此非常适合探索容器文件系统。
如果只获取一个文件夹,你可以使用grep:
docker diff <container> | grep /var/log
它不会显示来自docker映像的文件。根据您的用例,这可能有用,也可能没用。
在新版本的Docker上,你可以运行Docker exec [container_name],它在你的容器中运行一个shell
因此,要获得容器中所有文件的列表,只需运行docker exec [container_name] ls
在我的例子中,除了sh,容器中不支持任何shell。所以,这就像一个魅力
docker exec -it <container-name> sh