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

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

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

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

有没有正确的方法可以做到这一点,或者我是否需要修补 Docker 来支持这些类型的挂载?

答案1

看一眼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/engine/reference/commandline/cp/

Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
        docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

更新:运行此程序时,您应该通过 ssh 连接到您的 docker 机器。

答案2

您可以使用docker 提交将容器的当前状态保存在新镜像中,并从该镜像启动交互式容器来检查内容。

来自文档:

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

希望这可以帮助。

答案3

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

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

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

答案4

波德曼可以运行并使用 Docker 镜像。您可以使用它来挂载正在运行或已停止的容器:

prompt:~ # mnt=`podman mount 26e8b85f7a5c`
prompt:~ # ls $mnt
bin  boot  dev  etc  home  lib  ...  tmp  usr  var

其中26e8b85f7a5c是要挂载的容器的 ID。

相关内容