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
),而不是可以根据用户或父目录上下文更改的路径,以避免出现此类问题的可能性。
使用标准主机目录作为数据卷不应导致数据自发回滚。如果它不是上面提到的目录上下文的问题,那么它可能涉及一些其他因素,例如有人恢复文件系统快照、恢复备份或直接更改数据库。
今天我有一个悲伤的故事。 我丢失了自周六以来所做的所有数据库更改。
我们使用 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
),而不是可以根据用户或父目录上下文更改的路径,以避免出现此类问题的可能性。
使用标准主机目录作为数据卷不应导致数据自发回滚。如果它不是上面提到的目录上下文的问题,那么它可能涉及一些其他因素,例如有人恢复文件系统快照、恢复备份或直接更改数据库。