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

dfl*_*str 32 linux filesystems lxc docker

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

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

是否有正确的方法来执行此操作,或者我是否需要修补 Docker 以支持这些类型的安装?

lak*_*tak 16

看看docker export

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

docker export CONTAINER|tar -t
Run Code Online (Sandbox Code Playgroud)

导出:

docker export CONTAINER>snapshot.tar
docker export CONTAINER|tar x PATH-IN-CONTAINER
Run Code Online (Sandbox Code Playgroud)

或者查看一个文件:

docker export CONTAINER|tar x --to-stdout PATH-IN-CONTAINER
# e.g. 
docker export consul|tar x --to-stdout etc/profile
Run Code Online (Sandbox Code Playgroud)

Docker 1.8 支持 cp

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

Usage:  docker cp [options] CONTAINER:PATH LOCALPATH|-
        docker cp [options] LOCALPATH|- CONTAINER:PATH
Run Code Online (Sandbox Code Playgroud)

更新:当你运行它时,你应该 ssh 到你的 docker 机器。

  • 我的图像相当大(数百 MiB),因此这样做来获取单个文件的开销太大。它每次都会创建数百兆字节的文件。 (2认同)

小智 2

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

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

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