Docker

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

Voraussetzungen

Pakete für Ubuntu 22.04 (jammy)

bash$ 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
bash$ curl -fsSL http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install docker-ce

Pakete für Ubuntu 20.04 (focal)

bash$ 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
bash$ curl -fsSL http://homespun.rrze.uni-erlangen.de/mirror/download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
bash$ sudo DEBIAN_FRONTEND=noninteractive apt-get install docker-ce

Pakete für Ubuntu 18.04 (bionic)

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

Konfiguration

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

Docker Bridge

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 🙂

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