Docker镜像可以在本地绑定low端口,但不能在Cloudfoundry中绑定



我正在尝试在CloudFoundry中运行dpage/pgadmin4映像。

如果我在我的机器上运行映像,服务器启动并监听端口80:

$ docker run -t -e "PGADMIN_DEFAULT_EMAIL=a@b.com" -e "PGADMIN_DEFAULT_PASSWORD=defg" -e "PGADMIN_DISABLE_POSTFIX=true" -p 8080:80 dpage/pgadmin4:6
NOTE: Configuring authentication for SERVER mode.
pgAdmin 4 - Application Initialisation
======================================
[2023-04-03 21:58:18 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-04-03 21:58:18 +0000] [1] [INFO] Listening at: http://[::]:80 (1)
[2023-04-03 21:58:18 +0000] [1] [INFO] Using worker: gthread
[2023-04-03 21:58:18 +0000] [22] [INFO] Booting worker with pid: 22
::ffff:172.17.0.1 - - [03/Apr/2023:21:58:28 +0000] "GET / HTTP/1.1" 302 217 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"

我可以使用图像将应用程序推送到CloudFoundry。如果我没有指定任何网络参数,[ERROR] Can't connect to ('::', 80)就会失败。我认为这是由于权限问题,绑定了一个低(受限制的)端口,并通过设置PGADMIN_LISTEN_ADDRESS: 0.0.0.0PGADMIN_LISTEN_PORT: 8080修复了这个问题。现在它开始很好,但是web服务器正在监听端口8080,而容器暴露端口80和443,并且CF显然使用暴露的端口来确定路由流量的位置(因此,在本例中为80)。

我已经看到了这篇与此相关的文章,并理解我可以与REST API交互以动态更改端口路由,或者我想我可以创建一个新的Dockerfile并构建我自己的默认暴露8080的映像,但我真的很想让映像按原样运行,监听默认端口(80)在我的本地机器上的工作方式。

我卡住的地方是:为什么gunicorn可以在我的笔记本电脑上监听端口80,而不是在CloudFoundry?是否有一个我可以改变的设置允许它这样做?"Can't connect to…"的原因会不会是我弄错了?首先是错误吗?

CF中有很多端口,我不完全确定您要更改的是哪个端口。这听起来像是你有一个打包在容器镜像中的应用程序,期望在容器内的端口80上侦听,并且你希望CF将流量路由到端口80,而不是默认的8080。

这应该允许您更改它。From the docs…

默认情况下,应用程序只接收端口8080的HTTP和TCP路由请求。配置自定义应用端口允许开发人员将工作负载带到Cloud Foundry上,这些工作负载可以在8080以外的端口上接收请求。

我建议尝试这里记录的过程:https://docs.cloudfoundry.org/devguide/custom-ports.html#overview

我卡住的地方是:为什么gunicorn可以在我的笔记本电脑上监听端口80,而不是在CloudFoundry?是否有一个我可以改变的设置允许它这样做?"Can't connect to…"的原因会不会是我弄错了?首先是错误吗?

这是容器运行时实现之间的区别。Docker选择允许用户绑定到任何端口(他们将限制端口范围设置为0而不是1024)。CloudFoundry决定更加严格。它是一个用于部署本质上不受信任的应用程序的共享平台,因此需要加强。

最新更新