rede docker: navegador e curl travam ao se conectar ao servidor no localhost

rede docker: navegador e curl travam ao se conectar ao servidor no localhost

Eu tenho vários aplicativos da web em execução no docker em um host do Ubuntu. Cada aplicativo está escutando em uma porta diferente. Quando dentro de qualquer contêiner da rede docker, posso me conectar e receber dados do serviço, porém, ao executar uma solicitação do host, consigo me conectar com sucesso, mas nenhum dado é recebido. Por que os serviços não retornam dados quando me conecto a eles de fora do contêiner???

Docker relata isso em "PORTS" quando executo docker ps:

0.0.0.0:8080->8080/tcp, :::8080->8080/tcp

e netstat relata que o servidor está escutando nessa porta:

$ netstat -anp | grep 8080
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      -                                      
tcp6       0      0 :::8080                 :::*                    LISTEN      -

No entanto, quando visito localhost:8080 no meu navegador (tentei o Firefox e o Chrome), o navegador trava, como se estivesse conectado, mas nenhum dado está sendo enviado. Da mesma forma, curl fica pendurado para sempre:

$ curl -vvv localhost:8080
* Uses proxy env variable no_proxy == 'localhost,127.0.0.1,::1'
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.68.0
> Accept: */*
> 
^C

Também tentei conectar-me a ele com telnet com resultado semelhante. Tentei executar um servidor http rápido diretamente no host e funcionou bem:

python3 -m http.server 8000
$ curl -vvv localhost:8000
* Uses proxy env variable no_proxy == 'localhost,127.0.0.0/8,::1'
*   Trying 127.0.0.1:8000...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: SimpleHTTP/0.6 Python/3.8.13
< Date: Fri, 09 Dec 2022 12:36:03 GMT
< Content-type: text/html; charset=utf-8
< Content-Length: 16768
< 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
...

Também tentei conectar-me ao docker container ip: (172.17.0.3:8080) com os mesmos resultados.

No entanto, quando tento executar o curl dentro de um dos contêineres, consigo alcançar os pontos de extremidade http em qualquer contêiner.

Tudo isso me leva a acreditar que há um problema com a rede do docker no meu host (docker bridge?).

Estou usando o docker compose. Docker inspecionar relata o seguinte (em parte):

"HostConfig": {
            "Binds": [],
...
            "NetworkMode": "docker-compose-example_default",
            "PortBindings": {
                "8080/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8080"
                    }
                ]
            },
...
"NetworkSettings": {
            "Bridge": "",
            "SandboxID": "1b53a5b6580187b714c6d7d0c9f81a015d585cd0bb0d62da579a4fe7514d47ea",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "8080/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "8080"
                    },
                    {
                        "HostIp": "::",
                        "HostPort": "8080"
                    }
                ]
            },
            "SandboxKey": "/var/run/docker/netns/1b53a5b65801",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "docker-compose-example_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "dc0813038a3b",
                        "adminer"
                    ],
                    "NetworkID": "65c6700f5445a6ce0f98a0a4e14e3e10577f40706411f639a4f9da5b1cfdd52e",
                    "EndpointID": "0f42ae8ce893fb4f33168c31df0d5de38d2e8ca67521802ba76589a8a0cb1bea",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }

Recapitulação: posso me conectar a esses serviços dentro dos contêineres, mas não consigo me conectar a eles a partir do host, embora, segundo todos os relatórios, os servidores estejam escutando conexões.

O que preciso fazer para poder me conectar aos serviços em execução no docker do meu host?

Responder1

Encontrei uma solução alternativa, mas não uma solução. Descobri que esse problema persiste apenas quando estou conectado a uma VPN. Aparentemente, esta é uma reclamação comum. Quando desconectado, a conectividade funciona conforme o esperado.

A solução alternativa é desligar a VPN e reiniciar os contêineres do Docker. FWIW, isso nem sempre funcionava, especialmente se eu tivesse executado com a VPN ligada e tentado novamente após desligar a VPN. Nesse caso, descobri que alterar o CIDR na rede docker-compose me permitiu fazer as coisas funcionarem. Esperamos que isso ajude alguém que esteja enfrentando o mesmo problema.

O júri ainda não decidiu como fazer as coisas funcionarem com a VPN ativada, nenhuma abordagem (incluindo a criação de uma ponte docker "lápide") funcionou para mim até agora.

informação relacionada