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

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


当前回答

这将为映像启动一个bash会话:

Docker运行——rm -it——entrypoint=/bin/bash

其他回答

试着用

docker exec -it <container-name> /bin/bash

有可能bash没有实现。你可以用这个

docker exec -it <container-name> sh

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

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

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

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

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

如果容器停止或没有shell(例如,安装指南中提到的hello-world,或non-alpine traefik),这可能是探索文件系统的唯一可能方法。

你可以将容器的文件系统归档到tar文件中:

docker export adoring_kowalevski > contents.tar

或者列出文件:

docker export adoring_kowalevski | tar t

请注意,根据映像的不同,这可能需要一些时间和磁盘空间。

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

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

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

我使用了另一个肮脏的技巧,即aufs/devicemapper不可知论。

我查看容器正在运行的命令,例如docker ps 如果它是apache或Java,我只做以下事情:

sudo -s
cd /proc/$(pgrep java)/root/

voilá你在容器内。

基本上你可以作为根cd到/proc/<PID>/root/文件夹,只要这个进程是由容器运行的。注意符号链接将没有意义的使用这种模式。