有没有人知道在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)
我也在使用etcd和confd动态重新配置指向数据库的服务.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.
所以要专门回答你的问题:
etcd父主机完成的,但是否则我已经最小化了我的安装空间.(我有一个针对docker主机的常见'install'模板,尽量避免在其中添加额外的东西)我认为,如果您依赖于具有(特定)数据库实例的本地主机,则docker的优势将大大减少,因为您已无法再进行打包测试 - 部署或"旋转"几分钟内的新系统.
(上面的例子-我已经从字面上重建整个事情在10分钟内,最的那是docker pull转印图像)
这取决于.一个有用的事情是将数据库URL和密码保存在环境变量中,并在运行容器时将其提供给Docker.这样,您可以随时连接到数据库,无论它位于何处.例如,在测试期间在容器中运行以及在生产中的专用服务器上运行.
最佳实践是使用Docker Volumes。
官方文档:管理容器中的数据。该文档详细介绍了如何处理数据库和容器。这样做的通常方法是将数据库放入一个容器(实际上不是容器,而是一个卷),然后其他容器可以访问该DB容器(该卷)以CRUD(或更多)数据。
编辑我不会进一步详述,因为其他答案都做得很好。
| 归档时间: |
|
| 查看次数: |
11172 次 |
| 最近记录: |