Docker-Upgrade – immer wieder für eine Überraschung gut

Ich mag Docker. Wirklich. Und zugegebenermaßen habe ich mich jetzt eine Weile nicht mehr so intensiv mit Docker beschäftigt wie z.B. vor einem Jahr. Momentan baue ich ein kleines Docker-Image für Backups, und so kam es dazu, dass ich mich kurz auf den Docker-Seiten umgesehen habe. Der Docker Hub ist nun also veraltet und wurde durch Docker-Cloud ersetzt. Ok… Die Webseiten unterliegen ebenfalls einiger Veränderung, nur was soll dieser Farbwechsel im Header, der direkt aus der Demo-Hölle entsprungen zu sein scheint? Diese ignorierend bin ich zur Docker-Cloud vorgedrungen und konnte immerhin feststellen, dass die Images aus dem Docker Hub übernommen worden sind. Und der Login bzw. die Docker-ID gilt ebenfalls noch. Wunderbar. 

Docker – Versionen und Namen

Ein wenig überrascht hat mich die Versionsangabe in der rechten oberen Ecke der Docker-Dokumentation. Dort stand zu lesen, dass Docker v17.06 (current) anscheinend die aktuelle sei. Auf meinen Maschinen läuft zwar bereits die dreimal umbenannte und aktuelle Fassung namens „docker-ce„, aber bei der Version wurde ich stutzig. Schnell geprüft:

$ docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:20:42 2017
 OS/Arch:      linux/amd64

Also nicht ganz aktuell – nicht weiter tragisch, aber da es sich nicht um produktive Systeme handelt, sondern um private Test-Server, wollte ich schon gerne die aktuelle Version installieren. Sollte ja kein Problem sein. Also wie üblich:

geschke@pirita:~$ sudo apt update
Holen:1 http://security.ubuntu.com/ubuntu zesty-security InRelease [89,2 kB]
OK:2 http://de.archive.ubuntu.com/ubuntu zesty InRelease
OK:3 http://de.archive.ubuntu.com/ubuntu zesty-updates InRelease
OK:4 http://de.archive.ubuntu.com/ubuntu zesty-backports InRelease
OK:5 https://apt.dockerproject.org/repo ubuntu-zesty InRelease
Es wurden 89,2 kB in 0 s geholt (118 kB/s).
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Alle Pakete sind aktuell.

Ok… Hat Docker neue Versionen? Ist „current“ nicht „current“? Haben sie die v17.06 noch nicht auf die Öffentlichkeit los gelassen?

Ergo kurzerhand nach der Installationsanleitung für Ubuntu gesucht. Allein der Weg dorthin war anfangs ein wenig steinig, denn bei „Product Manuals“ wurden einem unter „Tools“ zwar „Installation guides“ beim Punkt „Docker for Linux“ angeboten, nur war in der seitlichen Navigation davon nichts zu finden. Danach befand man sich aber im Haupt-Navigationspunkt „Guides“, und nach weiteren zwei Klicks immerhin auf der Ubuntu Anleitung für die Docker Community Edition Installation.

Das mag bis hierhin Meckern auf hohem Niveau sein, immerhin bietet Docker mittlerweile Tonnen an Informationen und Dokumentation an, allerdings merkt man die stetige und sehr schnelle Veränderung den Web-Seiten auch an. Mitunter leidet damit die Konsistenz, jedenfalls habe ich nicht zum ersten Mal nach der richtigen Stelle im Manual gesucht.

Nach kurzer Durchsicht wurde klar, was das Problem sein könnte. Zwar hatte ich die letzte Docker-Version nach Anleitung installiert, aber damals war wieder alles anders. Die aktuell vorhandene Paket-Download-Location in der Datei /etc/apt/sources.list.d/docker.list sah wie folgt aus:

deb [arch=amd64] https://apt.dockerproject.org/repo ubuntu-zesty main

Einige der Vorbereitungen waren bereits getroffen, so mussten die Packages für apt nicht mehr installiert werden – schließlich lief Docker bereits auf dem System!

Weiter also mit dem – wie es aussah ebenfalls neuen – GPG-Key:

geschke@pirita:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK
geschke@pirita:~$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid        [ unbekannt ] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

Verglichen mit dem Fingerprint auf den Docker-Seiten – sah ok aus.

Danach hieß es, die aktuelle Download-Location anzugeben. Docker schlägt dazu folgendes vor:

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

Das geht zwar schön automatisch in einem Satz, aber leider wird damit das Repository der Haupt-Datei /etc/sources.list hinzugefügt. Wozu gibt es das Verzeichnis /etc/apt/sources.list.d/ mit der Möglichkeit, dort explizit Locations anzugeben, die nicht zur Distribution gehören? Das erspart nicht zuletzt Ärger bei weiteren Upgrades. Und ich meine sogar, dass dieses Verfahren in irgend einer der früheren Docker-Varianten vorgeschlagen bzw. sogar ausgeführt wurde, da gab es doch mal ein Shellskript zur Installation…

Somit erstmal das o.g. Kommando ausgeführt – unter der Prämisse, später die Datei /etc/apt/sources.list wieder aufräumen zu müssen. Folgende zwei Zeilen wurden hinzugefügt:

deb [arch=amd64] https://download.docker.com/linux/ubuntu zesty stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu zesty stable

Diese Zeilen ersetzten damit den Inhalt der Datei /etc/sources.list.d/docker.list, aus der Haupt-Datei /etc/apt/sources.list habe ich die Zeilen dann wiederum entfernt.

Danach ein beherztes

sudo apt update

gefolgt von einem

sudo apt -s upgrade

Man will ja schließlich nachschauen, was genau updated werden soll. Aber – nichts zu finden:

geschke@pirita:~$ sudo apt -s upgrade
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Paketaktualisierung (Upgrade) wird berechnet... Fertig
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.

Ok.. Da war noch ein Hinweis, man solle alte Versionen deinstallieren. Aber so alt war meine Version doch gar nicht, „docker version“ gab immerhin ein 17.05.0-ce aus. Insofern schien die „Community Edition“ installiert zu sein?

Aber der Paketname war ein anderer bzw. lautete noch nicht docker-ce! Daher der Hinweis, zuvor alle bisherigen Versionen zu entfernen, darin fanden sich inzwischen bereits drei Bezeichnungen:

sudo apt-get remove docker docker-engine docker.io

Bei mir reichte ein „sudo apt remove docker-engine“ – immerhin sollten die relevanten Verzeichnisse für Images und Container ja erhalten bleiben.

Nun endlich docker-ce installiert:

geschke@pirita:/etc/apt/sources.list.d$ sudo apt install docker-ce
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden NEUEN Pakete werden installiert:
  docker-ce
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.
Es müssen 20,6 MB an Archiven heruntergeladen werden.
Nach dieser Operation werden 96,2 MB Plattenplatz zusätzlich benutzt.
Holen:1 https://download.docker.com/linux/ubuntu zesty/stable amd64 docker-ce amd64 17.06.0~ce-0~ubuntu [20,6 MB]
Es wurden 20,6 MB in 2 s geholt (8.709 kB/s).
Vormals nicht ausgewähltes Paket docker-ce wird gewählt.
(Lese Datenbank ... 97238 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../docker-ce_17.06.0~ce-0~ubuntu_amd64.deb ...
Entpacken von docker-ce (17.06.0~ce-0~ubuntu) ...
docker-ce (17.06.0~ce-0~ubuntu) wird eingerichtet ...
Trigger für ureadahead (0.100.0-19) werden verarbeitet ...
Trigger für systemd (232-21ubuntu5) werden verarbeitet ...
Trigger für man-db (2.7.6.1-2) werden verarbeitet ...

Das sieht doch ganz gut aus, mal schnell testen:

geschke@pirita:/etc/apt/sources.list.d$ docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:18:10 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

geschke@pirita:/etc/apt/sources.list.d$ docker images
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Leider doch weniger gut – zwar ist Docker in der neuen Version 17.06-ce nun installiert, aber der Daemon läuft nicht. Damit lässt sich somit nichts anfangen.

Wie erwartet konnte der Docker-Daemon nicht erfolgreich gestartet werden:

geschke@pirita:/etc/apt/sources.list.d$ sudo systemctl status docker.service
● docker.service
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2017-07-24 16:03:45 CEST; 3min 48s ago
 Main PID: 7996 (code=exited, status=1/FAILURE)
      CPU: 18ms

Jul 24 16:03:45 pirita systemd[1]: Started docker.service.
Jul 24 16:03:45 pirita docker[7996]: `docker daemon` is not supported on Linux. Please run `dockerd` directly
Jul 24 16:03:45 pirita systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Jul 24 16:03:45 pirita systemd[1]: docker.service: Unit entered failed state.
Jul 24 16:03:45 pirita systemd[1]: docker.service: Failed with result 'exit-code'.

Wieder eine kleine, aber auffällige Änderung. Immerhin ist die Fehlermeldung relativ eindeutig, nichtsdestotrotz habe ich mich noch im Netz umgeschaut und u.a. diese Diskussion eines bislang ungelösten Falles gefunden. Anscheinend tritt das Problem nicht nur bei Upgrades auf, sondern auch bei mit „docker-machine“ neu eingerichteten Docker Hosts, bei denen die entsprechende Konfigurationsdatei (die Quelle nennt /etc/systemd/system/docker.service.d/10-machine.conf) nicht erzeugt wird.

Bei mir war die Ursache in der Datei /etc/systemd/system/docker.service zu finden. Der bisherige Inhalt lautete wie folgt:

[Service]
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver btrfs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label instance=xlarge --label provider=generic
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
Environment=

[Install]
WantedBy=multi-user.target

Nun gibt es das Kommando docker daemon nicht mehr, sondern wurde durch „dockerd“ ersetzt. Somit geändert:

[Service]
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver btrfs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label instance=xlarge --label provider=generic
[...]

Hinweis: Auch die Existenz der Datei /etc/systemd/system/docker.service ist den bisherigen Updates geschuldet bzw. es kann sein, dass Docker sich inzwischen wieder eine andere Stelle überlegt hat, an der die Systemd-Konfigurationsdatei zu finden ist.

Nun noch systemd den geänderten Inhalt beibringen:

$ sudo systemctl daemon-reload

und den Docker-Daemon starten:

$ sudo systemctl start docker.service

Das sieht nun wieder besser aus! Client und Server laufen:

$ docker version
Client:
 Version:      17.06.0-ce
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:18:10 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.06.0-ce
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   02c1d87
 Built:        Fri Jun 23 21:17:03 2017
 OS/Arch:      linux/amd64
 Experimental: false

Das bestätigt auch der Blick ins systemd-Log:

$ sudo systemctl status docker.service
● docker.service
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-07-24 16:30:32 CEST; 1min 29s ago
 Main PID: 8895 (dockerd)
    Tasks: 27 (limit: 4915)
   Memory: 36.9M
      CPU: 5.883s
   CGroup: /system.slice/docker.service
           ├─8895 /usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver btrfs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label instance=xlarge --label provider=generic
           └─8910 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

[...]

Nun heißt es jedoch, diese doch recht manuellen Schritte auf den anderen Docker Hosts ebenso auszuführen.

Fazit

Ich mag Docker ja noch immer. Aber man merkt dem System an, dass es schnell wächst, mitunter etwas zu schnell, so dass manches außen vor bleibt.

Einen Upgrade-Prozess gibt es de-facto nicht. Das fängt bei der Änderung der Repository-URL an und hört bei der Streichung eines Kommandos noch lange nicht auf. Immerhin gibt Docker den richtigen Hinweis aus – von wegen „docker daemon“ wurde durch „dockerd“ ersetzt, den Rest muss man jedoch umständlich manuell erledigen.

Ebenfalls existiert keine Dokumentation des Upgrade-Prozesses, oder wenigstens eine FAQ, die derartige Probleme klar bezeichnet und Lösungen beschreibt. Die Diskussionen bzw. Fehlereinträge auf Github sprechen für sich. Was mich daran wundert, ist, dass trotz der schnellen Weiterentwicklung jene Fälle doch recht lange geöffnet bleiben und keine zügige Behebung stattfindet.

Zwar läuft nun alles wieder – zumindest bis zum nächsten Upgrade, zur nächsten Repository-Änderung, Umbenennung usw..

Nachtrag

Im Zuge des Upgrade-Reigens wollte ich Docker auch auf einem anderen Host aktualisieren, dessen Grundlagen ein wenig neuer waren. Immerhin gab es dabei weniger Probleme, da der letzte Schritt nicht mehr notwendig war. Das systemd-Konfigurationsfile beinhaltete bereits den Aufruf von dockerd:

geschke@waren:/etc/apt/sources.list.d$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2017-07-24 22:50:54 CEST; 2min 15s ago
     Docs: https://docs.docker.com
 Main PID: 24336 (dockerd)
   CGroup: /system.slice/docker.service
           ├─24336 /usr/bin/dockerd -H fd://
           └─24343 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --m
[...]

Insofern lief der Docker-Daemon auch nach dem Upgrade wieder. Und nicht zuletzt legt das systemd-Konfigurationsfile unter /lib/systemd/system/docker.service.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Tags: