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)

Container basieren auf Images

Bei einem Docker-Image handelt es sich um einen statischen Snapshot einer Container-Konfiguration zu einem bestimmten Zeitpunkt. Das Image kann mehrere Layer enthalten, wobei diese üblicherweise nur gelesen, nicht aber verändert werden können. Lediglich beim Start eines Containers bekommt das Image einen zusätzlichen beschreibbaren Layer hinzugefügt, in dem Änderungen erfolgen können. Üblicherweise besteht ein Docker-Container aus einem Plattform-Image, das die Laufzeitumgebung enthält, und weiteren Layern für die eigentliche Applikation und deren Abhängigkeiten.

Ein sogenanntes Dockerfile beschreibt den genauen Aufbau eines Images und kommt immer dann zum Einsatz, wenn Sie ein neues Image erzeugen wollen. Als Speicher-Backend verwendet Docker das Overlay-Dateisystem Aufs, das allerdings nicht im Standard-Linux-Kernel enhalten ist und deshalb speziellen Support durch die Distribution erfordert. Stattdessen kann Docker auch mit Btrfs zusammenarbeiten, wobei das Dateisystem keine SELinux-Labels unterstützt und somit auf dieses Schutzschild verzichtet werden muss, wovon der Autor ausdrücklich abrät. Wegen all dieser Probleme setzt Red Hat auf ein eigenes Docker Storage-Backend auf Basis des bekannten Device-Mappers. Hier kommt dann ein sogenanntes Thin Provisioning Modul (dm-thinp) zum Einsatz, um aus den einzelnen Layern eines Docker-Containers ein neues Image zu erzeugen.

Installation von Docker

Die folgenden Beispiele zeigen nun die Installation und den Betrieb einer Docker-Umgebung auf Fedora 20. Zum Einsatz kommt die Docker-Version 1.2.0. Alle Beispiele funktionieren allerdings ohne Änderung auch auf anderen Red Hat-basierten Distributionen. Für andere Linux-Versionen finden Sie auf der Docker-Webseite [1] weitere Hinweise.

Installieren Sie zunächst das Paket "docker-io" aus dem Standard Software-Repository der Distribution und aktivieren Sie anschließend den Docker-Service:

# yum -y install docker-io
# systemctl start docker
# systemctl enable docker

Achten Sie an dieser Stelle darauf, dass sich das System im SELinux-Enforcing Mode befindet:

# getenforce
Enforcing

Für einen ersten Test starten Sie Ihren ersten Container mit dem Kommando

# docker run -i -t fedora /bin/bash

Hiermit aktivieren Sie einen Container auf Basis des Images "fedora" und starten die Bash-Shell im Container. Die beiden Optionen bewirken, dass der Container ein Pseudo-Terminal zugewiesen bekommt und Sie eine interaktive Verbindung zu dem Container erhalten. Da das Image "fedora" zu diesem Zeitpunkt noch nicht auf dem System vorhanden ist, baut das Docker-Kommandozeilen-Tool eine Verbindung zum Docker-Hub auf, um es von dort herunterzuladen.

Beim Docker Hub handelt es sich um ein zentrales Repository für Docker-Images, auf dem eine Vielzahl unterschiedlicher Images zur Verfügung stehen. Mittels "docker search" können Sie nach bestimmten Images suchen. Sollten Sie einen Proxy für die Verbindung zum Internet verwenden, tragen Sie ihn zuerst in die Systemd Unit-Datei für den Docker-Service ein (Listing 1) und lesen im Anschluss die geänderte Konfiguration ein:

# systemctl daemon-reload

Listing 1: Docker-Systemd



### In der Datei /usr/lib/systemd/system/ docker.service können Sie einen HTTP-Proxy für den Docker-Service definieren.
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS
LimitNOFILE=1048576
LimitNPROC=1048576
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.0/8"
[Install]
Also=docker.socket

Nach dem Download des Images startet die Bash-Shell innerhalb des Containers und wartet auf Ihre Eingabe. Rufen Sie innerhalb des Containers das Kommando "ps" auf, so sehen Sie lediglich zwei Prozesse: den Bash-Prozess mit der PID 1 und den ps-Prozess. Alle weiteren Prozesse des Host-Systems sind innerhalb des Containers nicht sichtbar, da dieser einen eigenen PID-Namespace verwendet. Gleiches gilt auch für das Dateisystem. Rufen Sie das Tool "ls" auf, sehen Sie das Dateisystem des Container-Images. Auf dem Host-System zeigt das Kommando "docker ps" alle aktiven Container an (Listing 2).

Listing 2: Docker-Ausgabe



# docker ps
CONTAINER ID           IMAGE             COMMAND           CREATED           STATUS           PORTS           NAMES
314852f5a82e               fedora:latest     "/bin/bash              8 seconds ago      Up 6 seconds                          ecstatic_turing

Neben einer eindeutigen ID für den Container sehen Sie an dieser Stelle auch das verwendete Image, die im Container laufende Anwendung und den aktuellen Status des Containers. Er ist immer nur solange aktiv, wie die Applikation läuft. Melden Sie sich von der Shell innerhalb des Containers ab, wird er dadurch ebenfalls gestoppt. Der erneute Aufruf von "docker ps" bestätigt dies.

Das Kommando kennt einige nützliche Optionen. So zeigt »docker ps -a« beispielsweise alle bisher gestarteten Container an, unabhängig von deren Status. Die Option "-l" beschränkt die Ausgabe auf den zuletzt gestarteten Container. Einen gestoppten Container können Sie jederzeit mittels »docker start« wieder zum Leben erwecken. Mit der Option "-a" stellen Sie auch direkt wieder eine interaktive Verbindung her und sind, in diesem Beispiel, mit der Shell des Containers verbunden. Möchten Sie einen Container gleich löschen, sobald dieser gestoppt wurde, verwenden Sie beim Starten des Containers die Option "--rm" (»docker start --rm« ).

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