Datenbank gefällig? Einfach schnell docker run –name mysql -e MYSQL_ROOT_PASSWORD=rootpasswort -d mysql:latest eingeben und schon läuft eine aktuelle MySQL-Datenbank im Container. Soweit das Versprechen. Doch erstmal will Docker installiert sein und dabei gibt es unter Ubuntu 15.04 die eine oder andere kleine Klippe zu umschiffen…
Docker Service installieren und starten
Die Installation von Docker selbst ist trivial.
sudo apt install docker.io
Leider gibt der Versuch, Docker jetzt zu starten oder einfach nur docker info aufzurufen oft die Fehlermeldung:
FATA[0000] Get http:///var/run/docker.sock/v1.17/info: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
Anders als zu erwarten wäre hat das gar nichts mit TLS zu tun: Der Docker Service läuft schlicht nicht und hat daher die Pseudodatei (es handelt sich um ein Socket) docker.sock noch nicht angelegt. Das hat scheinbar damit zu tun, dass Ubuntu seit Version 15.04 nicht mehr Upstart sondern systemd verwendet um seine Services zu verwalten.
$ systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: inactive (dead) since ...
Wenn es die Datei erstmal gibt und der Service nicht läuft gibt es im übrigen eine sehr viel aussagekräftigere Fehlermeldung:
FATA[0000] Cannot connect to the Docker daemon. Is 'docker -d' running on this host?
Mit sudo systemctl start docker startet man den Docker Service und mit sudo systemctl enable docker sorgt man dafür, dass Docker beim nächsten Systemstart mit gestartet wird. Das sollte automatisch so sein – bei mir war das nicht so. Nach dem Starten des Service sieht die Sache dann schon ganz anders aus.
$ systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since ... Docs: http://docs.docker.com Main PID: 4342 (docker) Memory: 2.8M CGroup: /system.slice/docker.service └─4342 /usr/bin/docker -d -H fd://
Mittels sudo docker info bekommt man jetzt endlich etwas zu sehen:
Containers: 1 Images: 15 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 17 Execution Driver: native-0.2 Kernel Version: 3.19.0-18-generic Operating System: Ubuntu 15.04 CPUs: 4 Total Memory: 15.55 GiB Name: flavia-cgd ID: XAFY:2MO4:KANP:QYWY:R2FK:DHVB:GM7X:UZGJ:64JY:LMDS:JC3M:WY6Q WARNING: No swap limit support
Und als normaler User?
Eigentlich ist man an dieser Stelle jetzt soweit und kann seine Docker Container loslaufen lassen. Aber als Entwickler möchte ich nicht immer alles, was ich so in die Finger bekomme, via sudo als root laufen lassen, sondern mit meinen Rechten. Leider geht das erstmal nicht:
$ docker info FATA[0000] Get http:///var/run/docker.sock/v1.17/info: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
Warum da jedesmal dieser TLS-Kram steht, ist mir im Übrigen schleierhaft… Sei’s drum. Das Rätsels Lösung ist, dass ein normaler Nutzer nicht das Recht hat auf den Socket zuzugreifen. Gerade für einen Server soll das ja auch so sein. Aber, wie gesagt, als Entwickler wäre es mir lieber, einen Container mit weniger Rechten laufen lassen zu können.
Mittels
sudo apt install apparmor cgroup-lite
gibt man dem Host weitere Werkzeuge zur Rechteverwaltung. Der Socket gehört root:docker. Daher fügt man mittels sudo usermod -a -G docker cgd den Nutzer, der Docker nutzen soll (hier cgd), der Gruppe docker hinzu. Schnell testen:
$ groups cgd adm cdrom sudo dip plugdev lpadmin sambashare
Oh. Kleine Falle: Die neue Gruppe ist erst sichtbar, nachdem man sich aus- und eingeloggt hat. Alternativ hilft newgrp docker .
$ groups cgd adm cdrom sudo dip plugdev lpadmin sambashare docker
Das sieht schon besser aus. Anders herum geht es im Übrigen mit dem netten Tool members, das man allerdings erst via sudo apt install members installieren muss:
$ members docker cgd
Leider klappt es immer noch nicht Docker aufzurufen. Die cgroups werden teilweise beim Booten des Systems angelegt. Man kann das wohl auch durch geschicktes Neustarten der Services erreichen, aber manchmal ist weniger mehr. Also kurz neu gestartet… E voilá:
$ docker info Containers: 1 Images: 15 Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 17 Execution Driver: native-0.2 Kernel Version: 3.19.0-18-generic Operating System: Ubuntu 15.04 CPUs: 4 Total Memory: 15.55 GiB Name: flavia-cgd ID: XAFY:2MO4:KANP:QYWY:R2FK:DHVB:GM7X:UZGJ:64JY:LMDS:JC3M:WY6Q WARNING: No swap limit support
Noch eine Anmerkung zu der Datenbank vom Anfang…
Die Datenbank so zu starten wie in der Einführung beschrieben funktioniert im Prinzip. Allerdings ist bei Docker normalerweise alles weg, wenn der Container beendet wird. Für eine Wegwerf-Datenbank zum Testen mag das genau das Richtige sein; ansonsten muss man, wie z.B. auf https://registry.hub.docker.com/u/library/mysql/ beschrieben, seine Daten außerhalb des Containers persistieren. Ich schreibe deswegen „normalerweise“ weil das mysql Image ein von Docker verwaltetes Volume anlegen lässt um Daten über die Laufzeit des Containers hinaus zu erhalten. Das ist bei Leibe nicht immer der Fall und man sollte sich nicht blind darauf verlassen, dass es alle Images so machen!
Viel Spaß beim Rumdockern!
Das Titelbild stammt von https://www.flickr.com/photos/xmodulo/14098888813 und steht unter der CC BY 2.0 Lizenz.
Hi Christoph, danke für den interessanten Artikel. Für was genau installierst du apparmor und das cgroup-lite Paket? Die usermod und groups Befehle stehen ja auch so zur Verfügung. Grüße!
Hallo Patrick,
das ist ein bisschen dem Rumprobieren geschuldet. Nur durch das usermod hat es nicht funktioniert, mich als normaler Nutzer einen Container laufen zu lassen. Auf stackoverflow (http://stackoverflow.com/questions/27528337/am-i-trying-to-connect-to-a-tls-enabled-daemon-without-tls) habe ich dann die Sache mit apparmor und cgroup-lite gefunden. Da es danach geklappt hat, steht’s so im Blog.
Okay. Danke! Ich habe diesen Schritt unter Ubuntu 15.04 nämlich nicht gebraucht, aber ich nutze auch das Docker-Paket aus den Docker-Repositories `deb https://get.docker.com/ubuntu docker main`, dort steht bereits Version 1.6.2 zur Verfügung.