连接 Docker 容器通过 TCP 连接时,出现“连接被远程主机关闭”的错误。

3

我在通过tcp连接docker容器时遇到了奇怪的问题。

我的操作系统是Ubuntu 20.04。

我的操作步骤如下:

我在容器中启动了我的Web服务器。我尝试过官方的Postgresql镜像,但问题仍然存在。因此,问题可能不在于我的镜像。

服务器监听0.0.0.0上的8080端口。我已经多次更改了端口,所以问题不仅局限于8080端口。

我将8080容器端口转发到主机的8080端口。我尝试了将转发到不同端口,但问题仍然存在。

以下是命令:

docker run --rm --name my-web-container -p8080:8080 my-web-image

我尝试使用wget localhost:8080命令,它会停止一段时间,然后显示:

Connection closed by foreign host.

telnet localhost 8080可以有一段时间的工作,然后显示相同的信息。

# telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

如果我在容器内部使用 wget localhost:8080 , 一切都正常。

如果我将 --net=host 添加到命令中,启动容器,问题就消失了。

所以我想这与 Docker 网络有关。我可以始终使用 --net=host,但显然会创建问题。

这似乎是突然出现的,我没有做任何事情。没有系统配置,也没有安装新软件。

1个回答

4

我已经尝试过

docker network inspect bridge

这给出了以下结果。
[
    {
        "Name": "bridge",
        "Id": "0e99160be59fd6417984db68695f6e6d4fa016e1d75a26734bccaff427ea6468",
        "Created": "2022-06-08T11:16:47.413799955+03:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,

        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

我关注了这部分内容。

            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]

172.17.0.0这个IP地址看起来非常像我的网络提供商给我分配的某个IP地址。

我想也许我应该给桥接网络设置另一个地址。所以,我已经修改了/etc/docker/daemon.json文件如下:

{
 "experimental": true
}

to

{
 "experimental": true,
  "default-address-pools" :
      [
         {
           "base":"172.26.0.0/16",
           "size":24
         }
      ]
}

然后运行service docker restart

之后问题就消失了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接