如何在Docker中设置一个简单的反向代理?

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

  1. 面向互联网的Nginx容器就像一个反向代理。 他负责将stream量redirect到其他容器,因为不能通过互联网直接访问。
  2. 在nodejs( http://www.node-app.me )中发布networking的Node_js容器。
  3. 发布Java EE应用程序的java_EE容器( http://www.java_ee-app.me )。
  4. 发布Django应用程序的Django容器( http://www.django-app.me )。

这是我的理想,但我不知道如何设置nginx容器扮演代理angular色,并请求正确的容器,以便如果用户发送请求像http://www.node-app.me ,容器nginx将从Node_js返回结果,依此类推。 你能不能从哪里开始呢?

设置可能看起来像这样(对不起,我不擅长绘图): 在这里输入图像说明

除非你对nginx有特殊要求,否则我build议你使用Træfik做反向代理。 它可以configuration为通过容器上的标签dynamic获取反向代理规则。 这是一个基本的例子。

首先,为Træfik和你的三个容器build立一个共同的networking。

docker network create traefik 

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

 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分享一个共同的networking,以便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会dynamic地创build一个前端规则,该规则在www.node-app.meHost头部看到这个容器运行时匹配。 traefik.porttraefik.protocol标签让Træfik知道如何与您的容器沟通。

请参阅TræfikDocker后端的文档以获取更多选项和详细信息。