Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 集装箱港口转运_Docker_Google Cloud Run - Fatal编程技术网

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并转发到我的二进制文件。

下面的代码未经测试,但总体思路是:

  • 使用基于shell的启动脚本
  • 启用iptables
  • 将流量从srcPort路由到dstPort
  • 执行原始二进制文件
  • 在Dockerfile中,用启动脚本替换
    入口点

    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
    可以解决问题,而在容器中运行某种形式的代理可能是唯一的解决方案,在单个容器中运行多个进程与良好实践背道而驰。