Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在docker映像中包装DB_Docker - Fatal编程技术网

在docker映像中包装DB

在docker映像中包装DB,docker,Docker,我就是搞不懂。据我所知,docker容器是无状态的,当您停止容器时,任何状态都将丢失。在图像中包装DB的想法和方法是什么?数据是如何保存的?我找不到关于这个话题的明确解释。有人能解释一下基本原理吗 您可以使用Docker的。是Docker将PostgreSQL dockerize的官方文档。在容器中运行的数据库数据必须存储在所谓的卷容器中,或者存储在装载到容器中的主机文件夹中 有关更多信息,请参阅。我不确定是否有明确的解释。其想法是创建两个docker图像。假设您正在运行Postgres,您将创

我就是搞不懂。据我所知,docker容器是无状态的,当您停止容器时,任何状态都将丢失。在图像中包装DB的想法和方法是什么?数据是如何保存的?我找不到关于这个话题的明确解释。有人能解释一下基本原理吗

您可以使用Docker的。是Docker将PostgreSQL dockerize的官方文档。

在容器中运行的数据库数据必须存储在所谓的卷容器中,或者存储在装载到容器中的主机文件夹中


有关更多信息,请参阅。

我不确定是否有明确的解释。其想法是创建两个docker图像。假设您正在运行Postgres,您将创建第一个图像作为数据容器。您可以“docker运行”它,但它不会做任何事情(也许您的命令是sleep infinity,这会让docker感到高兴)。然后,再次运行容器,这次从当前运行的容器装载卷。这会将卷从第一个实例装入第二个实例。下面是我这样做的一个例子:

我首先运行的容器声明了几个卷,这些卷将装载到第二个容器中,下面是我运行第一个容器的方式:

docker run -name abdata tacodata/abroute_docker_db
然后是第二个:

docker run -name pgsql --volumes-from abdata tacodata/abroute_docker_postgres absql 
--volumes from的键出现在您首先从Dockerfile构建映像时,下面是我的第一个映像中的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"]
来自塔科达/阿布鲁码头基地
维修工格雷格·福萨克
运行pip安装web.py
复制PG.sql/usr/local/etc/
复制abinit abadm.py/usr/local/bin/
卷[“/var/lib/postgresql”]
卷[“/etc/postgresql”]
卷[“/run/postgresql”]
入口点[“abinit”]
使用这种技术,当我运行第二个映像并执行--volumes from_first_映像时,将Dockerfile中声明的每个卷从第一个映像装载到第二个映像

从这种方法中可以得到一个有趣的结果,第一个映像可以创建数据库、创建用户等。因此,第二个映像只需要关心应用程序的运行。在我的入口点,我设置了一个文件信号灯。当第一个图像“完成”时,它接触到一个文件,第二个图像等待该文件的创建。因此,在第一个映像完成之前,第二个映像不会启动


说来话长,我和你在一起。这只是解决了问题。不是在运行数据库的容器中有持久数据,而是在另一个容器中有持久数据。

这样的想法是通过与容器共享数据目录来将数据保存在主机上?这是正确的吗?如果这个问题很愚蠢,很抱歉,但是我已经将这个文档红色化了,没有关于整个概念的明确说明,只是有很多模糊的设置。首先,容器中的任何数据都以某种方式存储在主机中,对吗?您可以通过运行
docker inspect
查看详细信息。在这一点上,关键的想法是在容器外部公开容器的目录。我的错误是,我没有提到数据卷,这是用于持久化数据的单独概念。但如果没有这些数据量,如果停止容器,则会丢失映像启动后积累的所有内容。至少我是这样理解的。可能我不对您可以使用
docker run-v:
将主机目录装载到容器中。因此,写入的数据将保留在主机中。感谢您的解释。