Das Einsteiger-Tutorial für Docker-Neulinge!

In 11 Schritten mit Docker durchstarten
1 Kommentar

Webprojekte werden immer komplexer und die Halbwertszeit der Technologien, die dabei zum Einsatz kommen, immer kürzer. Im Wettbewerb um den Kunden müssen fortwährend neue Features und Updates integriert werden. Klassische Softwareentwicklungsprozesse und Vorgehensweisen stoßen dabei an ihre Grenzen. DevOps, Docker und Microservices schaffen neue Möglichkeiten, digitale Projekte schneller und flexibler umzusetzen.

Applikationen können deutlich schneller „live gehen“ und im laufenden Betrieb aktualisiert werden. Hierbei ist Docker das führende „Transportmittel“ und die zentrale Technologie in der DevOps-Welt.

Bereits in den 50er Jahren wurde die Container-Technologie in der Handelsschifffahrt eingeführt, um Waren und Güter effizienter um die Welt zu transportieren. Heute, rund 60 Jahre später, wird diese Idee auf die Softwareentwicklung übertragen. Statt Waren wird Software in „Container“ gepackt.

Container können einzeln bereitgestellt, aufgerufen und aktualisiert werden, wodurch „Continous Delivery“ und „Continous Integration“ von Schlagwörtern zur gelebten Realität werden. Im Vergleich zu klassischen „virtuellen Maschinen“ ist Docker leichtgewichtig und spart Ressourcen. Das betrifft die Rechenpower, die Bandbreite und den Storage gleichermaßen. Deploymentprozesse werden vereinfacht und die Ressourcenaufwände zwischen Development (Dev) und Operations (Ops) minimiert. Mit der Docker-Technologie kann der Entwickler die Applikation auf verschiedenen Zielsystemen bzw. den sog. Stages einfach und schnell deployen. Alle Abhängigkeiten zu den Betriebssystem-Bibliotheken werden dabei gekapselt und mit dem Docke-Image ausgeliefert.

Die Erfahrungen im Umgang mit der Container-Technologie Docker hat André Hirsinger für Docker-Neulinge in 11 Schritten zusammengefasst.

1.Installation der Docker-Umgebung

Der Einstieg in die Technologie ist leicht. Das Projekt ist gut dokumentiert und für die meisten Linux-Distributionen gibt es entsprechende Installationsquellen. Der Start kann quasi sofort auf dem eigenen Notebook erfolgen. Einige im Netz verfügbare Installations-Anleitungen zeigen deutlich den pragmatischen agilen Ansatz. Dort wird schon mal ein Download direkt an eine Shell weitergereicht.

Die Installation einer Docker-Umgebung auf einem Linux-Betriebssystem ist denkbar einfach. Unter Debian 8 wird das Package docker.io benötigt:

$ sudo apt-get install docker.io

Weitere Informationen zur Installation bietet die Dokumentation.

Docker hat nicht den Anspruch, zu klassischen Themen wie z.B. Persistenz und Replikation von Daten eine Lösung zu liefern. Trotzdem ist die Container-Virtualisierung ein wertvolles Hilfsmittel, um sich mit solchen Themen auseinanderzusetzen. Das gleiche gilt für die Verwaltung von Logfiles.

Über Neofonie

Mit der Entwicklung der ersten deutschen Suchmaschine, Fireball, wurde Neofonie 1998 gegründet. Heute ist die Berliner Softwaremanufaktur ein IT-Alleskönner und setzt sich im Alltagsgeschäft laufend mit neuen Technologien auseinander.

 

2.Docker-Images als Container starten

Zur Docker-Registry findet man unter https://registry.hub.docker.com Container-Images. Dabei gibt es offiziell unterstützte Repositories bekannter Betriebssysteme und Anwendungen wie z.B. CentOS, MongoDB oder MySQL. Einen Schutz der bereitgestellten Images durch Signaturen gibt es dabei noch nicht.

Um beispielsweise ein MySQL-Datenbank Image aus der Registry zu holen und als Container zu starten, würde man Folgendes ausführen:

# docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used... 850 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed for of M...164 [OK]
# docker pull mysql
# docker run -e MYSQL_ROOT_PASSWORD=geheim -p 4242:3306 mysql

 

3.Eigene Docker-Images erstellen

Ein Docker-Image kann entweder aus einer Definitionsdatei – der Dockerfile – erstellt oder über Änderungen an einem bereits laufenden Container erzeugt werden.

Die Dockerfile enthält den Bauplan des Images und stützt sich meistens auf ein generisches Betriebssystem-Image. Hier ein Beispiel für die Bereitstellung einer Entwicklungsumgebung:

# Dockerfile for https://index.docker.io/u/crosbymichael/python/
FROM debian:jessie
RUN apt-get update && apt-get install -y \
git \
libxml2-dev \
python \
build-essential \
make \
gcc \
python-dev \
locales \
python-pip
RUN dpkg-reconfigure locales && \
locale-gen C.UTF-8 && \
/usr/sbin/update-locale LANG=C.UTF-8
ENV LC_ALL C.UTF-8

Nachdem das Image mit dem Kommando docker build ./ erzeugt wurde, kann daraus ein Container gestartet werden. Änderungen an diesem Container können dann z.B. über eine Shell erfolgen:

docker exec -ti <container_name> bash
root@8132f255517a:/var/www/html# apt-get install curl

Möchte man aus diesen Änderungen ein neues Image erzeugen, führt man den Befehl docker commit aus. Dabei ist es wichtig zu wissen, dass ein solches Image zunächst nur lokal vorhanden ist. Mit dem Befehl docker images erhält man eine Liste der lokalen Kopien.

Die Images können dann schließlich in einer Registry abgelegt werden. Dafür muss man das Image mit einem Tag versehen, um es anschließend in die Registry zu „pushen“.

# docker images
debian latest 4a5e6db8c069 6 days ago 125.1 MB
haproxy latest fc640eeacf3c 6 weeks ago 98.08 MB
# docker tag fc640eeacf3c registry.neofonie.de/asp/haproxy:t

Docker im Videotutorial

entwickler.tutorialsIn unserem entwickler.tutorial Microservices mit Spring Boot und Spring Cloud von Eberhard Wolf dreht sich ein ganzes Kapitel um Docker – von Containern über die Machine bis hin zum Arbeiten mit eigenen Images. Jetzt anmelden und das 3-in-1 Gratisturorial sichern!

 

4.Images selbst verwalten

Möchte man seine Docker-Images und den Zugriff darauf selbst verwalten, benötigt man eine eigene Registry. Die Registry steht als Docker Image bereit.

Passwortschutz und SSL-Verschlüsselung können über bereits vorhandene Systeme in der eigenen Hosting-Umgebung erfolgen; z.B. mittels eines Apache-Proxy oder HAProxy.

Sollen Docker-Images in einer Continuous-Integration-Plattform automatisiert erzeugt werden, dann ist es ebenfalls sinnvoll, eine eigene Registry zu benutzen. Eine lizenzpflichtige Alternative ist die Docker Trusted Registry mit offiziellem Support.

 

5.Container betreiben mit docker-compose

Eine Webanwendung besteht meistens aus unterschiedlichen Komponenten. Im einfachsten Fall z.B. aus einer Datenbank und einem Webserver. Möchte man beides als Container betreiben, benötigt man eine Definition der Umgebung und der Abhängigkeiten.

Docker bietet dafür das Tool „docker-compose“. Schwerpunkt dabei ist der Betrieb mehrerer voneinander abhängiger Container auf einem Host.

DevOps Docker Camp

Sie lernen die Konzepte von Docker und bauen Schritt für Schritt eine eigene Infrastruktur für und mit Docker auf.

 

6.Hosting ist Docker-ready

Neben dem Betrieb der Applikation im Container ist bei einem Produktiveinsatz auch der Betrieb der Infrastruktur zu betrachten. Die Aufgabe ist hier, die Deployment-Prozesse für die Infrastruktur so auszurichten, dass die mit Docker geschaffenen, vereinheitlichten Schnittstellen genutzt werden. Mittelfristig ermöglicht das eine Beschleunigung aller damit verbundenen Prozesse.

Es ist grundsätzlich notwendig, die jeweiligen Betriebssysteme der Server auf den Docker-Einsatz vorzubereiten. Die aktuellste „Release“-Version der Engine docker.io (siehe Step 1) sollte unter Berücksichtigung der benötigten Features installiert werden. Parallel sollte der Linux-Kernel hinreichend aktuell sein: Hier empfiehlt es sich, die zum Zeitpunkt des Docker-Releases aktuellste Stable-Version des Kernels zu verwenden. Darüber hinaus ist es ideal, wenn die Hosting-Umgebung zugehörige Werkzeuge wie z.B. docker-compose aus dem Docker-Projekt bereitstellt, um Docker-Images gleichförmig auszurollen und zu verwalten. Auch die Bereitstellung einer eigenen Docker-Registry gehört zum Umfang einer eigenen Docker-Hosting-Umgebung, um eine einfache Ablage und zentrale Verwaltung aller Docker-Images zu ermöglichen. Gerade beim Thema Orchestrierung (dazu später mehr) fällt der Hosting-Umgebung zudem die Aufgabe zu, unterstützende Dienste wie Service Discovery möglichst hochverfügbar in der Infrastruktur zur Verfügung zu stellen.

Als Sicherheitsmaßnahme ist es geboten, verschiedene Docker-Umgebungen voneinander zu kapseln. Hier empfiehlt es sich nach Stand der Technik, eine Hardware-Virtualisierungsschicht auf Betriebssystemebene (z.B. Linux KVM) einzuziehen und auf Netzwerkebene durch VLANs unabhängige Netzwerkumgebungen zu schaffen. Daten unterschiedlicher Mandanten werden so effektiv voneinander getrennt und Auswirkungen von potentiellen Sicherheitslücken auf die Infrastruktur minimiert.

Wichtig ist ein Zusammenspiel mit einem Konfigurationsmanagement wie z.B. Puppet, um die Konfiguration der zugrundeliegenden Infrastruktur zu automatisieren. Zur konsequenten Umsetzung lohnt es sich aktuell, wenn in der Hosting-Umgebung eigene Distributionspakete für den benötigten Software-Umfang gepflegt werden. Es ist damit zu rechnen, dass sich die Dynamik der Entwicklung in den kommenden zwei Jahren zumindest soweit beruhigt, dass die wichtigsten Features Einzug in die dann gängigen Linux-Distributionen gefunden haben. Es besteht dann eine höhere Auswahl an stabilen Versionen und die Notwendigkeit eigene Pakete zu pflegen, mag sich dann auf ausgesuchte Anwendungszwecke beschränken.

Lesen Sie auch: Microservices orchestrieren mit Docker & Consul

 

7.Persistenz der Daten in Docker

Der Container hat kein Gedächtnis. Eine Datenbank z.B. braucht einen Speicherort auf dem Docker-Wirt. Üblicherweise geschieht das über ein sogenanntes Docker Volume. Ideal ist auch die Verwendung eines Daten-Containers, der nur zum Zwecke der Persistenz gestartet wird. Alle anderen Container „mounten“ die Verzeichnisse des Daten-Containers. Der Speicherort kann dabei auf dem Wirt frei gewählt werden.

 

8.Wo finde ich meine Logfiles?

Ein Service, der in einem Container gestartet wird, sollte im Container selbst keine Logfiles erzeugen. Stattdessen wird die Konsolen-Ausgabe von Docker im Verzeichnis /var/lib/docker/containers/<container_id> im JSON-Format abgelegt. Eine Logrotation oder Tools zur weiteren Auswertung der Logfiles stellt Docker noch nicht bereit. Eine Kombination mit klassischen Tools ist jedoch ohne Probleme möglich.

Lesen Sie auch: Logging leichtgemacht

 

9.Docker und Security

Die Einhaltung von Security Policies sollte beleuchtet werden. Docker ist kein Hilfsmittel zur Erhöhung der IT-Sicherheit. Die Benutzer und Berechtigungen zur Steuerung der Docker Container sollten sauber aufgesetzt sein. Die Docker Option „– privileged“ sollte nicht verwendet werden.

Das Mapping der User-IDs passiert auf dem Wirt. Ein Abgleich über ein Konfigurationsmanagement ist erforderlich. Eine Datenbank innerhalb eines Containers würde z.B. mit der lokalen ID des PostgreSQL-Users gestartet werden. Auf dem Wirt könnte diese ID jedoch bereits für einen anderen Account verwendet werden.

 

10.Sicher ist sicher: Backup der Container

Nicht nur im Live-Betrieb sondern bereits während der Entwicklung kann es sehr hilfreich sein, ein Backup der Docker-Container aufzusetzen. Dabei gibt es einmal die bereits bekannten Daten innerhalb eines Docker-Containers und zum anderen als Volume definierte Daten außerhalb des Containers. Möchte man auf Nummer Sicher gehen, erstellt man von beidem ein Backup. Die Möglichkeit, einen Container zu „pausieren“, um z.B. einen konsistenten Datenbestand sichern zu können, ist dabei ein wertvolles Hilfsmittel.

Das Backup der Daten einer Datenbank über ein Backup-Script, welches ebenfalls über ein Docker Image „dbbackup“ deployed wird, könnte so aussehen:

# docker pause my_db
# docker run --rm --volumes-from my_db -v /data/backup:/backup myregistry/foo/dbbackup
# docker unpause my_db

Ein Backup des Datenbank-Containers ergibt Sinn, wenn dort während der Entwicklung Änderungen vorgenommen werden. Die Docker-Volumes sind im Docker-Export nicht enthalten:

docker export my_db > my_db.ta

Bei uns finden Sie regelmäßig mehr zum Thema!

 

11.Aufräumen, bitte!

Bei der Arbeit mit Docker entstehen im Filesystem schnell Dateien, die keinem Container mehr zugeordnet sind, bzw. Images, die nicht mehr benötigt werden. Das sollte man im Auge behalten, da Docker hier noch keine Tools zum „Aufräumen“ bietet. Genauer anschauen sollte man sich:

  • Die lokal zwischengespeicherten Images für den Start von Containern:
    Eine Liste erhält man mit dem Befehl docker images. Möchte man lokale Images löschen, funktioniert das mit docker rmi <Image ID>. Der Befehl docker images - f dangling=true liefert eine Liste nicht mehr benötigter Image Fragmente.
  • Docker-Volumes, die keinem Container mehr zugeordnet sind:
    Diese findet man unter /var/lib/docker/vfs/<Container ID>. Sie entstehen immer dann, wenn ein solcher Container mit dem Befehl docker rm <Container ID> gelöscht wird. Damit das nicht passiert verwendet man docker rm -v <Container ID>.

Beachtet man diese elf Schritte, ist der Einstieg in die Container-Technologie ein Kinderspiel!

 

Aufmacherbild: Footprints in the sand at sunset von Shutterstock / Urheberrecht: Hitdelight

Unsere Redaktion empfiehlt:

Relevante Beiträge

X
- Gib Deinen Standort ein -
- or -