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

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


当前回答

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

docker exec -it <container-name> sh

其他回答

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

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

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

voilá你在容器内。

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

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

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

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

创建容器之前:

如果你想探索图像的结构,即安装在容器内,你可以这样做

sudo docker image save image_name > image.tar
tar -xvf image.tar

这将使您可以看到图像的所有层及其json文件中的配置。

创建容器后:

对于这个问题,上面已经有很多答案了。我喜欢的方式 这将是

docker exec -t -i container /bin/bash

我想这样做,但我无法执行到我的容器,因为它已经停止,并且由于我的代码中的一些错误而没有重新启动。

对我来说,有效的方法是简单地将整个容器的内容复制到一个新的文件夹中,就像这样:

docker cp container_name:/app/ new_dummy_folder

然后我就可以像使用普通文件夹一样浏览这个文件夹的内容了。

仅适用于LINUX

我使用的最简单的方法是使用proc dir,容器必须运行以检查docker容器文件。

找出容器的进程id (PID)并将其存储到某个变量中 PID=$(docker inspect -f '{{. state。Pid}} ' your-container-name-here) 确保容器进程正在运行,并使用变量名进入容器文件夹 cd /proc/$ PID /根

如果您想在不找到PID编号的情况下访问dir,只需使用这个长命令

cd /proc/$(docker inspect -f '{{.State.Pid}}' your-container-name-here)/root

小贴士:

进入容器后,您所做的一切都会影响容器的实际进程,例如停止服务或更改端口号。

希望能有所帮助

注意:

此方法仅在容器仍在运行时有效,否则,如果容器已停止或删除,则目录将不再存在