【问题标题】:Getting connection reset when accessing running docker container访问正在运行的 docker 容器时重置连接
【发布时间】:2021-09-01 16:48:31
【问题描述】:

我的服务器上有一个容器。直到昨天,一切正常,然后有人删除了主机上的 docker 路由。 应用程序在容器内运行并在 0.0.0.0:5000 上侦听,它在 5001 上公开。运行curl -v localhost:5001 失败

* Rebuilt URL to: localhost:5001/
*   Trying ::1...
* Connected to localhost (::1) port 5001 (#0)
> GET / HTTP/1.1
> Host: localhost:5001
> User-Agent: curl/7.47.0
> Accept: */*
>
* Recv failure: Connection reset by peer
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer

我尝试重新启动守护程序,重新创建容器,创建新的桥接网络并将其附加到容器,但没有任何效果。

但是,我尝试使用主机驱动程序启动容器并且可以访问它。我不想使用主机网络,我需要让它与桥接网络一起工作。

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    我终于可以让一切正常工作了。

    1. 更改了 docker 子网设置,导致 docker-compose 创建的子网以某种方式干扰了主机的公共接口。将以下代码添加到 /etc/docker/daemon.json

      { “dns”:[“10.10.1.222”], “默认地址池”:[ {"base":"10.10.0.0/16","size":24} ] }

    2. 重启docker服务

    3. 强制 docker compose 使用默认桥接网络。在 docker-compose.yaml 中

      network_mode: 网桥

    4. 向下由 compose 创建的容器,然后重新向上

    5. 删除所有由 compose 创建的网络

      码头网络 rm

    注意:根据我的问题,docker 路由已被删除,因为它们以某种方式使主机在重新启动时无法访问。更改 docker 子网并删除除默认网络之外的所有其他网络解决了该问题。

    docker network ls 
    
    
    
    NETWORK ID          NAME                DRIVER              SCOPE
    15d807ad77d4        bridge              bridge              local
    6cd415046a23        host                host                local
    6e9b8dfc500e        none                null                local
    

    编辑

    根据@OlivierMehani 的评论,虽然使用 20.10.0.0/16 子网对我有用,但它可能会导致问题,因为 20.10.0.0/16 是公共地址范围。为了安全起见,请使用 IP 范围 10.0.0.0 - 10.255.255.255、172.16.0.0 到 172.31.255.255 和 192.168.0.0 到 192.168.255.255。只需确保您选择的子网没有在您的组织中使用,尤其是 docker 主机。

    【讨论】:

    • 好吧,这解决了我的问题github.com/docker/for-mac/issues/3782
    • 这看起来不是个好主意。 20.10.0.0/16 范围是公共地址空间的一部分,实际上属于 Microsoft(请参阅whois 20.10.0.0)。虽然这可能在大多数情况下都有效,但如果您隐藏此网络,您实际上可能会遇到非常奇怪的问题(例如 DNS 解析失败)。
    • @OlivierMehani,这是真的,它对我有用,因为我没有接触过互联网。我将更新我的答案以使用私有子网范围。谢谢。
    【解决方案2】:

    将 iptables 重置为默认值(请注意,这将删除所有现有规则、链并将策略设置为 ACCEPT,如果您有除 docker 默认值之外的其他规则或进行了任何更改,请确保在执行之前进行备份这个)

    1. 停止泊坞窗服务: sudo systemctl stop docker

    2. 将 iptables 重置为默认值:

    iptables -P FORWARD ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -t nat -F
    iptables -t mangle -F
    iptables -F
    iptables -X
    
    1. 启动泊坞窗:systemctl start docker

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      相关资源
      最近更新 更多