Docker:将数据从主机复制到已挂载的主机目录,以便从正在运行的容器中访问它

时间:2016-06-02 09:28:41

标签: docker storage docker-volume

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

    "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/

快速测试显示这是有效的(即,如果我执行bash到容器并检查,文件就在那里),但数据一致性是否安全?

注意:

我知道也可以使用

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

但是在我的特定情况下,当从Ceph(rbd)安装卷时,这不起作用。

1 个答案:

答案 0 :(得分:2)

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

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

将文件复制到docker容器文件系统将取决于storage driver you run docker with。默认情况下,这是AUFS(很快将成为OverlayFS),因此标准文件系统上还有一个额外的层。我不希望它不那么一致,但由于额外的层有更多的机会出现问题或错误,它也不会像你的本地文件系统一样表现。

从主机和容器访问

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

从容器和主机访问或写入同一文件系统是可以的。你不会在两者之间产生分歧或延迟。

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