我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。

理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。


当前回答

如果容器停止或没有shell(例如,安装指南中提到的hello-world,或non-alpine traefik),这可能是探索文件系统的唯一可能方法。

你可以将容器的文件系统归档到tar文件中:

docker export adoring_kowalevski > contents.tar

或者列出文件:

docker export adoring_kowalevski | tar t

请注意,根据映像的不同,这可能需要一些时间和磁盘空间。

其他回答

你可以在容器中运行bash: 运行ubuntu /bin/bash

这个答案将帮助那些(像我一样)想要探索docker卷文件系统的人,即使容器没有运行。

列出正在运行的docker容器:

码头工人ps

=>集装箱ID "4c721f1985bd"

查看本地物理机器上的docker卷挂载点(https://docs.docker.com/engine/tutorials/dockervolumes/):)

Docker inspect -f{{。坐骑}}4 c721f1985bd

=> [/tmp/接触-garren /tmp true rprivate]

这告诉我,本地物理机目录/tmp/container-garren被映射到/tmp docker卷目标。

知道本地物理机器目录(/tmp/container-garren)意味着我可以查看文件系统,无论docker容器是否正在运行。这对于帮助我找出即使在容器停止运行后也不应该保留的一些残留数据非常重要。

如果你正在使用AUFS存储驱动程序,你可以使用我的docker层脚本找到任何容器的文件系统根(mnt)和读写层:

# docker-layer musing_wiles
rw layer : /var/lib/docker/aufs/diff/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f
mnt      : /var/lib/docker/aufs/mnt/c83338693ff190945b2374dea210974b7213bc0916163cc30e16f6ccf1e4b03f

编辑2018-03-28: Docker-layer已被docker-backup取代

我想这样做,但我无法执行到我的容器,因为它已经停止,并且由于我的代码中的一些错误而没有重新启动。

对我来说,有效的方法是简单地将整个容器的内容复制到一个新的文件夹中,就像这样:

docker cp container_name:/app/ new_dummy_folder

然后我就可以像使用普通文件夹一样浏览这个文件夹的内容了。

投票最多的答案是好的,除非你的容器不是一个真正的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用户运行它。