Docker

Der Einsatz von Docker erfreut sich steigender Beliebtheit.
Diese Seite gibt Hilfestellungen und Hinweise zum Betrieb von Docker-Containern an der FAU.

Inhalt

Schnellzugriff auf wichtige Themen:

Voraussetzungen

Die offizielle Anleitung zur Installation von Docker finden Sie unter https://docs.docker.com/engine/install/ubuntu/.

Das RRZE bietet auch einen APT Mirror des Docker Repositories an, der wie folgt genutzt werden kann:

Pakete für Ubuntu 24.04 (jammy)

echo "deb [arch=amd64 by-hash=no] http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu noble stable" | sudo tee /etc/apt/sources.list.d/rrze-mirror-docker.list
curl -fsSL http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo DEBIAN_FRONTEND=noninteractive apt-get install docker-ce

Pakete für Ubuntu 22.04 (jammy)

echo "deb [arch=amd64 by-hash=no] http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu jammy stable" | sudo tee /etc/apt/sources.list.d/rrze-mirror-docker.list
curl -fsSL http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo DEBIAN_FRONTEND=noninteractive apt-get install docker-ce

Pakete für Ubuntu 20.04 (focal)

echo "deb [arch=amd64 by-hash=no] http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/rrze-mirror-docker.list
curl -fsSL http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo DEBIAN_FRONTEND=noninteractive apt-get install docker-ce

Konfiguration

Hier finden Sie wichtige Hinweise zur korrekten Konfiguration Ihres Docker-Setups im FAU Netz.

Docker Bridge/Netzbereich

Bitte den verwendeten Adressbereich unbedingt wie unten beschrieben konfigurieren.
Es gibt Netze an der FAU, die mit dem Default-Adressbereich kollidieren!

Docker verwendet ein eigenes Subnetz das über die Docker-Bridge docker0 mit dem restlichen Netzwerk kommuniziert.
Standardmäßig verwendet dieses Subnetz den Adressbereich 172.17.0.0/16
Um Kollisionen mit bereits verwendeten Adressbereichen auszuschließen wird empfohlen einen Bereich aus nicht-routbaren LinkLocal Adressen für Docker zu verwenden (zB 169.254.254.1/24).

Probleme mit DELL idrac beheben

Das bei DELL Servern integrierte Management verwendet ein virtuelles Netzwerkinterface namens idrac zur Kommunikation mit dem Host.
Um Konflikte mit den Docker-Netzen zu verhindern muss die Netzmaske des idrac Interfaces von /16 auf /24 eingeschränkt werden.
Die nötigen Änderungen können in netplan wie folgt konfiguriert werden:

bash$ cat << EOF | sudo tee -a /etc/netplan/02-idrac.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    idrac:
      addresses: [169.254.0.2/24]
EOF

bash$ sudo netplan apply

Um den Netzbereich anzupassen sind die folgenden Schritte notwendig.

Ubuntu ab 18.04 (Systemd)

1. Docker-Daemon Konfiguration anpassen

bash$ sudo systemctl edit docker

2. Folgenden Inhalt einfügen

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:// --bip=169.254.254.1/24
# Ende

3. Überprüfen der Konfiguration

bash$ sudo cat /etc/systemd/system/docker.service.d/override.conf
...
bash$ sudo systemctl cat docker
...

4. Neustart des Docker-Daemons (ACHTUNG: Startet auch alle Container neu!)

bash$ sudo systemctl restart docker

5. Überprüfen der docker0 IP

bash$ ip address show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:06:dd:bb:5c brd ff:ff:ff:ff:ff:ff
    inet 169.254.254.1/24 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:6ff:fedd:bb5c/64 scope link 
       valid_lft forever preferred_lft forever

Das wars 🙂

Docker Daemon / Dockerhub Mirror

Rate Limit bei Dockerhub

Ab 1.4.2025 wird Dockerhub Zugriffe für Pulls beschränken, was an der FAU zu Problemen beim Zugriff auf Dockerhub führen wird (siehe https://docs.docker.com/docker-hub/usage/pulls/).

Um den Nutzern an der FAU weiterhin einen schnellen Zugriff auf Images von Dockerhub zu ermöglichen, stellt das RRZE einen zentralen Dockerhub Mirror bereit. Dieser ist als Pull-Through Cache für Dockerhub Images konfiguriert (siehe auch https://docs.docker.com/docker-hub/image-library/mirror/). Bei Nutzung des zentralen Dockerhub Mirror werden Images über einen zentralen, unlimitierten Account von Dockerhub abgerufen und dann für 180 Tage zwischengespeichert.

Es wird allen Nutzern an der FAU empfohlen die entsprechende Konfiguration zur Nutzung der Dockerhub Mirrors zu verwenden:

sudo tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": [
    "https://dockerhub-mirror3.rrze.uni-erlangen.de",
    "https://dockerhub-mirror2.rrze.uni-erlangen.de",
    "https://dockerhub-mirror1.rrze.uni-erlangen.de"
  ]
}
EOF

sudo systemctl restart docker

Die Reihenfolge der Mirrors kann zur Lastverteilung ggf. verändert werden. Es sollten aber immer alle drei eingetragen werden, da bei Wartungsarbeiten zeitweise auch mal ein Mirror offline sein kann.
Es wird jeweils der erste Mirror verwendet, der eine erfolgreiche Antwort liefert. Als letztes wird automatisch versucht das Image von Dockerhub abzurufen.

Leider ist zum aktuellen Stand nicht bekannt wie man auf Client-Seite einfach prüfen kann, ob die konfigurierten Mirrors erfolgreich verwendet wurden.

Startskripte

Docker-Container mit dem Linux Initsystem starten

Ubuntu ab 18.04 (Systemd)

Als Basis für eigene Anpassungen empfehlen wir zum Beispiel folgendes Init-Skript zum automatischen Anlegen und starten eines neuen Containers basierend auf einem existierenden Docker-Image.
Alle Informationen zum Erstellen des Containers sind im Skript bereits enthalten.
So benötigt man für einfache Setups kein zusätzliches Tool, wie docker-compose, um die Konfiguration der Container zu verwalten.

1. Startskript erstellen

bash$ cat /etc/systemd/system/docker.openldap.service

[Unit]
Description=OpenLDAP
Requires=docker.service
After=docker.service

[Service]
User=root
Restart=on-failure
RestartSec=10
ExecStartPre=-/usr/bin/docker stop openldap
ExecStartPre=-/usr/bin/docker rm openldap

ExecStart=/usr/bin/docker run \
--name openldap \
-h openldap.example.net \
-p 10.20.30.40:389:389 \
-p 10.20.30.40:636:636 \
-v /opt/apps/openldap/logs/:/var/log \
YOUR-REGISTRY/openldap:latest

ExecStop=-/usr/bin/docker stop openldap

[Install]
WantedBy=multi-user.target

2. Starten des Containers

bash$ sudo systemctl daemon-reload
bash$ sudo systemctl enable docker.openldap # <-- beim Booten automatisch starten
bash$ sudo systemctl start docker.openldap

3. Update des Images von der Registry

bash$ sudo docker pull YOUR-REGISTRY/openldap:latest

latest: Pulling from openldap
9fb6c798fa41: Already exists
3b61febd4aef: Already exists
....
f93db066217e: Pull complete
Digest: sha256:17059dc182304950aab5ca13bb6373b7d7efc0ff7641382cf75cb621f6e7734f
Status: Downloaded newer image for YOUR-REGISTRY/openldap:latest

bash$ sudo systemctl restart docker.openldap

Rechteverwaltung / docker-Gruppe

Um auch normalen Benutzern – außer root – den Zugriff auf den Docker-Daemon zu gewähren, kann man diese in die Gruppe docker aufnehmen.

Die docker Gruppe wird nach Installation des Docker Pakets automatisch als lokale Gruppe erstellt.
Danach können Sie Kennungen mit folgendem Kommando zur Gruppe hinzufügen:

bash$ sudo usermod -aG docker $KENNUNG

Damit die Gruppenzugehörigkeit aktiv wird müssen Sie sich neu anmelden!

pam_group (obsolet)

Die folgende Methode fügt eine Benutzerkennung bei der Anmeldung dynamisch zur benötigten lokalen docker Gruppe hinzu (siehe auch https://help.ubuntu.com/community/LDAPClientAuthentication#Assign_local_groups_to_users).

Sie müssen sich Abmelden und neu Anmelden, damit diese Änderung aktiv wird!

bash$ echo '*;*;[KENNUNG];Al0000-2400;docker' >> /etc/security/group.conf
bash$ cat /etc/security/group.conf
...
*;*;[KENNUNG];Al0000-2400;docker