Docker

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

Vorraussetzungen

Pakete für Ubuntu 18.04

# one-liner 
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.

Um den Netzbereich anzupassen sind die folgenden Schritte notwendig.

Ubuntu 14.04 (Upstart)

/etc/default/docker:

...
DOCKER_OPTS="--bip=169.254.254.1/24"
...
bash # service docker restart

Ubuntu 16.04 (Systemd)

1. Docker-Daemon Konfiguration anpassen

bash$ sudo systemctl edit docker

2. Folgenden Inhalt einfügen

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

Fortsetzung ab Punkt 3 für Ubuntu 18.04

Ubuntu 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 16.04/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

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 folgende Methode fügt eine Benutzerkennung bei der Anmeldung dynamisch zur benötigten lokalen docker Gruppe hinzu und funktioniert deshalb auch mit LDAP-basierten Kennungen und der lokalen docker Gruppe (siehe auch https://help.ubuntu.com/community/LDAPClientAuthentication#Assign_local_groups_to_users).
Sollten Sie einer lokale Kennung verwenden, kann diese natürlich auch direkt der lokalen docker Gruppe hinzugefügt werden.

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