Docker:容器如何在容器中没有卷的情况下保存数据?

标签 docker persistence

我正在运行 docker-compose 环境中使用的官方 solr 6.6 容器,没有任何相关卷。 如果我修改正在运行的 solr 容器,数据在重新启动后仍然存在。 我没有看到安装任何卷,它适用于普通的 solr 容器:

docker run --name solr_test -d -p 8983:8983 -t library/solr:6.6
docker exec -it solr_test /bin/bash -c 'echo woot > /opt/solr/server/solr/testfile'
docker stop solr_test
docker start solr_test
docker exec -it solr_test cat /opt/solr/server/solr/testfile

上面的示例打印“woot”。我认为容器不会保存任何数据?还有documentation提到 solr 核心持久保存在容器中。 我发现,关于容器持久性,我需要自己添加卷,如提到的 here 。 所以我很困惑:容器是否存储容器内更改的数据? solr 容器如何实现这种行为?我看到的唯一选择是,我误解了 docker 的持久性,或者容器的构建可以设置某种选项来实现这一点,但我不知道,也没有在 solr Dockerfile 中看到。

最佳答案

这是预期的行为。 只要您不删除容器,您在容器内创建的数据就会持续存在。

但要以某种丢弃心态来思考容器。通常,您希望能够使用 docker rm 删除容器并生成一个包含修改后的配置文件的新实例。这就是为什么你需要一个例如此处命名的卷,它在主机上的容器生命周期中持续存在。

Dockerfile,因为你在问题中提到它,实际上只定义了图像。当您调用 docker run 时,您会从中创建一个容器。完全按照图像中的定义。没有任何修改的新实例。

当您在容器上调用docker commit时,您会对其进行快照(包括对文件所做的更改)并从中创建一个新镜像。他们通过这种方式实现了数据持久化。 您引用的文档详细解释了这一点。

关于Docker:容器如何在容器中没有卷的情况下保存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46591660/

相关文章:

java - 使用 java :module scoped resources 使用 EJB 3 和 glassfish 进行 JUnit 测试

java - 管理数据库中的历史记录

docker - 重新连接到Docker容器中正在运行的bash

docker - 如何保存Docker容器?

docker - 在 docker 中运行 vscode

hibernate - 有 hibernate 中批处理的示例吗?

java - 在 ejb 3.0 中声明一个事务

ubuntu - 如何使用多个基础镜像构建一个 docker 镜像

docker - Kubernetes 子域上的访问服务

android - 在android上保存多个图像文件的位置