Docker 集装箱港口转运
我有一个二进制文件可以监听端口Docker 集装箱港口转运,docker,google-cloud-run,Docker,Google Cloud Run,我有一个二进制文件可以监听端口3000,但是,Google Cloud Run希望我监听由$port定义的端口,该端口默认为8080 有没有办法让我的容器绑定到8080,然后将传入的请求转发到3000?例如,通过向我的Dockerfile添加一个短脚本和一行代码,它将使我的容器侦听8080并转发到我的二进制文件。下面的代码未经测试,但总体思路是: 使用基于shell的启动脚本 启用iptables 将流量从srcPort路由到dstPort 执行原始二进制文件 在Dockerfile中,用启动脚
3000
,但是,Google Cloud Run希望我监听由$port
定义的端口,该端口默认为8080
有没有办法让我的容器绑定到8080,然后将传入的请求转发到3000?例如,通过向我的
Dockerfile
添加一个短脚本和一行代码,它将使我的容器侦听8080并转发到我的二进制文件。下面的代码未经测试,但总体思路是:
入口点
:
FROM debian:9 # or another container that has iptables available
RUN apt-get install iptables
EXPOSE 8080
ENTRYPOINT /bin/startup.sh /bin/original
然后编写一个启动脚本,启用iptables并转发容器内8080到3000的入站流量:
#/usr/bin/env bash
set-e
sed-i的/net.ipv4.ip_-forward=1/net.ipv4.ip_-forward=1/g'/etc/sysctl.conf
让内核参数立即生效
systemctl启动iptables
iptables-tnat-A预路由-i eth0-ptcp-dport8080-j重定向-到端口3000
iptables-t nat-A预路由-i eth0-p udp-dport 8080-j重定向-到端口3000
取消移位
执行官“$@”
如果可以安装,请运行第二个进程并沿主进程启动,然后使用以下命令安装并运行socat:
socat tcp-listen:8080,fork,reuseaddr tcp-connect:localhost:3000
这样,socat将绑定到8080端口,并将所有通信发送到二进制正在侦听的端口3000
云运行之外:如果您无法触摸图像或容器,则您仍然可以在其他容器上运行socat,例如:
version: '3.5'
services:
proxy:
image: alpine/socat:1.0.3
command: tcp-listen:8080,fork,reuseaddr tcp-connect:myservice:3000
networks:
- mynet
networks:
mynet:
external: true
其中
mynet
是二进制文件运行的网络,myservice
是二进制文件的服务名称。不幸的是,脚本失败。(1) debian:9
不包括sysctl
,但debian:8
包括;(2) 我认为(!?)如果既不以--privileged
的方式运行容器,也不使用--sysctl=net.ipv4.ip_forward=1
(他不能在云上运行)的话,就不能在容器内修改net.ipv4.ip_forward
;(3) 您希望在安装之前使用sudo-apt-get-update&&sudo-apt-get-y-install-iptables
刷新软件包@steren--希望您有一个FR来允许端口转发|在Cloud Run中发布;-)您不能将应用程序的默认值修改为3000,但如果定义了$PORT,则改用该端口吗?@codestation问题表明这是一个二进制文件,推测OP无法更改端口。@dustin ingram是正确的。PORT
环境变量是系统在Cloud Run中指定的。解决方案确实需要确保容器将接受服务指定的端口
值上的流量;只是目前这始终是8080
,但这并不稳定。你在Google Cloud Run上测试并验证过这一点吗?@JohnHanley,没有,但第一个选项应该可以正常工作(重定向流量的附加过程),否则在Cloud Run中会出现一些问题(我过去在docker容器中成功地使用了socat)。当然,如果其他一切都失败了,OP可以编辑二进制文件来更改端口号(假设二进制文件没有签名/模糊处理)。我不认为您的答案的第二部分在Cloud Run中是可能的。尽管Cloud Run运行的是一个容器,但它不是Docker容器平台。整个容器的侦听端口(一个端口)由Google控制。无法通过名称等访问Docker网络。另一个容器的地址未知。同时运行的容器数量未知(此时)。云运行被设计成一个基于每秒请求量的HTTP请求/响应系统。@ john hanley是正确的,你不能(尽管它是一个好的解决方案)在云运行上运行一个“sidiar”类容器来代表流量(这是谷歌应该特别考虑的,因为这是(A)将是一个相当普遍的问题;(b)底层模型是Kubernetes Pod,这是Kubernetes的常见模式。在同一个容器中运行socat
可以解决问题,而在容器中运行某种形式的代理可能是唯一的解决方案,在单个容器中运行多个进程与良好实践背道而驰。