在docker中的容器之间共享数据库的最佳做法是什么?

时间:2016-02-24 09:03:06

标签: docker

有没有人知道在docker中容器之间共享数据库的最佳做法是什么?

我的意思是我想在docker中创建多个容器。然后,这些容器将在具有相同标识的同一数据库上执行CRUD。

到目前为止,我有两个想法。一个是创建一个单独的容器来运行数据库。另一个是直接在安装了docker的主机上安装数据库。

哪一个更好?或者,这个要求还有其他最佳实践吗?

由于

3 个答案:

答案 0 :(得分:16)

很难回答最佳做法'问题,因为这是一个意见问题。 Stack Overflow上的观点不合适。

因此,我将提供一个具体的示例,说明我在已经在严肃部署中完成的工作。

我正在运行ELK(Elasticsearch,Logstash,Kibana)。它是集装箱化的。

对于我的数据存储,我有存储容器。这些存储容器包含本地文件系统传递:

docker create -v /elasticsearch_data:/elasticsearch_data --name ${HOST}-es-data base_image /bin/true

我还使用etcdconfd来动态重新配置指向数据库的服务。 etcd允许我存储键值,因此处于一个简单的级别:

CONTAINER_ID=`docker run -d --volumes-from ${HOST}-es-data elasticsearch-thing`
ES_IP=`docker inspect $CONTAINER_ID | jq -r .[0].NetworkSettings.Networks.dockernet.IPAddress`
etcdctl set /mynet/elasticsearch/${HOST}-es-0

因为我们在etcd注册了它,我们可以使用confd来监视键值存储,监视它的更改,然后重写并重新启动其他容器服务。

我有时使用haproxy,而nginx当我需要更复杂的东西时。这两个版本都允许您指定主机设置以发送'流量,并具有一些基本的可用性/负载平衡机制。

这意味着我可能对重新启动/移动/添加elasticsearch节点非常懒惰,因为注册过程会更新整个环境。类似于此的机制是用于openshift的内容。

所以要专门回答你的问题:

  • DB打包在容器中,原因与其他元素相同。
  • 数据库存储卷是通过本地文件系统的存储容器。
  • '发现'数据库是通过父主机上的etcd完成的,但是我已经最小化了我的安装空间。 (我为docker主机提供了一个通用的“安装”模板,尽量避免在其中添加任何额外内容)

我的意见如果您依赖具有(特定)数据库实例的本地主机,那么docker的优势将大大减少,因为您已经不再拥有能够进行打包测试 - 部署,或者“旋转”。几分钟内的新系统。

(上面的例子 - 我字面上在10分钟内重建了整个事情,其中​​大部分是docker pull传输图像)

答案 1 :(得分:6)

这取决于。一个有用的事情是将数据库URL和密码保存在环境变量中,并在运行容器时将其提供给Docker。这样,您可以随时连接到数据库,无论它位于何处。例如。在测试期间和生产中的专用服务器上运行。

答案 2 :(得分:4)

最佳做法是使用Docker Volumes。

Official doc: Manage data in containers。本文详细介绍了如何处理数据库和容器。通常的方法是将DB放入容器(实际上不是容器而是),然后其他容器可以访问此DB容器()CRUD(或更多)数据。

Random article on "Understanding Docker Volumes"

修改由于the other answer做得好,我不会详细说明。