Docker-Netzwerk: Browser und Curl bleiben beim Verbinden mit dem Server auf dem lokalen Host hängen

Docker-Netzwerk: Browser und Curl bleiben beim Verbinden mit dem Server auf dem lokalen Host hängen

Ich habe mehrere Web-Apps, die in Docker auf einem Ubuntu-Host laufen. Jede App lauscht auf einem anderen Port. Wenn ich mich in einem Container im Docker-Netzwerk befinde, kann ich eine Verbindung herstellen und Daten vom Dienst empfangen. Wenn ich jedoch eine Anfrage vom Host ausführe, kann ich zwar erfolgreich eine Verbindung herstellen, aber es werden keine Daten empfangen. Warum geben die Dienste keine Daten zurück, wenn ich mich von außerhalb des Containers mit ihnen verbinde???

Docker meldet dies unter „PORTS“, wenn ich Folgendes ausführe docker ps:

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

und netstat meldet, dass der Server auf diesem Port lauscht:

$ 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      -

Wenn ich jedoch localhost:8080 in meinem Browser aufrufe (ich habe sowohl Firefox als auch Chrome ausprobiert), bleibt der Browser hängen, als ob eine Verbindung besteht, aber es werden keine Daten gesendet. Ebenso bleibt curl für immer hängen:

$ 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

Ich habe auch versucht, mich per Telnet damit zu verbinden, mit einem ähnlichen Ergebnis. Ich habe versucht, einen schnellen HTTP-Server direkt auf dem Host laufen zu lassen, und es funktioniert einwandfrei:

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">
...

Ich habe auch versucht, eine Verbindung mit der IP des Docker-Containers herzustellen: (172.17.0.3:8080), mit dem gleichen Ergebnis.

Wenn ich jedoch versuche, curl in einem der Container auszuführen, kann ich die HTTP-Endpunkte in jedem Container erreichen.

All dies lässt mich glauben, dass ein Problem mit dem Docker-Netzwerk auf meinem Host (Docker Bridge?) vorliegt.

Ich verwende Docker Compose. Docker Inspect meldet (teilweise) Folgendes:

"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
                }
            }
        }

Zusammenfassung: Ich kann innerhalb der Container eine Verbindung zu diesen Diensten herstellen, aber nicht vom Host aus, obwohl die Server allen Berichten zufolge auf Verbindungen warten.

Was muss ich tun, damit ich von meinem Host aus eine Verbindung zu Diensten herstellen kann, die im Docker ausgeführt werden?

Antwort1

Ich habe einen Workaround gefunden, aber keine Lösung. Ich habe festgestellt, dass dieses Problem nur besteht, wenn ich mit einem VPN verbunden bin. Anscheinend ist dies eine häufige Beschwerde. Wenn die Verbindung getrennt ist, funktioniert die Verbindung wie erwartet.

Die Problemumgehung besteht darin, das VPN auszuschalten und die Docker-Container neu zu starten. Dies hat allerdings nicht immer funktioniert, insbesondere wenn ich mit eingeschaltetem VPN gearbeitet und es dann nach dem Ausschalten des VPN erneut versucht habe. In diesem Fall habe ich festgestellt, dass ich die Dinge zum Laufen bringen konnte, indem ich den CIDR im Docker-Compose-Netzwerk geändert habe. Hoffentlich hilft dies jedem, der das gleiche Problem hat.

Es ist noch unklar, wie man die Dinge mit eingeschaltetem VPN zum Laufen bekommt; keiner der Ansätze (einschließlich der Erstellung einer „Tombstone“-Docker-Bridge) hat bei mir bisher funktioniert.

verwandte Informationen