Docker: 容器如何在容器中没有卷的情况下持久化数据?
Docker: How a container persists data without volumes in the container?
我是 运行 在 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-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
时,您会对其进行快照(包括您对文件所做的更改)并从中创建一个新图像。他们以这种方式实现数据持久化。
您引用的文档详细解释了这一点。