Docker

Aus CodicaTipps
Zur Navigation springen Zur Suche springen

Docker ist eine Container-Lösung, eine Art "leichte" Virtualisierung.

Installation

Installation unter Debian 9 Stretch

Siehe


Installation unter Ubuntu

 sudo aptitude install lxc apparmor docker.io
 sudo addgroup USER docker
 docker info

Speicherort für Images etc. umhängen

Mit

 docker info

kann man sich anzeigen lassen, wo Docker Images u.Ä. abspeichert. In der /etc/fstab kann man das auf einen Ordner einer anderen Partition umhängen:

 /media/anderePartiton/aufsRoot /var/lib/docker/aufs	none	bind 0 0


Alternativ gibt man in der Datei /etc/default/docker in den DOCKER_OPTS den zusätzlichen Parameter -g an. Beispiel:

 DOCKER_OPTS="-g /mnt/mybigdata/dockerroot"

Erstellen eines eigenen Basis-Images

Auf Ubuntu / Debian-Basis lässt sich mit Hilfe von debootstrap und tar ein Basisimage erstellen. Siehe dazu die Docker-Anleitung.

Dazu erstellt man die Grundstruktur des neuen Systems mit debootstrap:

 mkdir wheezyBaseFiles
 sudo debootstrap --variant=minbase wheezy wheezyBaseFiles

Anschließend wird die komplette Verzeichnisstruktur in ein tar-Archiv gepackt und über eine Linux-Pipe sofort in docker importiert:

 sudo tar -C wheezyBaseFiles -c . | docker import - myuser/wheezy_base

Kleiner Test:

 docker run myuser/wheezy_base cat /etc/os-release

oder die Shell starten mit

 docker run -t -i myuser/wheezy_base /bin/bash


Bauen eines Images mit Dockerfile

Dazu erstellt man eine Datei namens Dockerfile in einem (leeren) Verzeichnis mit folgendem Inhalt:

 FROM wheezy_base
 MAINTAINER email@mailprovider.com
 RUN apt-get update && apt-get -y install apache2-mpm-prefork apache2 mediawiki


Dann wechselt man in das Verzeichnis mit cd und baut das Image mit folgendem Befehl:

 docker build -t IMAGENAME:IMAGETAG .

Ausführen einer Shell

Mittels der Flags -i (für interaktiv) und -t (für Binden von stdin und stdout ans Terminal) lässt sich auch eine interaktive Shell ausführen.

 docker run -i -t wheezy_base /bin/bash

Starten eines zweiten Terminals

Braucht man eine zweite Shell für einen laufenden Container, sucht man zunächst den Containernamen

 docker ps 

Dann startet man die Bash das zweite Mal:

 docker exec -t -i myuser/wheezy_base /bin/bash


Privates Repository

Installation und Start

Für ein privates Repository startet man - ganz docker-like - einen entsprechenden Container mit dem Image "registry":[1]

 docker run -d -p 5000:5000 --restart=always --name registry   -v `pwd`/data:/var/lib/registry   registry:2

Konfiguration einer unsicheren privaten Registry

Für Testzwecke kann man auch von anderen Rechnern im privaten Netzwerk UNGESICHERT auf die Registry zugreifen. Dazu muss man dem Daemon das aber explizit erlauben, indem man folgende Zeile in /etc/default/docker einfügt:

 DOCKER_OPTS="--insecure-registry registryrechner:5000"

Dann muss man diesen Daemon neu starten:

 sudo service docker restart

Eintragen eines Images im Registry

Zunächst muss das vorhandene Image umgetaggt werden:

 docker tag user/eigenesimage registryrechner:5000/user/eigenesimage

Dann muss es hochgeschoben werden:

 docker push registryrechner:5000/user/eigenesimage

Docker und Netzwerk

Einen Port des Containers kann man mit der Option -p als Port des Hosts zur Verfügung stellen:

 docker run -p 4304:4304 myimage

Leider scheint es Probleme mit IPv4-Adressen des Hosts zu geben. Abhilfe schafft in kleineren Fällen die Option --net=host. Diese sollte aber aus Sicherheitsgründen vermieden werden, weil damit von außen voller Zugriff auf alle Ports des Containers gegeben wird.

Docker und IPv6

Docker hat standardmäßig die IPv6-Unterstützung nicht eingeschaltet. Das kann man aber machen:

Docker updates

Auch Docker container müssen auf neue Versionen überwacht werden.

Monitoring container updates

Mit What's up Docker kann man sich z.B. eine Email zuschicken lassen, wenn ein Container-Image upgedatet wurde.

Troubleshooting Docker

SystemD läuft nicht

Es gibt grundsätzlich zwei Möglichkeiten, systemd-services bereitzustellen:

Chrome/Chromium startet nicht

Wenn Chrome nicht startet (Fehlermeldung: Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted), hilft das Argument --no-sandbox.[2]

Einzelne Images

MySQL-Image

Siehe für ein einfaches Dockerfile für einen MySQL-Container:

Wenn MySQL nicht mit

 mysqld

startet, kann es daran liegen, dass der Socket nicht erstellt werden kann. Dann:

 mkdir /var/run/mysqld/
 chmod a+w /var/run/mysqld/