在主机文件系统中挂载Docker容器内容


24

我希望能够检查Docker容器的内容(只读)。做到这一点的一种优雅方法是将容器的内容装载到目录中。我说的是在主机上安装容器的内容,而不是在容器内的主机上安装文件夹。

我可以看到Docker中现在有两个存储驱动程序:aufs和btrfs。我自己的Docker安装使用btrfs,浏览至/ var / lib / docker / btrfs / subvolumes将显示系统上每个Docker容器一个目录。但是,这是Docker的实现细节,在其他地方挂载-绑定这些目录感觉不对。

是否有适当的方法来执行此操作,或者我需要打补丁Docker以支持此类安装?


将这些绑定到其他地方为什么会出错?
迈克尔·汉普顿

1
因为存储位置是实现细节。当泊坞窗添加另一个存储驱动程序时,该位置将移动。我需要使它成为半自动的,因此使用公共API会很好。
dflemstr 2014年

2
可能值得考虑在nsenter(或docker-enter)上工作以实现您的目标。当然存在必须在容器内检查代码/工具的约束。
VladFr 2014年

有没有办法指示Linux跨容器边界安装?
dflemstr 2014年

@dflemstr是的,--volumes-from kinda可以做到这一点,它似乎是从另一个容器的基本映像和卷中装入目录的并集,但是此行为并未得到记录afaik
TarnayKálmán2014年

Answers:


10

看一看docker export

要快速列出容器中的文件:

docker export CONTAINER|tar -t

出口:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER

还是看一个文件:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile

Docker 1.8支持cp

https://docs.docker.com/reference/commandline/cp/

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH

更新:运行此命令时,应将其SSH到docker机器。


2
我的图像相当大(数百MiB),因此执行此操作来获取单个文件的开销太大。它将每次创建数百兆的文件。
dflemstr

@dflemstr与一起使用该行tar x PATH-IN-CONTAINER,它将仅提取您需要的文件。
laktak 2015年

...但是整个tar存档仍然是在Docker守护进程中创建的,它需要花费几分钟的时间来创建...
dflemstr

@dflemstr不知道您的设置是什么,但是例如docker export ubuntu|tar -t|grep etc/network需要3秒钟。
laktak 2015年

您可能正在与Docker守护程序在同一台机器上运行该文件,因此您无需进行网络传输,并且ubuntu映像确实很小……
dflemstr 2015年

3

您可以使用docker commit将容器的当前状态保留在新映像中,然后从该映像启动交互式容器以检查内容。

从文档中:

将容器的文件更改或设置提交到新映像中可能很有用。这使您可以通过运行交互式Shell调试容器,或将工作数据集导出到另一台服务器。

希望这可以帮助。


2

您可以使用nsenter在容器/命名空间中运行检查程序(可能必须已经包含在容器中)。但是要安装容器文件系统(如在其中看到的那样),必须安装原始映像和所有层(如果是aufs),或者安装设备映射器,btrfs和使用的其他(未来)存储引擎的等效操作,每种情况下都不同。完全按照预期的方式,让docker为您完成工作,并使用nsenter在容器内进行检查,可能会更有效率。

还有其他方法。如果您想查看更改的内容而不是原始映像中的更改,则docker diff将显示该容器中更改了哪些文件。

对于必须持久且可检查的数据,可能更好的模式是将其放在容器中的某个卷中,并将其安装在实际文件系统中,或在纯数据容器中或在同一容器中,但是您可以启动另一个容器,并使用检查程序从中装入这些容器。


1

编辑:我尝试了下面的解决方案,不幸的是,在实践中它对我来说效果不佳。挂载的文件系统无法准确反映容器的文件系统(即使带有cache=no)。我不确定这是根本问题还是我做错了什么。

您可以在docker映像中安装sshd并用于在docker容器上docker exec运行ssh服务(/usr/sbin/sshd -D)(请注意,需要公开docker容器的SSH端口22)。

然后,用于docker cp将您的公共ssh密钥复制到/root/.ssh/authorized_keysdocker容器的目录。

最后,使用docker inspect查找容器的IP地址并使用以下命令挂载容器的文件系统

sudo sshfs -o allow_other,default_permissions,IdentityFile=/path/to/identityfile  root@xxx.xx.x.x:/ /mnt/my_container

您必须编写一个脚本才能使它在实践中舒适地工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.