【问题标题】:Unable to expose docker container port other than port 80 to host无法将 80 端口以外的 docker 容器端口暴露给主机
【发布时间】:2021-08-05 21:51:33
【问题描述】:

我正在使用 ubuntu 映像在 docker 容器的端口 26657 上运行 Tendermint HTTP RPC 服务器。

docker run -itd --name t1 -p 26657:26657 tendermint

当我在容器内执行 curl 操作时,我从 RPC 服务器获得 JSON 响应。

docker exec -it t1 curl localhost:26657/status

但是当它尝试在主机上使用 curl 操作时,我得到一个错误:“curl: (52) Empty reply from server”

curl localhost:26657/status

最初我在 Windows 机器上运行 docker。我认为 Windows 可能无法与 WSL Linux 通信(docker 在 Windows 中用于 ubuntu)可能存在一些问题。因此,我在运行 Ubuntu 20.04 的 Linux Virtual Box 中尝试了相同的命令。主机 ubuntu 仍然无法使用 curl/Web 浏览器访问容器服务器。

我尝试在容器内的端口 80 上运行 apache2 服务器并映射到端口 5000 (-p 5000:80)。这有效,我能够在主机中的 localhost:5000 访问 apache2。当我尝试在 RPC 服务器上将 26657 映射到 5000 (-p 5000:26657) 时,会发生同样的问题。所以问题只在于容器中端口 80 以外的端口。

我在主机上尝试了“netstat -an”,它说:“TCP 0.0.0.0:26657 0.0.0.0:0 LISTENING”。

尝试运行在 4200 上运行并映射到主机 4200 的简单 Angular 11 HTTP lite 服务器。它也无法映射此端口。

还尝试远程登录到主机上的端口 26657,并能够使用“telnet localhost 26657”成功连接。当容器终止时,telnet 无法连接,这是理想的。但仍然无法使用 curl/web 浏览器连接主机并从容器中获取 JSON 响应。

我刚刚尝试在 Amazon EC2 实例上运行招标 RPC 服务器。我无法使用公共 IP 访问端口 26657。估计和26657端口上的协议有关。

【问题讨论】:

    标签: docker wsl-2 tendermint


    【解决方案1】:

    尝试运行这个 docker run -itd --name t1 -p 26657:26657endermint/tendermint

    curl localhost:26657/状态

    {
      "jsonrpc": "2.0",
      "id": -1,
      "result": {
        "node_info": {
          "protocol_version": {
            "p2p": "8",
            "block": "11",
            "app": "1"
          },
          "id": "e0d34bb67c18d9025f6944de285f24e904de8c23",
          "listen_addr": "tcp://0.0.0.0:26656",
          "network": "dockerchain",
          "version": "",
          "channels": "40202111433038606100",
          "moniker": "dockernode",
          "other": {
            "tx_index": "on",
            "rpc_address": "tcp://0.0.0.0:26657"
          }
        },
        "sync_info": {
          "latest_block_hash": "5E59DCD523F574AA5B3961A9523B660716FDF9A3D90C72294285106E99614F18",
          "latest_app_hash": "0000000000000000",
          "latest_block_height": "170",
          "latest_block_time": "2021-05-16T12:08:26.1797685Z",
          "earliest_block_hash": "746D1580F6B7012D042230791CCED002AC327422D144BEE7BC2B203E1ECD6F39",
          "earliest_app_hash": "",
          "earliest_block_height": "1",
          "earliest_block_time": "2021-05-16T12:06:43.2085282Z",
          "catching_up": false
        },
        "validator_info": {
          "address": "ACC91433A4B84C4A53547A58418001CD55677F28",
          "pub_key": {
            "type": "tendermint/PubKeyEd12519",
            "value": "+hGKJ2w6dRevN0t2OEf/1uHoInggirrSHCDzyhwJuOo="
          },
          "voting_power": "10"
        }
      }
    }
    

    它可以在我的带有 wsl2 + ubuntu 20.04 的 Windows 10 机器上运行。

    【讨论】:

    • 您的命令有效。但是我面临的问题是当我尝试在 ubuntu docker 映像上运行 terndermint RPC 时。容器内的端口不暴露给宿主机。
    • 也许你可以分享或复制你的 docker 文件或 docker compose yml
    【解决方案2】:

    我在无法从外部访问的“localhost”上运行 Tendermint RPC 服务器。我应该在 0.0.0.0 上启动服务器

    【讨论】:

    • 如果解决了问题,您可以将其标记为已接受的答案。可以接受自己的答案,因为您已经找到了解决自己问题的方法。对于有同样问题的人来说,这个解决方案有效。 ;)
    • 是的,我必须等待 24 小时才能选择正确的答案。我猜这就是 stackoverflow 的工作原理。
    • 是的,it seems so!
    猜你喜欢
    • 2017-10-12
    • 2019-01-20
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多