gpt4 book ai didi

docker - 如何在使用 docker 时为多个项目共享(公开)端口 80

转载 作者:行者123 更新时间:2023-12-01 12:09:03 25 4
gpt4 key购买 nike

我最近决定将我的开发环境从 native mac 迁移到 docker for mac,并且我希望多个项目公开相同的端口 80,以便我可以简单地键入 http://app1.dev/http://app2.dev/在浏览器中无需记住几十个端口号。

我不必在原生环境上做任何事情来实现这一点。但是由于现在 nginx 在每个容器中单独运行,因此它们在端口暴露方面存在冲突。
我也知道我可以使用指向外部容器的外部链接,但我不想拆开我的 docker-compose.yml 文件,我只想将所有内容合二为一。

docker-compose.yml 在 ~/demo1/

version: '3'
services:
web:
image: nginx:alpine
ports:
- "80:80"
# ...

docker-compose.yml 在 ~/demo2/
version: '3'
services:
web:
image: nginx:alpine
ports:
- "80:80"
# ...

当我发出命令 docker-compose up -d在 demo2 我得到:
Creating network "demo2_default" with the default driver
Creating demo2_web_1 ... error

ERROR: for demo2_web_1 Cannot start service web: driver failed
programming external connectivity on endpoint demo2_web_1
(cbfebd1550e944ae468a1118eb07574029a6109409dd34799bfdaf72cdeb3d35):
Bind for 0.0.0.0:80 failed: port is already allocated

ERROR: for web Cannot start service web: driver failed programming
external connectivity on endpoint demo2_web_1
(cbfebd1550e944ae468a1118eb07574029a6109409dd34799bfdaf72cdeb3d35):
Bind for 0.0.0.0:80 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.

有没有办法让它们共享相同的端口,或者在不使用额外命令创建外部容器的情况下将端口从主机重新映射到容器?
或者有没有办法在 docker-compose.yml 文件中创建外部容器?

最佳答案

您不能将多个容器端口映射到同一个主机端口。首先出现的任何容器都将绑定(bind)到端口 80,如果您尝试绑定(bind)相同的端口,第二个容器将抛出已在使用的端口。

要解决此问题,您可以运行另一个虚拟 Nginx 这只是 proxy_pass演示1 演示2 .在这种情况下,http://app将是父 Nginx 和 /dev1proxy_pass演示1 /dev2proxy_pass演示2 .

在这里,您只需要将父 Nginx 的端口绑定(bind)到主机。如果将所有这些连接到同一网络并使用 docker service discovery,则无需绑定(bind)子 Nginx 的端口.如果您遵循这些,那么您将点击 another problem即:Nginx 将缓存使用服务发现解析的容器的 IP,并将使用该 IP 始终命中容器。一旦子容器重新启动,子容器的 IP 地址可能会更改,因此父 Nginx 抛出 502 .为了解决这个问题,每次重启时都必须重启父 Nginx 演示1 演示2 .要解决此问题,您必须使用 resolver127.0.0.11在父 Nginx 中有效。所以每次 Nginx 都会尝试根据有效性解析最后一次解析后的 IP 地址。

我添加了总结上述所有要点的虚拟配置文件。

父 Nginx 撰写:

version: '3'
services:
parent:
image: nginx:alpine
volume:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- 80:80
networks:
default:
external:
name: dev

父 Nginx 配置 (./nginx.conf):
server {
listen 80;

resolver 127.0.0.11 valid=5s; #this is local docker DNS and the internal IP getting resolved will be valid only for 5 seconds.

location /app/dev1 {
proxy_pass http://dev1:80;
}

location /app/dev2 {
proxy_pass http://dev2:80;
}
}

docker-compose.yml 在 ~/demo1/
version: '3'
services:
web:
image: nginx:alpine
networks:
default:
aliases:
- dev1
networks:
default:
external:
name: dev

docker-compose.yml 在 ~/demo2/
version: '3'
services:
web:
image: nginx:alpine
networks:
default:
aliases:
- dev2
networks:
default:
external:
name: dev

现在您可以通过点击 URL http://app/dev1 来使用 demo1和 demo2 使用 http://app/dev2 .

引用:
  • NGINX Reverse Proxy
  • NGINX proxy_pass
  • NGINX resolver
  • Necessity of docker DNS
  • Docker container networking
  • 关于docker - 如何在使用 docker 时为多个项目共享(公开)端口 80,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53882200/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com