1

我有一个正在运行的容器,其中一个卷安装到本地主机目录:

    "Mounts": [
        {
            "Source": "/var/lib/postgresql-9.5-docker",
            "Destination": "/var/lib/postgresql/data",
            "Mode": "",
            "RW": true,
            "Propagation": "rprivate"
        }
    ],

如果我想从主机向容器提供数据(例如,一个大的 postgres 转储),直接将文件从主机写入主机目录是否安全

/var/lib/postgresql-9.5-docker/foo/

?

快速测试表明这是有效的(即,如果我 exec bash 进入容器并检查,文件就在那里),但数据一致性是否安全?

笔记:

我知道也可以使用

docker cp /path/to/src <containerid>:/path/to/dest

但在我的具体情况下,当从 Ceph (rbd) 挂载卷时,这不起作用。

4

1 回答 1

2

通过 docker 将文件复制到主机目录将与您期望的主机文件系统一样一致。容器和主机之间有一个非常薄的层。

通过默认驱动程序使用docker 卷local也将提供类似的访问权限,因为这些卷也使用本地主机文件系统。

将文件复制到 docker 容器文件系统将取决于您运行 docker 时使用的存储驱动程序。默认情况下,这是 AUFS(即将成为 OverlayFS),因此在标准文件系统之上还有一个附加层。我不希望这会不太一致,但是由于额外的层,出现问题或错误的可能性更大,而且它的性能也不会像您的本地文件系统那样好。

从主机和容器访问

您从容器中获得的一项功能是主机和容器之间的共享信息。您在容器中所做的一切实际上都发生在主机内核中。所以如果你写锁定一个文件,主机可以看到。如果你有一个文件mmaped 那么它将共享主机全局mmap空间。

从容器和主机访问或写入相同的文件系统都很好。两者之间不会有差异或延迟。

写入同一文件或文件位置的多个进程将具有与任何多进程系统相同的约束。这些进程将需要使用文件锁定或互斥锁,否则可能会交错写入。

于 2016-06-02T10:01:20.353 回答