我无法得到它。据我所知,docker容器是无状态的,当你停止容器时,任何状态都将丢失。在Image中包装DB以及如何保存数据的想法和方法是什么?我无法找到关于这个主题的明确解释。有人可以解释基础知识吗?
答案 0 :(得分:3)
在容器内运行的数据库的数据必须存储在所谓的卷容器中,或存储在 mount 到容器中的主机文件夹中。 / p>
有关详细信息,请参阅documentation。
答案 1 :(得分:2)
您可以使用Docker的volume sharing feature来完成。 This是Docker官方文档,用于将PostgreSQL停靠。
答案 2 :(得分:1)
我不确定是否有明确的解释。这个想法是你创建2个泊坞窗图像。假设您正在运行Postgres,您将创建第一个图像作为您的数据容器。你'船坞'运行'它,但它没有做任何事情(也许你的命令是睡眠无限,这将使码头工人高兴)。然后,再次运行容器,这次从当前运行的容器装入卷。这会将卷从第一个实例安装到第二个实例。这是我做的一个例子:
我首先运行的容器声明了几个将在第二个容器上安装的卷,这是我运行第一个容器的方式:
docker run -name abdata tacodata/abroute_docker_db
然后是第二个:
docker run -name pgsql --volumes-from abdata tacodata/abroute_docker_postgres absql
当你从Dockerfile首先构建图像时, - volumes的关键来自于我的第一个图像中的Dockerfile:
FROM tacodata/abroute-docker-base
MAINTAINER Greg Fausak <greg@tacodata.com>
RUN pip install web.py
COPY PG.sql /usr/local/etc/
COPY abinit abadm.py /usr/local/bin/
VOLUME ["/var/lib/postgresql"]
VOLUME ["/etc/postgresql"]
VOLUME ["/run/postgresql"]
ENTRYPOINT ["abinit"]
使用这种技术,当我运行第二个图像,并从the_first_image执行--volumes - 时,将Dockerfile中声明的每个VOLUME从第一个图像安装到第二个图像。
您从这种方法中获得的一个可爱的事情是,第一个图像可以执行诸如创建数据库,创建用户等操作。因此第二个图像只需要关注运行应用程序。在我的ENTRYPOINT中,我设置了一个文件信号量。当第一个图像“完成”时,它会触摸文件,第二个图像会等待创建该文件。所以第二张图像在第一张图像完成之前没有开始。
长篇故事甚至更长,我和你在一起。这简单地解决了问题。我没有在运行数据库的容器中拥有持久数据,而是在不同容器中拥有持久数据。