【问题标题】:How to design Docker routing and database Layer?如何设计 Docker 路由和数据库层?
【发布时间】:2015-02-02 22:51:46
【问题描述】:

我有几个 Django,我想将它们托管在一个运行 CentOS 的 docker 主机上。我想要3层

  • 网络
  • 应用
  • 数据库

network:我想在网络层有一个nginx容器,将请求路由到应用层的不同容器。我在这个 docker 容器中使用 1:1 端口映射将主机上的端口 80 暴露给容器。 Nginx 将使用直接请求到在端口 8001-8010 上运行的应用程序层中的适当应用程序

应用程序:我将有几个容器,每个容器运行一个单独的 django 应用程序,使用 Gunicorn 在端口 8001-8010 上运行

数据库:一个运行 MySQL 的容器,每个应用都有不同的数据库。 MYSQL 容器将有一个与之链接的数据卷以实现持久性。

我知道您可以链接容器。但据我了解,我认为它依赖于容器启动的顺序,即:当它们尚未启动时,如何将 nginx 链接到多个容器。

所以我的问题是

  1. 当应用程序中容器的数量/名称一直在变化时,如何将网络层连接到应用程序层。即:我可能会在线/离线带来一个新的应用程序。我将如何更新 nginx 配置以及寻址方式如何?

  2. 如何将应用层连接到数据库层?我必须使用 Docker 链接吗?在我的 Django 应用程序代码中,我需要使用数据库的主机名来连接。我会为我的 docker 容器的主机名添加什么?能解决吗?

  3. 有没有我可以利用的参考架构?

【问题讨论】:

    标签: docker


    【解决方案1】:

    Docker 不支持动态链接,但有一些工具可以为您执行此操作,请参阅此 SO question

    2.) 您可以先启动数据库容器,然后将所有应用程序容器链接到数据库容器。 Docker 将在启动时创建主机文件(静态地,如果您的数据库容器重新启动并获得另一个 IP,您需要动态链接,请参见上文)。当您像这样链接容器时:

    -link db:db
    

    您可以使用主机名 db 访问容器。

    【讨论】:

    • 谢谢,您提供的链接讨论了使用 consul 或 etcd。那些不在操作系统 DNS 名称解析级别上工作,但不是吗?即:我的 nginx 配置文件或 django 如何在不重写代码的情况下连接到 etc 端点?
    • Consul 使用 etcd consul.io/intro/vs/index.htmlEtcd 是分布式键值存储和 Consule、SkyDNS 等在 etcd 之上构建 DNS。根据以下声明,AkyDNS 应该可用于所有 Docker 容器:“我们设置 skydns 以将其名称服务器绑定到 docker0 网桥,以便容器可以使用它。”我不知道我 nginx 可以处理这个问题,也许你最终会得到这些 hipachevulcand
    【解决方案2】:

    我最终使用了这个解决方案:

    https://github.com/blalor/docker-hosts

    它允许您必须通过主机名引用同一主机上的其他容器。它也是动态的,因为容器上的 /etc/host 文件会随着容器的上升和下降而动态更新。

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多