Docker 数据安全

Docker data safety

今天我有一个悲伤的故事。 我丢失了自周六以来所做的所有数据库更改。

我们使用 mongodb (3.4.1),在这种特殊情况下,它 运行 在其带有映射卷的官方 docker 容器中。

容器是用 docker-compose 创建的,docker-compose.yml 看起来像这样:

version: "2"
services:
        database:
            image: mongo:3.4.1
            restart: always
            container_name: cvs-db
            volumes:
              - ~/data/db:/data/db
            ports:
              - "27017:27017"

~/data/db 只是很久以前创建的普通文件夹。

在我重新启动容器(docker-compose up -d)后,数据恢复到两天前的状态。连删除都消失了。

我们昨天清理了所有集合并开始用真实数据填充它们,现在它包含我们最近删除的所有测试数据。

所以,我的问题是: 1) 如何保护 mongodb 数据免受此类灾难? 2)有人能说出可能导致这些结果的确切条件吗? 3) 如何恢复数据?

编辑:经过一些研究,我认为这是 docker-compose 错误。 但是问题仍然有效:)

查看您的撰写文件,您将源目录引用为相对 ~/data/db。如果您在系统上有多个可以访问该撰写文件的用户帐户(即 root 加上一个指定的用户帐户),那么 "~/data/db" 目录会有所不同 ,具体取决于哪个用户 运行 compose 启动容器。也许在你的环境中发生过类似的事情。

您最好使用主机卷的绝对路径(即 /opt/data/db:/data/db),而不是可以根据用户或父目录上下文更改的路径,以避免出现此类问题的可能性。

使用标准主机目录作为数据卷不应导致数据自发回滚。如果它不是上面提到的目录上下文的问题,那么它可能涉及一些其他因素,例如有人恢复文件系统快照、恢复备份或直接更改数据库。