同一域名下多个Docker容器使用80端口的问题

8

我的问题与this类似,但只涉及一个域名。

是否可以在同一服务器上运行多个Docker容器,它们都在80端口上,但具有不同的URL路径?

例如:

内部,所有应用程序都托管在同一Docker服务器上。

172.17.0.1:8080 => app1
172.17.0.2:8080 => app2
172.17.0.3:8080 => app3

用户从外部访问应用程序时,将使用以下 URL:

www.mydomain.com                 (app1)
www.mydomain.com/app/app2        (app2)
www.mydomain.com/app/app3        (app3)

你可以使用nginx来设置路由到不同的应用程序。你可以参考这个例子来学习如何做到这一点 - https://dev59.com/kXfZa4cB1Zd3GeqPR3Q0 - lamirap
多个容器不能监听同一个端口。更一般地,只有一个进程可以绑定到一个套接字(ip:port)。您需要使用反向代理(例如nginx)。 - Auzias
@Auzias 他们可以,每个都有自己的网络命名空间,因此它们能够执行完全相同的操作。但是,它们不能全部绑定到主机上的同一端口,因为同一端口只能使用一次。解决方案是将每个容器绑定到主机上的其他端口,并使用例如nginx根据URL进行路由。 - buddy123
1个回答

11

我通过使用nginx反向代理解决了这个问题。

这是nginx容器的Dockerfile

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

这是 nginx.conf 文件:

http {

        server {
              listen 80;

              location / {
                proxy_pass http://app1:5001/;
              }

              location /api/ {
                proxy_pass http://app2:5000/api/;
              }
        }
}

然后我在同一个Docker网络中启动了nginx、app1和app2容器。

请确保在位置和代理路径中包含结尾的/,否则nginx会返回“502:Bad Gateway”错误。

所有请求都通过端口80转发到Docker主机,然后由nginx容器处理,并根据url路径将它们转发到应用容器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接