Container haben viele Vorteile gegenüber einer virtuellen Maschine. Sie sind leichtgewichtiger und müssen kein ganzes Betriebssystem emulieren.


„Build, Ship and Run Any App, Anywhere“ - Docker, Inc.

Viele namenhafte Unternehmen setzten bereits Container ein. Mit dem Tool Docker kann der Administrator einzelne Container voneinander isolieren. Container werden beispielsweise von Anwendungen verwendet bei den es nicht mehr genügt nur noch eine Anwendung laufen zu lassen. Damit die einzelne Prozesse isoliert werden können werden spezielle Kernelfunktionen verwendet. Die Container können einzeln gestartet werden. Als Basis für die Linux-Container werden Kernel-Namespaces, cgroups und Container-Templates verwendet.

Mit den Kernel-Namepsaces können eigene Namensräume für Prozesse erzeugt werden. Die sogenannten Mount-Namespaces wird nicht das gesamte Dateisystem des Hosts, sondern nur einen kleiner Teil davon angezeigt. In der Regel wird dafür ein eigenes Images speziell für diesen Container verwendet.

Die Control Groups (cgroups), die ursprünglich von Google entwickelt worden sind, können Ressourcenbeschränkungen auf Proze-Containers darstellt.

Die größten Vorteile liegen auf einer Hand. Es können somit die Container isoliert werden. Jeder Prozess läuft für sich in einen Container und kennt die anderen Prozesse nicht, die ebenso ausgeführt werden. Es ist vergleichbar mit einer Chroot-Umgebung. Zudem kann jeder Container eine eigene IP-Adresse, eigene Routing-Tabelle und einen eigenen Host- und Domänennamen haben. Es können beispielsweise auch mehrere Anwendungen den selben Port ansprechen. Diese werden dann einfach auf mehrere Hosts verteilt. Durch das Unernehmen Docker haben die Container in der Netzwerkadministration sowie auch inssebene wie Den Zugriff von Prozessen auf Speicher-, CPU- und I/O-Ressourcen festgelegt werden.Die Container-Templates quasi die Images für die Container bilden eine Verzeichnisstruktur ab, die das Root-Dateisystem des Linux der App-Entwickliung einen richtigen Boom erlebt.

Einfach: Die Applikation, die dem Container läuft, sieht nur noch einen kleinen Auschnitt von System, vom Dateisystem und den Prozessen. Die Anwendung denkt, dass es alleine läuft. Es ist quasi wie eine kleine virtuelle Maschine, ohne den ganzen Overhead, dass ein ganzes Betriebsystem gebootet werden muss. Bildhaft kann man es wie mit den Frachtcontainern von den Schiffen sehen. Unabhängig von der Größe werden unterschiedliche Frachten geladen. Egal ob Säcke, Kisten oder Bündel. Somit ist damals das Transportwesen der Schifftfahrt revolotioniert worden.

 


Container vs. virtuelle Maschinen

Quelle: Lukas Pustina Zeigt die grafische Gegenüberstellung von Containern und VMs

Container sind leichtgewichtiger als virtualisierte Maschinen. Im Gegensatz zu einer VM starten Container keine eigene Betriebssysteme sondern laufen auf dem Kernel vom Host-System. Jedoch muss der Administrator in der Flexibilität Kompromisse eingehen, da kein Windows-System auf einem Linux-System emuliert werden kann. Auf der anderen Seite spart er sich viele Ressourcen, da nur ein Betriebssystem verwendet wird statt n Betriebssysteme im Gegensatz zu VMs. So können beispielsweise hunderte Applikationen mit dem Container-Konzept gestartet werden bei dem hunderte virtuelle Maschinen den Server signifikant ausbremsen.

 


Vor- und Nachteile von Containern

Vorteil

  • Jeder Container hat ein eigenes Image
  • Die Images können versioniert werden mit einem ähnlichen vorgehen wie den Snapshots bei VMs
  • Images können einfach von transportiert werden
  • Das Docker Hub

Nachteile

  • Die Container sind voneinander isoliert. Es kann nicht einfach von einem zu dem anderen Container zugegrifen werden. D.h. Einschränkungen bei beispielsweise von Copy&Paste und der Zwischenablage.

 


Docker

Das Unternhmen Docker, Inc. ist im Jahr 2013 erschienen und stellt ihre Softwar-Lösung als Open-Source-Software zur Verfügung. Bei Docker gibt es einige Grundbegriffe die erstmals erklärt werden:

Begriff Erläuterung
Image Das Image ist schreibgeschützt. Diese können portabel auf andere Systeme mitgenommen werden oder auch durch die Repositories geteilt werden. Ein Image kann ähnlich wie ein Template betrachtet werden.
Container Der Container beinhaltet eine Instanz von einem Image.
Dockerfile Ist eine Textdatei mit der ein Image beschrieben wird. Die Textdatei enthält Befehle die während der Ausführung abgearbeitet wird. Für jeden Befehl wird ein einzelner Layer angelegt.
Repository Es gibt beispielsweise die Repositories Docker Hub oder Artifactory, in dem verschiedenste Container abgelegt worden sind und zur Verfügung stehen.
libcontainer Ist die Schnittstelle um auf die Grundfunktionen von Docker zugreifen zu können.
libswarm Mit der Library können die Container gesteuert werden.
libchan Damit kann eine einfache Kommunikation zwischen Prozessteilen und Prozessen ermöglicht werden.

Wenn der Admin von einem Docker spricht wird in der Regel ein Container gemeint.

 


Bestandteile von Docker

Docker besteht aus drei Bestandteilen: Docker Aemon, Docker Image und Docker Repository. Der Deamon verwaltet die Laufzeitumgebungen von den Docker-Containern. Ein Vorteil von den Images sind, dass sie stapelbar sind. Wegen dieser Eigenschaft können Images ähnlich wie bei bspw. bei Github oder Gitlab in Repositories versioniert werden. Das öffentliche Repostitory von Docker, Inc. nennt sich Docker Hub.

 


Docker-Konzept

Auf einem Host gibt es n Images, die für verschiedene Anwendungen verwendet werden. Die Docker-Images sind schreibgeschützt. Auf einem Host können mehrere Container gestartet werden, die ein Image verwenden. Jedoch wird das Image nicht verwendet sondern wie ein Template verwendet. Die Daten, die verändert worden sind, sind nicht im Image, sondern im Container verändert worden. Das Image, dass für eine Anwendung da ist, kann als Basis ein anderes System verwenden. In dem Dockerfile wird das mit dem Befehl FROM signalisiert. Im Folgenden Abbild werden die Bestandteile von Docker und deren Verbindungen gezeigt.

Quelle: Lukas Pustina Zeigt die Bestandteile von Docker

 


Installation

Gründsätzlich läuft Docker unter Linux. In der Dokumenation von Docker kann stets die aktuelle Anleitung für die Installation nachgelesen werden. Im folgenden wird dennoch gezeigt wie Docker unter Ubuntu 16.04 LTS installiert werden kann:

Zunächst muss das Repository zu der Distribution hinzugefügt werden. Als erstes wird der GPG-Schlüssel von Docker bezogen und hinzugefügt

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Danach muss das Repository hinzugefügt werden

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Nachdem das Repo hinzugefügt worden ist, muss das System aktuallisiert werden

sudo apt-get update

Jetzt wird Docker installiert

sudo apt-get install -y --allow-unauthenticated docker-ce

Docker sollte jetzt installiert sein, gestartet sein und beim Booten automatisch gestartet werden. Das kann mit folgendem Befehl überprüft werden:

sudo systemctl status docker

 


Arbeiten mit Docker-Images

Docker-Container werden von Docker-Images ausgeführt. Standardmäßig werden diese Images von Docker Hub abgerufen, einer Docker-Repository, die von Docker, dem Unternehmen hinter dem Docker-Projekt, verwaltet wird. Jeder kann seine Docker-Images auf Docker Hub erstellen und hosten, sodass die meisten Anwendungen und Linux-Distributionen, über Imges verfügen, die auf Docker Hub gehostet werden.

Zunächst muss erstmal geprüft werden, ob der Zugriff auf das Repository möglich ist

sudo docker run hello-world

Mit dem Parameter -d kann ein Container im Hintergrund gestartet werden. In der Ausgabe wir keine Ausgabe sondern die Container-ID angezeigt:

sudo docker run -d hello-world

Die Ausgabe, die Folgendes enthalten sollte, gibt an, dass Docker ordnungsgemäß funktioniert:

Output  Hello from Docker.  This message shows that your installation appears to be working correctly.  ...

Der Benutzer kann nach Images suchen, die im Docker Hub verfügbar sind, indem der Befehl docker mit dem Unterbefehl search verwendet wird. Um beispielsweise nach einem Wordpress-Image zu suchen, muss Folgendes eingegeben werden:

sudo docker search wordpress

Das Skript crawlt durch den Docker Hub und gibt eine Liste aller Images zurück, deren Name mit der Suchzeichenfolge übereinstimmt.

Die Spalte OFFICIAL zeigt OK an, wenn das Image von der Firma hinter dem Projekt erstellt und unterstützt wird. Sobald das Image identifiziert ist, kann es wie folgt mit dem Unterbefehl pull auf dem Host heruntergeladen werden:

sudo docker pull wordpress

Nachdem das Image heruntergeladen worden ist, kann der Container mit Unterbefehl run ausgeführt werden. Falls das Image noch nicht hertuntergeladen worden ist, wird zuerst das Image heruntergeladen und dann ausgeführt.

sudo docker run wordpress

Mit folgendem Befehl können alle heruntergealdenen Images angezeigt werden:

sudo docker images

 


Einen Docker-Container starten

Als Beispiel wird der Container mit Wordpress ausgeführt. Die Kombination dem Parameten -i und -t geben einen interaktiven Shell-Zugriff in den Container:

sudo docker run -it wordpress bash  

Die Eingabeaufforderung sollte geändert werden. Es wird der Benutzer mit der Container-ID angezeigt

root@a35fd1924f3a: /var/www/html# 

Hier können wir gewohnt normale Befehle ausgeführt werden wie beispielsweise im unteren Beispiel gezeigt wird.

apt-get update  apt-get install htop

Sobald ein Container mit sudo docker run gestartet worden ist wird er nach dem Ausschalten nicht gelöscht. Außer der Administrator löscht den Container explizit. Mit dem Befehl sudo docker ps -a können alle Container angezeigt werden. Auch die pausiert worden sind. Ein pausierter Docker kann mit folgendem Befehl gestartet werden

sudo docker start CONTAINERID

 

Ist der Container jedoch bereits gestartet worden muss man sich mit exec darauf verbinden. Der Nutzer kann sich mit der ID oder dem Namen vom Container in den Container verbinden:

sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID  #or  sudo docker exec -i -t loving_heisenberg /bin/bash #by Name

 


Änderungen von einem Container comitten

Wenn ein Docker-Image gestartet wird, können die Dateien wie bei einer VM, erstellt, geändert und gelöscht werden. Die Änderungen, die vorgenommen werden gelten nur für diesen Container. Der Container kann gestartet und gestoppt werden, aber sobald der Container gelöscht wird gehen die Daten verloren.

Unterscheiden sich Image und Container kann der Stand in das Image comittet werden. Zunächst muss jedoch der Container mit exit beendet werden.

Danach können die Änderungen in eine neue Docker-Instanz bzw. in ein neues Docker-Image comittet werden:

sudo docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name:version

Das -m enthält die Commit-Nachricht. Der Parameter a enthält die Person, die für den Commit verantwortentlich ist. Die Container-ID ist die ID, die man bei der interaktiven Session mit Docker erhalten hat. Sofern nicht mehrere Repositories mit einem Benutzer bei Docker Hub gespeichert worden sind, ist es üblicherweise der Benutzername. Beispielsweise:

sudo docker commit -m "First Backup" -a "BusKus" compassionate_wescoff bukus/keycloak:version1

Das Image ist aber jedoch nur lokal gespeichert worden. Es muss im Zweifel noch in Docker Hub hochgeladen werden. Nachdem der Vorgang abgeschlossen ist, sollten das neue Docker-Image auf dem host angezeigt werde und zwar sowohl das neue Image als auch das alte Image, von dem es abgeleitet worden ist. 

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE  buskus/ubuntu         latest              62359544c9ba        50 seconds ago      205MB  ubuntu                16.04               5e8b97a2a082        5 weeks ago         114MB  ubuntu                trusty              578c3e61a98c        5 weeks ago         223MB  

In dem oberen Beispiel ist das Image buskus/ubuntu von dem Image ubuntu abgeleitet worden. Das nächste mal kann ein Container mit dem Image buskus/ubntu gestartet werden.

Mit folgendem Shell-Skript kann ein commit für einen Container automatisiert erstellt werden:

sudo docker container stop <container-id>  echo "#################"  echo "## Der Container ist gestoppt worden."  echo "#################"  sudo docker commit -m "$2" -a "BusKus" <container-id> repository/name:version-$1 &  sleep 5s  sudo docker images  echo "#################"  echo "Ein Image mit den Namen 'repository/name:version-$1' ist erstellt worden. Als Kommentar ist '$2' hinterlegt worden."  echo "#################"  sudo docker container start -a <container-id> | tee -a Logdatei.log  echo "#################"  echo "Der Container ist gestartet worden"  echo "#################"  

Als erster Parameter wird die Version abgelegt, die später angezeigt werden soll und als zweiter Parameter wird eine Nachricht in Anführungsstrichen mitgegeben. Ein möglicher Aufruf kann wie folgt aussehen:

./BackupKeycloak.sh 7 "Das ist ein Beispiel-Commit"  

 


Docker-Container überwachen

Um aktive Docker-Container anzeigen zu lassen wird folgender Befehl verwendet:

sudo docker ps  

Damit alle Container angzeigt wird, wird der Parameter -a zusätzlich verwendet:

sudo docker ps -a

Um den zuletzt erstellten Container anzuzeigen wir der Parameter -l verwendet:

sudo docker ps -l

Der Container kann mit dem Befehl stop und der Container-ID beendet werden:

sudo docker stop container-id  

Die Container-ID kann mit dem Befehl docker ps herausgefunden werden.

Mit folgendem Befehl kann ein Container gelöscht werden:

sudo docker container rm containerName

Es hat sich herausgestellt, dass es ebenso nützlich ist die Log-Files von den Container auszulesen. Hier werden alle Befehle und Aktivitäten des Containers gespeichert.

sudo docker container logs containerName

 


Eigenes Docker-Image erstellen

Ein Docker kann mittels einem Dockerfile erstellt werden. Das Dockerfile enthält den Bauplan des Containers. Dazu wird auf dem Host-System in einem neuen beliebigen Ordner ein File erstellt:

touch Dockerfile  vim Dockerfile

In dieser Datei wird die Beschreibung des Containeres gespeichert. Hier ist ein Beispiel für ein Ubuntu 16.04 System:

FROM ubuntu:16.04  RUN apt-get update  RUN apt-get install locales    MAINTAINER Test-Container kuppelwieser.net version: 0.1    # Set the locale  RUN locale-gen de_DE.UTF-8  ENV LANG de_DE.UTF-8  ENV LANGUAGE de_DE.UTF-8  ENV LC_ALL de_DE.UTF-8    # Install dependencies  ENV DEBIAN_FRONTEND noninteractive  RUN apt-get update  RUN apt-get install -qq wget unzip build-essential cmake gcc libcunit1-dev libudev-dev    # Grab the checked out source  RUN mkdir -p /workdir  WORKDIR /workdir  COPY . /workdir

Mit dieser Beschreibung werden die aktuellen Updates gezogen, die Lokalen Einstellungen gesetzt, Abhängikeiten installiert und ein abgeleitetes Verzeichnis vom Host-System erstellt.

Das Image kann mit folgendem Befehl erzeugt werden:

sudo docker build ./

Möchte der Admin ein Image erstellen, so muss er den Befehl..

sudo docker commit

.. ausführen. Das Image befindet sich jedoch nur Lokal auf dem Host. Mit sudo docker images erhält man eine Liste der Images. Damit das Image global verfügbar ist muss mit mit einem Push-Befehl zum Repository hinzugefügt werden.

 


Aufräumen

Ein lokales Image kann mit dem Befehl sudo docker rmi <Image ID> gelöscht werden.

 


Hilfe

Um alle Befehle anzeigen zu lassen kann folgender Aufruf vewendet werden:

docker

Zu jedem Befehl gibt es außerdem eine Hilfe:

docker DOCKER-SUBCOMMAND --help

 


Quellen

[1] Logo von https://pixabay.com/de/container-fracht-transport-logistic-789488

[2] www.docker.com

[3] Docker Basics: Einführung in die System-Level-Virtualisierung,

[4] https://www.youtube.com/watch?v=ukYEk2S6akI

[5] Container: Apps für Server, Dr. Oliver Diedrich, Mai 2016, c't Magazin

[6] https://docs.docker.com/install/linux/docker-ce/ubuntu/#os-requirements

[7] https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04

[8] https://entwickler.de/online/development/docker-einsteiger-tutorial-210720.html

[9] https://github.com/OpenChannelSSD/liblightnvm/blob/master/ci/DockerFile.ubuntu-16.04

[10] https://jaxenter.de/10-wege-docker-images-zu-bauen-1-61421

[11] https://askubuntu.com/questions/505506/how-to-get-bash-or-ssh-into-a-running-container-in-background-mode

Suche

Kategorien