Docker Containern erreichen keine Ressource außerhalb der VM


Problembeschreibung:

Ein häufiges Problem von Dockern innerhalb einer Virtualisierungsinfrastruktur ist, dass das den virtuellen Maschinen zur Verfügung gestellte Netzwerk nicht die Standard-MTU von 1500 hat. Dies ist beispielsweise häufig der Fall, wenn in einer Cloud-Infrastruktur (z. B. OpenStack) mit einem Software Defined Network gearbeitet wird. Der Docker Daemon überprüft beim Start nicht die MTU der ausgehenden Verbindung. Daher wird der Wert der Docker-MTU auf den Standard 1500 gesetzt.

Mehr auf https://mlohr.com/docker-mtu/

Man kann in seiner Virtuellen Maschine prüfen welche MTU Size verwendet wird durch "ip link".

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether uu:vv:ww:xx:yy:zz brd ff:ff:ff:ff:ff

Wenn die ausgehende Schnittstelle (in diesem Fall ens3) eine MTU kleiner als 1500 hat, sind einige Maßnahmen erforderlich. Wenn es größer oder gleich 1500 ist, trifft dieses Problem nicht auf Sie zu.

Lösungen:

1. Lösung des Problems (Docker-Daemon) 

Durch anpassen der MTU Size in /etc/docker/daemon.json (Datei erstellen wenn nicht vorhanden) kann das Problem für alle Container auf der VM behoben werden.

vim /etc/docker/daemon.json 
{
   "mtu": 1450
}

systemctl restart docker.service
systemctl restart docker.socket

2. Lösung des Problems (docker-compose) 

Durch Anpassung der MTU Size im docker compose file kann das Problem für eine Anwendung auf allen VMs gelöst werden.

...
networks:
  default:
    driver: bridge
    driver_opts:
com.docker.network.driver.mtu: 1450
...

docker-compose down; docker-compose up

Testfall:

docker run --rm -it ubuntu:18.04 /bin/bash
apt update
... hangs
exit

vim /etc/docker/daemon.json
{
  "mtu": 1450
}
systemctl restart docker.service
systemctl restart docker.socket

docker run --rm -it ubuntu:18.04 /bin/bash
apt update
... runs
Tags: Cloud, Docker
2021-10-19 12:44 msrba {writeRevision}
Durchschnittliche Bewertung: 5 (1 Abstimmung)

Kommentieren nicht möglich