我希望能够检查 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。