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

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


当前回答

对于一个已经运行的容器,你可以这样做:

dockerId=$(docker inspect -f {{.Id}} [docker_id_or_name])

cd /var/lib/docker/btrfs/subvolumes/$dockerId

你必须是root用户才能cd到那个目录。如果您不是root用户,请先输入“sudo su”再执行该命令。

编辑:在v1.3之后,请参阅Jiri的回答-它更好。

其他回答

另一个技巧是使用原子工具来做如下的事情:

mkdir -p /path/to/mnt && atomic mount IMAGE /path/to/mnt

Docker映像将被挂载到/path/to/mnt,以便您检查它。

这个答案将帮助那些(像我一样)想要探索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容器是否正在运行。这对于帮助我找出即使在容器停止运行后也不应该保留的一些残留数据非常重要。

现有的答案都没有解决容器退出(并且不能重新启动)和/或没有安装任何shell(例如disroless的)的情况。只要你有对Docker主机的根权限,它就可以工作。

对于真正的手动检查,首先找出层id:

docker inspect my-container | jq '.[0].GraphDriver.Data'

在输出中,您应该看到如下内容

"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"

导航到这个文件夹(作为根目录)以找到容器文件系统的当前可见状态。

我有一个未知的容器,它正在执行一些生产工作负载,不想运行任何命令。

所以,我使用docker diff。

这将列出容器已更改的所有文件,因此非常适合探索容器文件系统。

如果只获取一个文件夹,你可以使用grep:

docker diff <container> | grep /var/log

它不会显示来自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

小贴士:

进入容器后,您所做的一切都会影响容器的实际进程,例如停止服务或更改端口号。

希望能有所帮助

注意:

此方法仅在容器仍在运行时有效,否则,如果容器已停止或删除,则目录将不再存在