Zum Jahresende dreht sich im IT-Administrator alles rund um das Thema 'Client- und Applikations-Virtualisierung'. So lesen Sie in der Dezember-Ausgabe, welche ... (mehr)

Speicher-Interna

Das Device-Mapper Storage-Backend erzeugt standardmäßig zwei Dateien unterhalb von »/var/lib/docker/devicemapper/devicemapper« : eine 100 GByte große Datei "data" und eine 2 GByte große "metadata"-Datei. Bei beiden Dateien handelt es sich um Sparse-Dateien, die also tatsächlich wesentlich weniger Platz auf dem Dateisystem belegen. Die Data-Datei enthält sämtliche Image-Daten Ihres Systems. Docker erzeugt aus diesen Dateien über ein Loopback-Mount die Block-Devices, die beim Starten eines Containers eingebunden werden.

Die Metadaten sämtlicher Container finden Sie unterhalb von »/var/lib/docker/containers« . Die Datei »config.json« enthält Informationen über einen Container im JSON-Format. Starten Sie einen Container, greift Docker auf die zuvor eingebundene "data"-Datei zurück. Rufen Sie »du -h /var/lib/docker/devicemapper/devicemapper/data« auf, sehen Sie, wieviel Plattenplatz diese Datei tatsächlich auf dem Dateisystem belegt. Je mehr Images Sie verwenden, desto größer wird der benötigte Plattenplatz. Reicht die Standard-Größe von 100 GByte nicht mehr aus, können Sie in einer eigenen Systemd Unit-Datei für den Docker-Service eine neue Größe für die "data"-Datei definieren. Kopieren Sie hierfür die Datei »/usr/lib/systemd/system/docker.service« nach »/etc/systemd/system/docker.service« und erweitern Sie die "ExecStart=/usr/bin/docker"-Zeile um die Optionen "--storage-opt dm.loopdatasize=500GB --storage-opt dm.loopmetadatasize=10GB".

An dieser Stelle sei darauf hingewiesen, dass der Einsatz von Loopback-Devices gegenüber reinen Block-Devices durchaus einen Performance-Nachteil mit sich bringt. In produktiven Umgebungen sollten daher die eigentlichen Daten- und Metadaten-Pools auf echten Block-Devices liegen. Die Readme-Datei [2] zum Device-Mapper Backend beschreibt, wie Sie eine solche Konfiguration durchführen können.

Listing 4: Docker-Build



### Ein Dockerfile für einen einfachen Webserver auf Basis des Fedora-Images.
# Ein Fedora Image mit einem Apache Webserver auf Port 8080
# Version 1
# Als Basis dient das Fedora-Image
FROM fedora
# Hier geben Sie Ihren Namen an
MAINTAINER Thorsten Scherf
# Das Image soll die letzten Fedora-Updates enthalten
RUN yum update -y
# Hier installieren Sie den eigentlichen Webserver
RUN yum install httpd -y
# Erzeugen Sie diesmal eine index.html innerhalb des Containers
RUN bash -c 'echo "Hello again..." > /var/www/html/index.html'
# Der Webserver-Port 80 soll von außen erreichbar sein
EXPOSE 80
# Schließlich soll der Webserver auch automatisch starten
ENTRYPOINT [ "/usr/sbin/httpd" ]
CMD [ "-D", "FOREGROUND" ]

Webserver in Docker

Das folgende Beispiel zeigt nun, wie Sie einen einfachen Webserver innerhalb eines Docker-Containers starten und ihn von außen erreichbar machen. Hierfür erzeugen Sie zuerst auf dem Host-System das Verzeichnis »/opt/www« und speichern die Datei »index.html« in diesem Verzeichnis:

# mkdir /opt/www
# echo "Hello World..." > /opt/www/index.html

Starten Sie im Anschluss mit dem folgenden Kommando einen neuen Container:

# docker run -d -p 8080:8000 --name=webserver -w /opt -v /opt/www:/opt /bin/python -m SimpleHTTPServer 8000

Hier tauchen gleich eine ganze Reihe von Neuerungen auf. Zum einen sehen Sie, wie Sie einen Port innerhalb des Containers (hier: 8000) auf einen beliebigen Port des Hosts mappen können. Sprechen Sie den Host auf dem gemappten Port an (hier: 8080), so wird die Anfrage tatsächlich an den Container-Port 8000 weitergeleitet. Desweiteren bekommt der Container in diesem Beispiel einen fixen Namen zugewiesen. Die Option "-w" setzt das Arbeitsverzeichnis für den Container. Um ein Volume des Hosts dem Container zur Verfügung zu stellen, können Sie es mittels der Option "-v" über einen Bind-Mount zur Verfügung stellen. In diesem Fall stellen Sie also das zuvor erzeugte Verzeichnis "/opt/www" des Hosts als "/opt" innerhalb des Containers bereit.

Schließlich starten Sie den Python-Interpreter innerhalb des Containers und rufen das Webserver-Modul mit dem Netzwerkport 8000 auf. Die Ausgabe von docker ps zeigt den Container nun an und weist auf das Mapping der Netzwerkports hin. Rufen Sie nun auf dem Host das Kommando »wget -nv -O -localhost:8080/index.html« auf, bekommen Sie die Startseite des Webservers innerhalb des Containers präsentiert.

An dieser Stelle ist es wichtig zu erwähnen, dass Docker standardmäßig auf dem Host ein Bridge-Device anlegt und ihm eine private IP-Adresse im Netzwerk 172.17.42.1/16 zuordnet. Die Netzwerkkarte eines jeden Containers wird mit dieser Bridge verknüpft und bekommt ebenfalls eine IP aus dem privaten Netzwerk zugewiesen. Vom Host aus können Sie diese IP-Adresse mit dem folgenden Kommando abfragen:

# docker inspect -f '{{.NetworkSettings.IPAddress}}' webserver

 

172.17.0.27

Das Kommando "docker inspect" ist sehr hilfreich, um sich Informationen zu einem Container anzeigen zu lassen. Rufen Sie es einmal ohne Option und nur mit dem Namen des Containers auf. Natürlich können Sie die Netzwerkkonfiguration an Ihre eigene Umgebung anpassen. Unter [3] finden Sie hierzu weitere Informationen.

comments powered by Disqus

Artikel der Woche

Eigene Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2019