Website-Suche

Eine praktische Einführung in Docker-Container


Dieser Artikel zeigt, wie Sie mit Docker beginnen, und zeigt grundlegende Befehle, um Sie auf den Zug des Containers aufzuspringen.

In diesem Tutorial lernen Sie:

  • Was ist Docker und wie wird es verwendet?
  • So installieren Sie Docker unter Linux.
  • Ausführen von Docker-Containern.

Verwendete Softwareanforderungen und Konventionen

Grundlegende Docker-Konzepte

Herkömmliche Virtualisierungsplattformen wie Virtualbox und VMWare abstrahieren einen gesamten Computer, zielen darauf ab, das Host- und Gastbetriebssystem zu isolieren, und erfordern, dass ein vollständiges Betriebssystem auf der virtuellen Gastmaschine (VM) installiert ist. Die Virtualisierung von Docker verfolgt einen anderen Ansatz: Sie abstrahiert nur das Betriebssystem, was bedeutet, dass Host und Gäste denselben Kernel verwenden.

Die Vorteile sind, dass die Gäste (Container genannt) kein ganzes Betriebssystem einpacken müssen, was sie leicht macht – klein in der Größe und sehr schnell obendrein. Außerdem verursachen Docker-Container durch die direkte Schnittstelle mit dem Host-Betriebssystem keine Leistungseinbußen wie bei der herkömmlichen Virtualisierung, die die Übersetzung von Systemaufrufen zwischen Gast- und Host-Betriebssystemen durch Treiber erfordert, die eine virtuelle Hardware abstrahieren.

Die Nachteile bestehen darin, dass es beispielsweise nicht möglich ist, einen Windows-Gast auf einem Linux-Host zu hosten, und dass alle Gäste Ressourcen (CPU, RAM und Festplatte) auf dem Host gemeinsam nutzen, was bedeutet, dass ein fehlerhafter Container den gesamten Server zum Absturz bringen kann. Es ist sicher, dass Docker nicht die Absicht hat, die traditionelle Virtualisierung zu ersetzen, die immer noch viele gültige Szenarien hat. Es bietet nur eine weitere Möglichkeit, Anwendungsisolation zu erreichen und gleichzeitig die Abhängigkeiten von Bibliotheken zu reduzieren, ohne die Leistung zu beeinträchtigen.

Mit Docker können Sie Container starten, in denen Instanzen von Images ausgeführt werden. Ein Image enthält den Datenträger mit allen Bibliotheksabhängigkeiten, die zum Ausführen einer Anwendung erforderlich sind, während ein Container den Ausführungskontext enthält. Es können mehrere Container desselben Bildes gleichzeitig ausgeführt werden, die jeweils von den anderen getrennt sind.

Es gibt eine Empfehlung, dass ein Docker-Container nur eine Anwendung ausführt, was häufig als "nur einen Prozess ausführend" fehlinterpretiert wird. Es ist kein Problem, mehr als einen Prozess in einem Container auszuführen, solange sie zur selben Anwendung gehören. Eine komplexe Anwendung kann jedoch die Ausführung mehrerer Container erfordern, wie z.B. einen für den Webserver (Apache, Nginx), einen für die Anwendung (php-fpm) und einen für die Datenbank (MySQL, PostgreSQL, MongoDB). Diese Container können auf demselben oder auf verschiedenen Hosts ausgeführt werden. Container auf demselben Host kommunizieren über ein virtuelles Netzwerk, das von Docker verwaltet wird.

Docker-Images werden aus einem Repository mit dem Namen registry abgerufen und lokal zwischengespeichert. Wenn keine Registrierung angegeben ist, versucht Docker, das Image im Standardrepository zu finden, das als Docker Hub bezeichnet wird. Der Docker Hub enthält eine enorme Menge an Images, die von Unternehmen und Privatpersonen zur Verfügung gestellt werden können – und Sie können Ihre Images auch veröffentlichen. Daneben gibt es auch den Docker Store, in dem Unternehmen professionell kuratierte Images ihrer Software anbieten können. Es wird empfohlen, dass Sie einige Zeit damit verbringen, diese Repositorys zu durchsuchen und zu lernen, wie sie funktionieren.

Genug gesagt, lassen Sie uns Docker installieren und einige grundlegende Befehle lernen.

Installieren von Docker unter Linux

Ubuntu

In Ubuntu Bionic Beaver 18.04 ist die Installation von Docker einfach.

apt install docker.io

Debian

Wenn Sie Debian testing oder unstable ausführen, funktioniert der obige Befehl ebenfalls. Für Debian Stable (Stretch) besuchen Sie unsere Docker-Engine auf Debian 9 Stretch Linux Installationsanleitung.

Centos

In CentOS 1804 ist es ein yum-Befehl.

yum install docker

Fedoras

In Fedora 28 kann es auch mit einem dnf-Befehl installiert werden.

dnf install docker

Nach der Docker-Installation

Nach der Installation können Sie überprüfen, ob der Docker-Dienst ausgeführt wird.

service docker status

Wenn nicht, dann starten Sie es.

service docker start

Sobald der Dienst ausgeführt wird, können Sie überprüfen, ob Container ausgeführt werden.

docker ps

Wenn Sie sudo nicht eingeben möchten, um mit dem Docker-Dienst zu interagieren, fügen Sie einfach Ihren Benutzer zur Docker-Gruppe hinzu. Sie müssen sich erneut anmelden, damit die Änderung wirksam wird.

usermod -a -G docker username

Überprüfen Sie nach der Anmeldung, ob Sie sich in der Docker-Gruppe befinden

groups
roger adm cdrom sudo dip plugdev lpadmin sambashare docker

Jetzt benötigen Sie sudo nicht mehr, um mit der Docker-Engine zu interagieren.

Ausführen eines Docker-Containers

Lassen Sie uns einen hello-world-Container ausführen.

docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Der Befehl ist wirklich einfach, aber es sind viele Dinge passiert. Zuerst stellte die Docker-Engine fest, dass sich das angeforderte Image nicht im lokalen Cache befand ( Zeile 2 ). Dann wird das Image aus der Docker-Registry gezogen und lokal gespeichert ( Zeile 3 ). Abschließend wird ein Container erstellt, ausgeführt ( Zeile 8 ) und beendet. Wenn Sie es erneut versuchen, werden Sie feststellen, dass die Ausführung viel schneller ist, da sowohl Image als auch Container zwischengespeichert werden. Überprüfen Sie nun die lokal gespeicherten Bilder.

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        2 weeks ago         1.84kB

Beachten Sie, dass das hello-world-Bild mit einer Größe von nur 1,84 KB minimal ist. Dies zeigt, dass ein Großteil des Hostbetriebssystems verwendet wird und dass das Image nur die Anwendungsabhängigkeiten enthält.

Sie können dieses Bild entfernen.

docker images rm hello-world
docker images

Lassen Sie uns nun etwas Ehrgeizigeres tun: Ziehen Sie ein Apache-Webserver-Image und führen Sie einen Container aus.

docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
f189db1b88b3: Pull complete
ba2d31d4e2e7: Pull complete
23a65f5e3746: Pull complete
5e8eccbd4bc6: Pull complete
4c145eec18d8: Pull complete
v1'1c74ffd6a8a2: Pull complete
1421f0320e1b: Pull complete
Digest: sha256:8631904c6e92918b6c7dd82b72512714e7fbc3f1a1ace2de17cb2746c401b8fb
Status: Downloaded newer image for httpd:latest


docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        2 weeks ago         1.84kB
httpd               latest              d595a4011ae3        6 weeks ago         178MB

Anschließend führen Sie einen Container aus diesem Image aus.

docker run -d -p 8000:80 httpd
dd703b1590a91bdc10488b48798e42ddecd1c6519324a613f4b5563c21874a98
roger@slash:~$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
dd703b1590a9        httpd               "httpd-foreground"   10 seconds ago      Up 3 seconds        0.0.0.0:8000->80/tcp   cranky_torvalds

In seiner einfachsten Form wäre der Befehl docker run httpd, aber der Container würde direkt nach dem Ausführen von Apache gestoppt und kein Port würde verfügbar gemacht. Die Option -d (detach) wird benötigt, damit der Container im Hintergrund ausgeführt wird.

Die Option -p 8000:80 bildet den Port 80 des Containers auf den Port 8000 im Host zu, wodurch der Webserver im Netzwerk verfügbar wird. Standardmäßig werden Containerports nicht für den Host verfügbar gemacht. Jetzt können Sie mit einem Webbrowser auf http://localhost:8000 verweisen und die Apache-Testseite anzeigen.

Apache-Standardseite, die anzeigt, dass es funktioniert

Ok, aber wie ändere ich die Webseite? Wir müssen einen Ordner vom Host in das Container-Verzeichnis /usr/local/apache2/htdocs/ verlinken (wir werden später sehen, dass das Apache-Image von einem Debian-Jessy erstellt wurde, unabhängig von der Linux-Variante Ihres Hosts). Stoppen Sie den Container, und führen Sie ihn erneut aus.

docker ps
docker stop cranky_torvalds
echo "<html><body>My Webpage</body></html>">index.html
docker run -d -p 8000:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd

Wir haben eine index.html Datei im aktuellen Verzeichnis auf dem Host erstellt und dieses Verzeichnis innerhalb des htdocs-Verzeichnisses des Containers mit dem Schalter -v zugeordnet. Aktualisieren Sie nun den Webbrowser.

Index.html

Nun die Spitze: Experimentieren Sie mit dem Bearbeiten der index.html Datei im Host und aktualisieren Sie den Webbrowser, ohne den Zustand des Containers zu ändern. Ja, jedes Mal, wenn eine Datei bearbeitet oder eine neue Datei zum aktuellen Verzeichnis hinzugefügt wird, wird sie aufgrund der -v-Zuordnung im Container verfügbar gemacht.

Erstellen Sie eine weitere Datei und greifen Sie im Browser darauf zu.

echo "Second page" >index2.html

Index2.html

Wenn Sie fertig sind, stoppen Sie die Ausführung des Containers.

docker stop angry_poincare

Beachten Sie, dass Sie jetzt über einen Webserver verfügen, der jederzeit ausgeführt werden kann, und dass Sie keine Konfigurationsdatei in Ihrem Betriebssystem angerührt haben. Es ist alles im Apache-Image gekapselt, das von docker zwischengespeichert wird. Darüber hinaus können Sie das Image herunterladen und einen Container auf jedem anderen Computer starten.

Schlussfolgerung

In diesem Artikel wurden die wichtigsten Docker-Konzepte und einige grundlegende Befehle vorgestellt. Ich hoffe, Sie verstehen die Vorteile und sehen, dass es nicht kompliziert ist, Docker zu verwenden, sobald Sie die Konzepte verstanden haben. In zukünftigen Artikeln werden weitere Funktionen und Anwendungsfälle vorgestellt.

Mehr in dieser Docker-Artikelreihe

  • So interagieren Sie mit Docker-Containern
  • So passen Sie Docker-Images mit Dockerfiles an

Verwandte Artikel: