Docker unter Ubuntu 15.04

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.

Teilen Sie diesen Beitrag

Das könnte dich auch interessieren …

6 Antworten

  1. Patrick sagt:

    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!

  2. Christoph Grimmer-Dietrich sagt:

    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.

    • Patrick sagt:

      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.

Schreibe einen Kommentar

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