Docker container hat kein Internet

sascha-sphw

Member
Ich spiele gerade ein wenig mit docker herum, jetzt habe ich auf einem Ubuntu Server docker installiert und es läuft auch soweit. Wenn ich jetzt allerdings einen container deploy der Internet braucht, klappt der Zugriff nicht.

Jetzt habe ich im Netz ein paar Sachen gefunden und auch schon ausprobiert, aber leider nicht den erwünschten Erfolg gebracht haben.
Als ich z.B. der Lösung in diesem Post gefolgt bin https://stackoverflow.com/questions/20430371/my-docker-container-has-no-internet
hatte ich einen kurzzeitigen Teilerfolg.
Code:
service docker stop
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker start -d
Als ich das ausgeführt hatte, hatte ich beim ersten mal die Option -d vergessen. Die container liefen dann und hatten auch Internet. Leider ging dann aber Portainer nicht mehr, da docker0 nicht angelegt war. Als ich dann mit -d gestartet habe, ging dann zwar Portainer wieder, aber das Internet der container war wieder futsch.

Was muss ich denn machen das meine container by default ins Internet dürfen?
 
Bist Du Dir sicher, dass der "Internetzugriff" nicht klappt und nicht evtl nur die Container nichts auflösen können (wäre dann ein Docker DNS Problem)? Du musst natürlich die Ports beim Runbefehl mit z.B. "-p 8080:80" rauslegen, sonst kannst Du von außen auf gar nichts zugreifen.

Wenn es um Webanwendungen geht, verwende ich den "Nginx Proxy Manager" als Container, durch den alle Webanwendungen reverse proxied werden. Nur dieser bekommt die Ports 80 und 443 und kümmert sich dann um die richtige Zuordnung (intern). Alle anderen Container haben keinerlei externe Ports.

Ohne etwas mehr über Deine Konfiguration zu wissen, wird Hilfe schwer. Normalerweise sollten die Container schlicht funktionieren.
 
Bist Du Dir sicher, dass der "Internetzugriff" nicht klappt und nicht evtl nur die Container nichts auflösen können (wäre dann ein Docker DNS Problem)?
Was ich meine ist. Wenn ich z.B. im Host System google.com ping bekomme ich folgendes.
Code:
root@sphw:~# ping -c 3 google.com
PING google.com (142.250.185.78) 56(84) bytes of data.
64 bytes from fra16s48-in-f14.1e100.net (142.250.185.78): icmp_seq=1 ttl=117 time=3.65 ms
64 bytes from fra16s48-in-f14.1e100.net (142.250.185.78): icmp_seq=2 ttl=117 time=3.57 ms
64 bytes from fra16s48-in-f14.1e100.net (142.250.185.78): icmp_seq=3 ttl=117 time=3.46 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 3.461/3.558/3.648/0.076 ms

Wenn ich das in einem Container mache bekomme ich folgendes:
Code:
root@sphw:~# docker run busybox ping -c 3 google.com
ping: bad address 'google.com'

Aufgefallen ist mir das mit einer Software von mir, die intern einen anderen Service aufruft und damit fehlschlug.
Funktioniert hat es nur, wenn ich den container ins host Netzwerk gehängt habe, aber das will ich eigentlich nicht.

Nur auf meinem lokalen Windows Rechner funktioniert der ping auf google.com

Du musst natürlich die Ports beim Runbefehl mit z.B. "-p 8080:80" rauslegen, sonst kannst Du von außen auf gar nichts zugreifen.
Ja, das passt, drauf komme ich auf alle.
Wenn es um Webanwendungen geht, verwende ich den "Nginx Proxy Manager" als Container, durch den alle Webanwendungen reverse proxied werden. Nur dieser bekommt die Ports 80 und 443 und kümmert sich dann um die richtige Zuordnung (intern). Alle anderen Container haben keinerlei externe Ports.
Der Server selbst ist über die Firewall komplett zu. Nur ein Server auf dem Apache läuft ist für 80 und 443 offen und leitet über eine interne IP dann auf den Server weiter auf dem Docker läuft. Docker Nginx als container steht aber noch auf meiner TODO, sobald ich mit Docker richtig warm geworden bin. :-) Dann möchte ich auch mehrerer Cloud Server auf denen Docker läuft und das Deployment dann automatisch auf dem Server auf dem noch platz ist. So zumindest mein grober Plan.
Ohne etwas mehr über Deine Konfiguration zu wissen, wird Hilfe schwer. Normalerweise sollten die Container schlicht funktionieren.
Ich habe eigentlich nur Docker installiert, sonst keine weiteren Einstellungen gemacht. Welche bräuchtest Du noch?
 
In der /etc/resolv.conf des host systems stehen die richtigen nameserver. Soweit ich herausgefunden habe sollten diese dann in den container übernommen werden. Wenn ich allerdings in den container schaue, steht dort der loopback drin 127.0.0.1.

Könnte das das Problem sein, oder bin ich hier auf dem Holzweg? Warum wird dann aber nicht die vom host verwendet?
 
Also, in der /etc/resolv.conf des host Systems stehen die richtigen Nameserver. In der /etc/resolv.conf der container steht dennoch nur 127.0.0.1.

Ich habe jetzt auch versucht, wie ich es mehrmals gelesen habe, dns in der /etc/docker/daemon.json zu setzen
Code:
{
    "dns": [
        "xx.xx.xx.xx",
        ...
    ]
}
Leider auch ohne Erfolg. Ich habe dann zwar die nameserver auch in der /etc/resolv.conf des containers stehen, ein ping schlägt dennoch fehl.
Code:
root@sphw:/etc/docker# docker run -ti mmoy/ubuntu-netutils bash
root@63b5a17b8f34:/# ping google.com
ping: unknown host google.com

Ich habe dann auch mal die von Google eingetragen.
Code:
{
    "dns": [
        "8.8.8.8",
        "8.8.4.4"
    ]
}

Lustige Geschichte ...
Code:
root@sphw:/etc/docker# docker run -ti mmoy/ubuntu-netutils bash
root@9b39f09dd0dc:/# cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
root@9b39f09dd0dc:/# ping google.com
ping: unknown host google.com

Ich habe auch mehrere unterschiedliche Systeme ausprobiert (just in case), mein Ergebnis ->
WSL 2 auf Windows 10 geht alles wie erwartet.
Ubuntu -> DNS Problem
Synology Linux -> DNS Problem

Vielleicht hat ja noch jemand eine Idee woran das liegen kann.
 
Kannst Du denn im Container (also so wie bei Deinen Codeteilen oben) eine IP pingen (z.B. die 8.8.8.8 von Google)? Wenn das geht und google.com nicht, ist das Problem nach wie vor ein DNS Problem bei Docker bzw. in den Containern.

Mein daemon.json File beinhaltet nur:
Code:
{
  "data-root": "/docker/",
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Mit dem data-root gibt man an, wo das Standard Dockerverzeichnis sein soll. Wenn man das ändert, muss man natürlich alles aus dem ursprünglichen Verzeichnis verschieben. So kommt man schneller zu seinen Daten.

Die Log Sachen sollen die Größe des Docker Logs begrenzen, da das sonst unlimitiert die Festplatte abdichtet.

DNS habe ich dort nicht setzen müssen.
 
Last edited:
Du musst den Docker Daemon neu starten, um neue Einstellungen in daemon.json aktiv werden zu lassen ("sudo service docker restart").
 
Kannst Du denn im Container (also so wie bei Deinen Codeteilen oben) eine IP pingen (z.B. die 8.8.8.8 von Google)? Wenn das geht und google.com nicht, ist das Problem nach wie vor ein DNS Problem bei Docker bzw. in den Containern.
dns hab ich aus der daemon.json wieder raus.
Code:
root@04a159d74d9b:/# ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3079ms
100% packet loss!

Du musst den Docker Daemon neu starten, um neue Einstellungen in daemon.json aktiv werden zu lassen ("sudo service docker restart").
Habe ich nach jeder Änderung gemacht. Die /etc/resolv.conf hatte sich ja jedesmal auch verändert, aber eben ohne jeglichen Effekt.
Die Log Sachen sollen die Größe des Docker Logs begrenzen, da das sonst unlimitiert die Festplatte abdichtet.
Danke, habe es schon übernommen. :-D
 
Ok, dann hast Du wirklich kein Internet und es ist erstmal kein DNS Problem.
In welchem Netzwerk hast Du die Container denn hängen?

Ich persönlich habe mir für den NPM ein eigenes Netzwerk "npm_proxy" (oder sonst ein Name) angelegt und da alle Container rein gemacht:
- Subnet: 172.XX.0.0/16 (XX durch irgendetwas zwischen 1 und 254 ersetzen)
- Gateway: 172.XX.0.1
- -IP Range: muss nicht angegeben werden
- Driver: bridge

Damit findet der NPM alle anderen Container über die interne Namensauflösung "namedescontainers" und kein Port der Appplikationscontainer muss nach außen freigegeben werden, nur der NPM hat die Ports 80 und 443 nach außen.

Kann gut sein, dass die Befehle, die Du im ersten Post ausgeführt hast, nicht so optimal sind. ;)
 
Ich habe jetzt auch ein anders Netzwerk versucht.
IPV4 Subnet - 172.20.0.0/16IPV4 Gateway - 172.20.0.1

Das Problem bleibt.
 
Hm. Ich glaube Du hast da irgendwann vorher schon mal was zerschossen. Wäre eine OS Neuinstallation und ein Docker Neuanfang im Bereich des Möglichen? Oder muss das Problem unbedingt am laufenden System gefixt werden?
 
Hm. Ich glaube Du hast da irgendwann vorher schon mal was zerschossen. Wäre eine OS Neuinstallation und ein Docker Neuanfang im Bereich des Möglichen? Oder muss das Problem unbedingt am laufenden System gefixt werden?
Ja, ich glaub das ist beste Idee, ich fahr einfach eine neue Instanz hoch und schau mal ob ich es dort zum laufen bekomme.
 
Back
Top