如何在docker中设置简单的反向代理?

时间:2017-04-29 23:40:09

标签: nginx docker containers

我是码头工人的新手。我有多个容器上运行的应用程序。现在,我想发布我的所有应用程序。我打算做的是做一个包含我所有应用程序的集群。我想要至少4个容器。

  1. 像反向代理一样面向互联网的Nginx容器。他负责将流量重定向到其他容器,因为无法通过互联网直接访问。
  2. 在nodejs(http://www.node-app.me)中发布网络的Node_js容器。
  3. 发布Java EE应用程序(http://www.java_ee-app.me)的java_EE容器。
  4. 发布Django应用程序(http://www.django-app.me)的Django容器。
  5. 这是我的理想,但我不知道如何设置nginx容器来扮演代理角色并将请求发送到正确的容器,以便在用户发送http://www.node-app.me之类的请求时,容器nginx将返回Node_js的结果,依此类推。你能不能给出从哪里开始的想法?

    设置看起来像这样(抱歉,我不擅长绘图):enter image description here

1 个答案:

答案 0 :(得分:1)

除非您对nginx有特殊需求,否则我建议您使用Træfik来执行反向代理。它可以配置为通过容器上的标签动态获取反向代理规则。这是一个基本的例子。

首先,为Træfik和您的三个容器创建一个通用网络。

docker network create traefik

运行Træfik,暴露端口80并启用docker后端。

docker run --name traefik \
-p 80:80 \
-v /var/run/docker.sock:/var/run/docker.sock \
--network traefik \
traefik:1.2.3-alpine \
--entryPoints='Name:http Address::80' \
--docker \
--docker.watch

使用适当的标签运行您的三项服务。确保他们与Træfik共享一个共同的网络,以便Træfik能够达到它。 node_js可能看起来像这样。

docker run --name node_js \
--network traefik \
--label 'traefik.frontend.rule=Host:www.node-app.me' \
--label 'traefik.frontend.entryPoints=http' \
--label 'traefik.port=80' \
--label 'traefik.protocol=http' \
your_node_js_image

当它看到此容器正在运行时,Træfik将动态创建一个与Host www.node-app.me标头匹配的前端规则。 traefik.porttraefik.protocol标签让Træfik知道如何与您的容器进行通信。

有关更多选项和详细信息,请参阅Træfik's Docker backend的文档。