我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
我已经注意到,与docker,我需要了解什么发生在容器内或什么文件存在于那里。一个例子是从docker索引中下载图像-你不知道图像包含什么,所以不可能启动应用程序。
理想的情况是能够ssh进入它们或具有同等功能。是否有工具可以做到这一点,或者我对docker的概念错误,认为我应该能够做到这一点。
当前回答
这将为映像启动一个bash会话:
Docker运行——rm -it——entrypoint=/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/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。
我有一个未知的容器,它正在执行一些生产工作负载,不想运行任何命令。
所以,我使用docker diff。
这将列出容器已更改的所有文件,因此非常适合探索容器文件系统。
如果只获取一个文件夹,你可以使用grep:
docker diff <container> | grep /var/log
它不会显示来自docker映像的文件。根据您的用例,这可能有用,也可能没用。
如果容器停止或没有shell(例如,安装指南中提到的hello-world,或non-alpine traefik),这可能是探索文件系统的唯一可能方法。
你可以将容器的文件系统归档到tar文件中:
docker export adoring_kowalevski > contents.tar
或者列出文件:
docker export adoring_kowalevski | tar t
请注意,根据映像的不同,这可能需要一些时间和磁盘空间。
得到最多好评的答案是,当容器实际启动时,它为我工作,但当它不可能运行时,例如,你想从容器中复制文件,这之前已经保存了我:
docker cp <container-name>:<path/inside/container> <path/on/host/>
多亏了docker cp (link),你可以直接从容器中复制,就像它是文件系统的任何其他部分一样。 例如,恢复容器内的所有文件:
mkdir /tmp/container_temp
docker cp example_container:/ /tmp/container_temp/
注意,您不需要指定要递归复制。