如何设计Docker路由和数据库层?

如何设计Docker路由和数据库层?,docker,Docker,我想在运行CentOS的单个docker主机上托管一些Django。我想要三层 网络 应用 数据库 网络:我希望网络层有一个nginx容器,将请求路由到应用层的不同容器。我打算在这个docker容器中使用1:1端口映射,将主机上的端口80公开给容器。Nginx将直接请求端口8001-8010上运行的应用层中的相应应用程序 应用程序:我有几个容器,每个容器运行一个单独的django应用程序,使用Gunicorn在端口8001-8010上运行 数据库:一个运行MySQL的容器,每个应用都有不同的

我想在运行CentOS的单个docker主机上托管一些Django。我想要三层

  • 网络
  • 应用
  • 数据库
网络:我希望网络层有一个nginx容器,将请求路由到应用层的不同容器。我打算在这个docker容器中使用1:1端口映射,将主机上的端口80公开给容器。Nginx将直接请求端口8001-8010上运行的应用层中的相应应用程序

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

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

我知道你可以链接容器。但据我所知,我认为这取决于容器启动的顺序,即:在尚未启动的情况下,如何将nginx链接到多个容器

所以我的问题是

  • 当应用程序中容器的数量/名称不断变化时,如何将网络层连接到应用程序层。ie:我可能会在线/离线带来一个新的应用程序。我将如何更新nginx配置,以及地址是什么样的

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

  • 是否有我可以利用的参考体系结构


  • Docker不支持动态链接,但有一些工具可以为您做到这一点,请参阅

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

    -link db:db
    

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

    我最终使用了以下解决方案:


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

    谢谢,您提供的链接讨论了如何使用领事或etcd。那些在操作系统DNS名称解析级别不起作用,是吗?ie:我的nginx配置文件或django如何在不重写代码的情况下连接到etc端点。是一个分布式键值存储和领事、SkyDNS等,在etcd上构建DNS。AkyDNS应该适用于所有Docker contaienr,根据以下声明:“我们设置skydns将其名称服务器绑定到docker0网桥,以便可用于容器。”我不知道nginx是否可以处理此问题,也许您最终会使用这些或。