Docker主机端口80到多个容器

时间:2018-08-11 20:06:30

标签: docker

Docker的新手。

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

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

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

是否可能会有类似以下的内容:

  • 第1容器容器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中或通过对docker使用--expose标志   运行或docker创建。

     

提供了将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/image8080处公开 这不起作用,请测试:my.host/app-context-root抛出:

  

502 Bad Gateway nginx / 1.13.12

3 个答案:

答案 0 :(得分:0)

是否可能会有类似以下的内容:

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

答案 1 :(得分:0)

容器1个Apache EXPOSE 9090
容器2 glassf EXPOSE 8080 码头工人运行-p 80:9090 container1 docker run -p 80:8080 container2

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

尝试如下进行端口映射

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

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

答案 2 :(得分:0)

答案:

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

您在接口中使用的端口可以将流量委派到其正确的目的地。可以想像一下,您的街道上有两所房子,都具有相同的邮政编码和相同的门牌号-您的送货地点在哪里?

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

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