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

Xia*_* Ye 18 docker

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

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

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

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

谢谢

Sob*_*que 17

很难回答"最佳实践"问题,因为这是一个意见问题.Stack Overflow上的观点不合适.

所以,我会给我一个具体的例子已经处于严重的部署完成.

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

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

docker create -v /elasticsearch_data:/elasticsearch_data --name ${HOST}-es-data base_image /bin/true
Run Code Online (Sandbox Code Playgroud)

我也在使用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
Run Code Online (Sandbox Code Playgroud)

因为我们注册它etcd,然后我们可以confd用来观察键值存储,监视它的变化,并重写和重新启动我们的其他容器服务.

haproxy有时会使用它,nginx当我需要更复杂的东西时.这两种方法都允许您指定"发送"流量的主机集,并具有一些基本的可用性/负载平衡机制.

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

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

  • DB被打包在容器中,原因与其他元素相同.
  • 数据库存储卷是通过本地文件系统的存储容器.
  • "查找"数据库是通过etcd父主机完成的,但是否则我已经最小化了我的安装空间.(我有一个针对docker主机的常见'install'模板,尽量避免在其中添加额外的东西)

认为,如果您依赖于具有(特定)数据库实例的本地主机,则docker的优势将大大减少,因为您已无法再进行打包测试 - 部署或"旋转"几分钟内的新系统.

(上面的例子-我已经从字面上重建整个事情在10分钟内,最的那是docker pull转印图像)


Dag*_*ahl 6

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


Auz*_*ias 5

最佳实践是使用Docker Volumes。

官方文档:管理容器中的数据。该文档详细介绍了如何处理数据库和容器。这样做的通常方法是将数据库放入一个容器(实际上不是容器,而是一个),然后其他容器可以访问该DB容器(该)以CRUD(或更多)数据。

关于“了解Docker卷”的随机文章

编辑我不会进一步详述,因为其他答案都做得很好。