在一台主机上运行两个docker在nginx后面构建应用程序的最佳方法是什么?

时间:2017-03-13 05:10:30

标签: nginx docker docker-compose

我有两个docker-compose应用程序:

  • a.com
  • b.com

我想在同一台主机上运行它们,并放置一个nginx容器代理,将传入的请求路由到每个docker-compose应用程序中的正确服务。

我想我需要一个单独的nginx容器与两个docker-compose应用程序分开运行。我以前使用nginx-proxy,但我的路由更复杂,所以我想现在运行自己的nginx实例。

  • 我无法解决如何将这两个应用程序和nginx容器联网以使这一切都以理智的方式工作。
  • 当我docker run我获得的nginx容器时:host not found in upstream "MY_CONTAINER_HOST_NAME",这表明我的应用主机名不是从nginx容器中解析的。
  • 如果需要,我可以发布我的nginx配置,但这确实是一个码头网络/最佳实践问题。

2 个答案:

答案 0 :(得分:1)

nginx-proxy应该足够好,前提是它支持docker swarm附加网络(issue 520,仍处于待处理状态)

您还可以考虑使用vfarcic/docker-flow-proxy,这是每次部署新服务或缩放服务时重新配置代理的简便方法。

参见" Integrating Proxy With Docker Swarm (Tour Around Docker 1.12 Series)"举一个具体的例子。

答案 1 :(得分:1)

我可以想到两个选项:

首先:

在同一个docker用户定义的网络中运行apps和nginx。为此,您需要首先创建一个用户定义的网络:

docker network create appnet

然后更改您的docker文件以将appnet网络用作外部网络(外部网络不会创建网络并使用现有网络)

<强>第二

创建2个用户定义的网络,名为appnet1和appnet2,将a.com连接到appnet1,将b.com连接到appnet2,标记为docker-compose中的外部网络。然后调出nginx并将其附加到appnet1和appnet2。

  

当我的docker运行nginx容器时,我得到:找不到主机   上游“MY_CONTAINER_HOST_NAME”,表示我的应用主机名   没有从nginx容器中解析。

请注意:用户定义的网络将提供内部DNS,因此您可以按容器名称在同一网络上调用容器。

外部网络示例:

如果您希望容器加入预先存在的网络,请使用外部选项:

networks:
  default:
    external:
      name: my-pre-existing-network

Compose不会尝试创建一个名为[projectname] _default的网络,而是寻找一个名为my-pre-existing-network的网络,并将应用程序的容器连接到它上面