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

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


当前回答

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

其他回答

对我来说,这个工作得很好(感谢最后的注释指出目录/var/lib/docker/):

chroot /var/lib/docker/containers/2465790aa2c4*/root/

这里,2465790aa2c4是运行容器的短ID(由docker ps显示),后面跟着一个星号。

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

我喜欢的理解容器内部发生什么的方法是:

暴露-p 8000 Docker运行-it -p 8000:8000镜像 在里面启动服务器 python -m SimpleHTTPServer

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

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

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

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

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

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

在我的例子中,除了sh,容器中不支持任何shell。所以,这就像一个魅力

docker exec -it <container-name> sh