Docker的新手。
是否可以在不同端口中支持多个容器,但可以映射到相同的docker主机端口80?
我有两个应用程序,一个运行在apache中,另一个运行在glassfish服务器上。
我想在aws的同一个Linux实例中运行这两个容器。
是否可能会有类似以下的内容:
已经尝试过,显然得到了:
Bind for 0.0.0.0:80 failed: port is already allocated
但是我想知道是否有可能,如何实现,以及是否建议以及为什么?
谢谢
用法运行它:
$ 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/image
在8080
处公开
这不起作用,请测试:my.host/app-context-root抛出:
502 Bad Gateway nginx / 1.13.12
答案 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容器将不再位于同一网络上。