为什么`docker diff`无法看到某些文件更改?

40次阅读
没有评论

问题描述

在Docker容器创建时,Docker引擎会在镜像层之上添加一个薄的可写层。所有的文件系统更改都记录在该可写层中。可以使用docker diff命令来显示容器文件系统与基础镜像之间的更改。然而,在以下涉及官方MongoDB镜像的用例中,我却无法看到数据保存的位置。

sudo docker run -d --name mongo mongo:3.6.10
sudo docker exec -i mongo mongo << EOF
db.test.insert({foo:"bar"})
EOF
sudo docker stop mongo
sudo docker diff mongo

在上述示例中,使用docker exec命令在MongoDB容器内插入数据,然后停止容器并使用docker diff命令查看更改。然而,我无法在输出中找到MongoDB服务器修改的数据文件的任何痕迹。尽管如此,数据肯定被存储了起来。

sudo docker start mongo
sudo docker exec -i mongo mongo << EOF
db.test.find()
EOF

在手动转储文件时,我可以找到数据:

sudo docker exec mongo bash -c 'tar c /data/db/collection*' | hexdump -C | grep foo

为什么我无法使用docker diff找到MongoDB服务器修改的数据文件?我是否在某处做了错误的假设?或者我是否在理解docker diff工作方式时出现了误解?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

默认存储数据位置

问题中的困惑在于,为什么使用docker diff无法看到MongoDB容器中的数据更改。这是因为默认情况下,MongoDB镜像将数据存储在Docker管理的卷中,而不是容器的可写层中。这就解释了为什么docker diff未显示与数据相关的更改。

MongoDB数据存储

MongoDB官方镜像在其文档中指出,默认情况下,数据是存储在Docker卷中的。Docker卷是一种特殊的存储机制,用于持久化存储容器数据,不受容器生命周期的影响。这使得数据可以在容器被销毁后仍然保留,并且不会受到docker diff等命令的影响。

要查看MongoDB数据的更改,您需要查看Docker卷中的内容,而不是查看容器的可写层。您可以使用类似于您在手动转储文件时所展示的方法来检查Docker卷中的数据。

总结

通过理解MongoDB官方镜像的默认数据存储机制,我们可以解释为什么使用docker diff无法看到数据更改。数据存储在Docker卷中,而不是容器的可写层,这保证了数据的持久性和稳定性。如果您需要查看数据更改,您需要查看Docker卷中的内容。

请注意,将数据存储在Docker卷中是一个良好的实践,特别是对于持久性和数据安全性非常重要的应用程序,如数据库。

正文完