我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
创建容器之前:
如果你想探索图像的结构,即安装在容器内,你可以这样做
sudo docker image save image_name > image.tar
tar -xvf image.tar
这将使您可以看到图像的所有层及其json文件中的配置。
创建容器后:
对于这个问题,上面已经有很多答案了。我喜欢的方式 这将是
docker exec -t -i container /bin/bash
其他回答
您可以使用dive与TUI交互查看图像内容
https://github.com/wagoodman/dive
现有的答案都没有解决容器退出(并且不能重新启动)和/或没有安装任何shell(例如disroless的)的情况。只要你有对Docker主机的根权限,它就可以工作。
对于真正的手动检查,首先找出层id:
docker inspect my-container | jq '.[0].GraphDriver.Data'
在输出中,您应该看到如下内容
"MergedDir": "/var/lib/docker/overlay2/03e8df748fab9526594cfdd0b6cf9f4b5160197e98fe580df0d36f19830308d9/merged"
导航到这个文件夹(作为根目录)以找到容器文件系统的当前可见状态。
你可以在容器中运行bash: 运行ubuntu /bin/bash
对我来说,这个工作得很好(感谢最后的注释指出目录/var/lib/docker/):
chroot /var/lib/docker/containers/2465790aa2c4*/root/
这里,2465790aa2c4是运行容器的短ID(由docker ps显示),后面跟着一个星号。
我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。
我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:
sudo -s
cd /proc/$(pgrep java)/root/
voilá你在容器内。
基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。