【问题标题】:Docker host port 80 to multiple containersDocker 主机端口 80 到多个容器
【发布时间】:2018-08-11 20:06:30
【问题描述】:

docker 新手..

是否可以在不同的端口支持多个容器但映射到同一个 docker 主机端口 80 ?

我有两个应用程序,一个在 apache 中运行,另一个在 glassfish 服务器上。

我想在 aws 的同一个 linux 实例中运行这两个容器。

有没有可能是这样的:

  • 容器 1 apache EXPOSE 9090
  • 容器 2 glassf EXPOSE 8080
  • docker run -p 80:9090 container1
  • docker run -p 80:8080 container2

已经试过了,明显得到:

Bind for 0.0.0.0:80 failed: port is already allocated

但我想知道它是否可能,如何实现,是否推荐以及为什么?

谢谢

编辑

根据nginx-proxy

运行它的用法:

$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy 然后启动任何你想要代理的容器 env var VIRTUAL_HOST=subdomain.youdomain.com

$ docker run -e VIRTUAL_HOST=foo.bar.com ... 正在运行的容器 代理必须公开要代理的端口,或者使用 EXPOSE Dockerfile 中的指令或使用 --expose 标志给 docker 运行或 docker create。

如果您的 DNS 设置为将 foo.bar.com 转发到正在运行的主机 nginx-proxy,请求将被路由到一个容器 VIRTUAL_HOST 环境变量集。

我执行了以下操作:

docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

然后运行我的一张图片进行测试,但没有运气,我做错了什么:

docker run -e docker run -e VIRTUAL_HOST=my.host my/image

my.host/etc/hosts 中的位置:

127.0.0.1 localhost
127.0.0.1 my.host

另外,my/image 暴露在 8080 这不起作用,测试:my.host/app-context-root throws:

502 Bad Gateway nginx/1.13.12

【问题讨论】:

  • 很高兴能对为什么不赞成投票发表评论...
  • @DavidMaze,不是骗子。已经看到了,这不是一个解决方案。
  • 你问的是如何通过主机上的一个端口反向代理多个虚拟主机?

标签: docker


【解决方案1】:

有没有可能是这样的:

container 1 apache EXPOSE 9090    
container 2 glassf EXPOSE 8080
docker run -p 80:9090 container1
docker run -p 80:8080 container2

答案: 这是不可能的。

当您运行各种 docker 容器时,Docker 主机将根据端口映射将请求重定向到正确的容器,因为所有容器共享相同的主机 IP,并且对所有容器的请求将通过主机 ip 发送,并且只有端口会变化。

您正在尝试的是公开容器的两个不同端口,但将它们映射到同一个端口。

因此,您的第一个容器将启动,但第二个容器不会启动,并且在检查日志时您会看到错误 port already in use

【讨论】:

    【解决方案2】:

    容器 1 apache EXPOSE 9090
    容器 2 glassf EXPOSE 8080 docker run -p 80:9090 容器1 docker run -p 80:8080 容器2

    从上面我看到您的主机的端口 80 已经映射到容器 1,但是您再次尝试将它映射到容器 2,这将不起作用。

    尝试如下端口映射

    docker run -p 9090:80 container1 docker run -p 8080:80 container2

    您的容器 1 和 2 将它们的端口 80 映射到主机的不同端口。

    【讨论】:

      【解决方案3】:

      答案:

      正如您从当前答案开始看到的那样,不可能或不建议实现您正在做的事情。

      您在接口中使用的端口用于将流量分配到正确的目的地。想象一下,如果您的街道上有两栋房屋,邮政编码和门牌号码相同,那么您的送货去哪里?

      最大的问题是,你为什么要这样?显而易见的解决方案是将它们放在单独的端口上 - 任何对 apache 的请求都会转到 apache 端口,反之亦然 glassf

      如果他们必须same 框中被赋予相同的端口号 - 您可以让运行的第二个 docker 实例指向第二个接口(或第二个 IP相同的界面)。这里的权衡是您的 docker 容器将不再位于同一网络上。

      【讨论】:

        猜你喜欢
        • 2014-09-01
        • 1970-01-01
        • 2021-08-05
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2013-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多