如何推送包含数据的Docker数据库镜像?相关技术疑问
我来帮你逐个理清这些Docker与Mongo数据存储的疑问:
1. 不指定Volume时的存储逻辑、空间问题,以及构建时添加默认数据
- 首先明确:不指定Volume的话,数据不会存在镜像里。Docker镜像是只读的,容器运行时会在镜像之上套一层可写的容器层,Mongo默认会把数据存在这层的
/data/db目录下。 - 空间和可靠性问题确实存在:一方面,容器可写层的空间受限于宿主机给Docker分配的存储配额,容易出现空间不足;另一方面,一旦容器被删除,这层的数据会直接丢失,完全没法恢复;而且容器可写层的IO性能远不如专门的Volume,对于数据库这种IO密集型应用来说,性能会明显下降。
- 当然可以在构建镜像时把默认数据复制进去!比如在你的Dockerfile里加一行:
这样构建出来的镜像就自带默认数据了。这里有个小细节:如果运行容器时挂载了一个空的命名Volume到COPY ./local-default-data /data/db/data/db,Docker会自动把镜像里/data/db的内容复制到这个Volume里(这是Docker的内置特性);但如果挂载的是已有数据的Volume或者本地目录(bind mount),镜像里的默认数据就会被覆盖。
2. 构建阶段挂载Volume的可行性,以及镜像推送后的Volume数据情况
- 构建阶段没法挂载本地Volume到容器里。Docker的构建过程是完全隔离的,构建时只能通过
COPY或ADD命令把本地文件复制到镜像中,没办法直接挂载宿主机的Volume或者命名Volume。挂载Volume只能在运行容器的时候指定,比如用docker run命令:docker run -v my-custom-volume:/data/db mongo - 把镜像推送到Docker Hub后,Volume里的数据绝对不会被包含进去。Volume是Docker管理的外部存储(要么在宿主机本地,要么是远程存储),和镜像本身是完全独立的两个部分。镜像里只包含你构建时的程序、配置和复制进去的文件,Volume里的数据不会被打包进镜像。如果要让其他用户拿到你的默认数据,最好的方式还是把数据直接打包进镜像,或者提供一个初始化脚本,让用户运行容器时自动导入数据。
内容的提问来源于stack exchange,提问作者obesechicken13
相关产品推荐
相关产品推荐

