我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
现有的答案都没有解决容器退出(并且不能重新启动)和/或没有安装任何shell(例如disroless的)的情况。只要你有对Docker主机的根权限,它就可以工作。
对于真正的手动检查,首先找出层id:
docker inspect my-container | jq '.[0].GraphDriver.Data'
在输出中,您应该看到如下内容
"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"
导航到这个文件夹(作为根目录)以找到容器文件系统的当前可见状态。
其他回答
我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。
我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:
sudo -s
cd /proc/$(pgrep java)/root/
voilá你在容器内。
基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。
如果容器停止或没有shell(例如,安装指南中提到的hello-world,或non-alpine traefik),这可能是探索文件系统的唯一可能方法。
你可以将容器的文件系统归档到tar文件中:
docker export adoring_kowalevski > contents.tar
或者列出文件:
docker export adoring_kowalevski | tar t
请注意,根据映像的不同,这可能需要一些时间和磁盘空间。
如果您使用的是Docker v19.03,请按照以下步骤操作。
# find ID of your running container:
docker ps
# create image (snapshot) from container filesystem
docker commit 12345678904b5 mysnapshot
# explore this filesystem
docker run -t -i mysnapshot /bin/sh
在我的例子中,除了sh,容器中不支持任何shell。所以,这就像一个魅力
docker exec -it <container-name> sh
我喜欢的理解容器内部发生什么的方法是:
暴露-p 8000 Docker运行-it -p 8000:8000镜像 在里面启动服务器 python -m SimpleHTTPServer