Webinar-Reihe: Loslegen mit Containern

Dieser Artikel ist ein Ergänzungstext zu einer Webinar-Serie über die Deployment und Management von containerisierten Workloads im Cloud. Die Serie umfasst die Grundlagen von Containern, wie beispielsweise das Lebenszyklusmanagement, das Deployieren von Multi-Container-Anwendungen, das Skalieren von Workloads sowie das Verstehen von Kubernetes, zudem werden auch die Best Practices für die Bereitstellung statischer Anwendungen hervorgehoben.

Dieser Tutorial enthält die Konzepte und Befehle, die im ersten Session der Reihe, Getting Started with Containers, behandelt wurden.

Einführung

Docker ist eine Plattform zur Bereitstellung und Verwaltung von containerisierten Anwendungen. Container sind bei Entwicklern, Administratoren und DevOps-Ingenieuren beliebt wegen der Flexibilität, die sie bieten.

Docker hat drei wichtige Komponenten:

  • Docker Engine
  • Docker Tools
  • Docker Registry

Der Docker Engine stellt die grundlegenden Funktionen bereit, mit denen Sie Container managen können. Er interagiert mit dem unterliegenden Linux-Betriebssystem, um einfache APIs zu verfügbar zu machen, die mit dem Lebenszyklus von Containern interaktionieren.

Die Docker Tools sind eine Set von Befehlzeilentools, die mit dem vom Docker Engine ausgelieferten API interagieren. Sie werden zum Starten der Container, zum Erstellen neuer Images, zur Konfiguration von Storage und Netzwerken usw. verwendet, die auf die Lebenszyklusoperationen eines Containers Einfluss haben.

Das Docker-Repository ist die Stelle, wo Containerimages gespeichert werden. Jeder Image kann mehrere Versionen durch einzigartige Tags identifiziert haben. Benutzer holen existierende Images aus dem Repository herunter und stellen neue Images hoch. Docker Hub ist eine von Docker, Inc. gehostete Registrierung. Es ist auch möglich, einen Registrierungsserver in Ihrem eigenen Umfeld zu installieren, um die Images näher an den Motor zu bringen.

Am Ende dieser Tutorials hast du Docker auf einem DigitalOcean Droplett installiert,Container verwaltet, Bilder mit Images gearbeitet, Hinzufügungen zur persistenz getestet und einen privaten Registrierungsdienst eingerichtet.

Voraussetzungen

Um dieses Tutorial zu folgen, benötigen Sie:

Standardmäßig benötigt das docker-Kommando root-Rechte. Allerdings können Sie das Kommando ohne das sudo-Präfix ausführen, indem Sie docker als Benutzer in der docker-Gruppe ausführen.

Um Ihren Droplet auf diese Weise zu konfigurieren, führen Sie das Kommando sudo usermod -aG docker ${USER} aus. Dies fügt dem aktuellen Benutzer der docker-Gruppe hinzu. Dann führen Sie das Kommando su - ${USER} aus, um die neue Gruppenzugehörigkeit anzuwenden.

Dieser Leitfaden geht davon aus, dass Ihr Server so konfiguriert ist, dass das docker-Kommando ohne das sudo-Präfix ausgeführt werden kann.

Schritt 1 — Docker installieren

Nachdem Sie sich über SSH auf dem Droplet angemeldet haben, führen Sie die folgenden Befehle aus, um alle bereits installierten docker-bezogenen Pakete zu entfernen und dann Docker aus dem offiziellen Repository zu installieren:

  1. sudo apt-get remove docker docker-engine docker.io
  2. sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. sudo apt-key fingerprint 0EBFCD88
  5. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  6. sudo apt-get update
  7. sudo apt-get install -y docker-ce

Nach der Installation von Docker bestätigen Sie die Installation mit den folgenden Befehlen:

  1. docker info

Der obige Befehl zeigt Details des in der Umgebung deployierten Docker-Engines auf. Der nächste Befehl überprüft, ob die Docker-Tools richtig installiert und konfiguriert sind. Es sollte die Version sowohl des Docker-Engines als auch der Tools ausgeben.

  1. docker version

##Schritt 2 — Starten von Containern

Docker-Container werden von vorhandenen Images gestartet, die im Register gespeichert sind. Images in Docker können in privaten oder öffentlichen Repositories gespeichert werden. Private Repositories erfordern von Benutzern eine Authentifizierung, bevor Images gezogen werden können. Öffentliche Images können von jedem zugegriffen werden.

Um nach einem Image namens hello-world zu suchen, führen Sie den Befehl aus:

  1. docker search hello-world

Es könnten mehrere Images dem Namen hello-world entsprechen. Wählen Sie das mit den meisten Sternen versehene Image, das die Beliebtheit des Images anzeigt.

Überprüfen Sie die verfügbaren Images in Ihrer lokalen Umgebung mit dem folgenden Befehl:

  1. docker images

Da wir bisher keine Container gestartet haben, werden keine Images angezeigt. Wir können nun das Image herunterladen und lokal ausführen:

  1. docker pull hello-world
  2. docker run hello-world

Wenn wir den Befehl docker run ohne das Herunterziehen des Images ausführen, wird das Docker-Engine zuerst das Image herunterziehen und dann ausführen. Bei erneutem Ausführen des Befehls docker images wird angezeigt, dass wir das Image hello-world lokal verfügen.

Lassen Sie uns ein bedeutendesreiches Container starten: einen Apache-Web-Server.

  1. docker run -p 80:80 --name web -d httpd

Sie könnten zusätzliche Optionen für den Befehl docker run erkennen. Hier ist eine Erklärung dieser Schalter:

  • -p — Dieser Befehlt informiert das Docker-Engine, dass der Container seine Portnummer 80 auf die des Hosts 80 exponieren soll. Da Apache auf Port 80 läuft, müssen wir sie auf dem Host exponieren.
  • --name — Diese Option setzt einen Namen für den laufenden Container fest. Wenn dieser Befehl ausgelassen wird, wird Docker Engine dem Container eine zufällige Nummer zuweisen.
  • -d — Diese Option befeuert das Docker-Engine, den Container im Detached-Modus zu starten. Ohne diese Option blockiert der Container den Shell-Zugriff, daher ist es notig, den Container in den Hintergrund zu schicken, damit wir die Shell weiterhin nutzen können. Um zu prüfen ob unser Container tatsächlich im Hintergrund läuft, versuchen Sie folgendes Kommando:

Die Ausgabe zeigt uns, dass der Container namens web mit Port 80 auf die des Hosts 80 mapst ist.

  1. docker ps

Nun erstellen Sie einen Web-Server-Zugriff:

Um den Web-Server zu testen:

  1. curl localhost

Schließen und entfernen Sie den laufenden Container mit den folgenden Befehlen:

  1. docker stop web
  2. docker rm web

Eine erneute Ausgabe von docker ps bestätigt, dass der Container beendet ist.

Schritt 3 — Speicherzugriffe hinzufügen

Container sind flüchtig, was bedeutet, dass alles, was in einem Container gespeichert ist, verloren geht, wenn der Container beendet wird. Um Daten über die Lebensdauer eines Containers hinaus zu erhalten, müssen wir einen Volume an den Container anhängen. Volumes sind Verzeichnisse aus dem Host-Dateisystem.

Fangen wir damit an, ein neues Verzeichnis auf dem Host zu erstellen:

  1. mkdir htdocs

Nun starten wir den Container mit einem neuen Schalter, um das Verzeichnis htdocs zu mounten und auf das Dokumentenroot des Apache-Webservers zu zeigen:

  1. docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

Der Schalter -v verweist das Verzeichnis htdocs innerhalb des Containers auf das Dateisystem des Hosts. Jegliche Änderungen an diesem Verzeichnis werden an beiden Standorten sichtbar sein.

Zugreifen Sie auf das Verzeichnis aus dem Container, indem Sie den Befehl ausführen:

  1. docker exec -it web /bin/bash

Dieser Befehl hängt unseren Terminal an die Shell der Container in einem interaktiven Modus an. Sie sollten sehen können, dass Sie jetzt innerhalb des Containers sind.

Navigieren Sie zum Verzeichnis htdocs und erstellen Sie eine einfache HTML-Datei. Schließlich verlassen Sie die Shell, um zum Host zurückzukehren:

  1. cd /usr/local/apache2/htdocs
  2. echo '<h1>Hello World from Container</h1>' > index.html
  3. exit

Wenn Sie den Befehl curl localhost erneut ausführen, zeigt der Webserver, dass er die Seite, die wir erstellt haben, zurückgibt.

Wir können nicht nur auf diese Datei vom Host zugreifen, sondern sie auch ändern:

  1. cd htdocs
  2. cat index.html
  3. echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null

Wenn Sie curl localhost erneut ausführen, bestätigt dies, dass der Webserver die neueste von dem Host erstellte Seite bereitstellt.

Beenden Sie den Container mit dem folgenden Befehl. (Der -f zwingt Docker, den Container ohne vorherige Stoppen zu beenden.)

  1. docker rm -f web

Schritt 4 — Erstellen von Images

Neben dem Ausführen von vorhandenen Images aus dem Register können wir auch eigene Images erstellen und sie im Register speichern.

Sie können neue Images aus existierenden Containern erstellen. Die Änderungen, die am Container vorgenommen werden, werden zuerst commitiert, und dann werden die Images markiert und ins Register gepusht.

Lassen Sie uns den httpd-Container noch einmal starten und die Standarddatei bearbeiten:

  1. docker run -p 80:80 --name web -d httpd
  2. docker exec -it web /bin/bash
  3. cd htdocs
  4. echo '<h1>Welcome to my Web Application</h1>' > index.html
  5. exit

Der Container läuft nun mit einer angepassten index.html. Sie können dies mit curl localhost verifizieren.

Vor dem Committen des geänderten Containers ist es eine gute Idee, ihn anzustellen. Nach dem Stopp werden wir den Commit-Befehl ausführen:

  1. docker stop web
  2. docker commit web doweb

Bestätigen Sie die Erstellung des Images mit dem docker images-Befehl. Es zeigt das gerade von Ihnen erstellte doweb-Image an.

Um dieses Image zu taggen und im Docker Hub zu speichern, führen Sie die folgenden Befehle aus, um Ihr Image in den öffentlichen Register zu pushen:

  1. docker login
  2. docker tag your_docker_hub_username/doweb
  3. docker push your_docker_hub_username/doweb

Sie können das neue Image durchsuchten, indem Sie im Browser oder über die Befehlszeile im Docker Hub suchen.

Schritt 5 — Starten eines privaten Registers

Es ist möglich, den Registrierungsdienst in privaten Umgebungen zu betreiben, um die Bilder sicherer zu halten und zwischen dem Docker-Engine und der Image-Repository Latenzzeiten zu reduzieren.

Der Docker-Registrierung ist als ein Container verfügbar, der wie jeder andere Container gestartet werden kann. Da der Registrierungsdienst mehrere Images enthält, ist es eine gute Idee, ihn mit einem Speichervolumen anzuhängen.

  1. docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

Beachten Sie, dass der Container mit dem Port 5000 exponiert wird und das registry-Verzeichnis auf das Host-Dateisystem mapiert ist. Sie können über die Befehle docker ps feststellen, ob der Container aktuell laufend ist.

Sie können nun einen lokalen Image taggen und es zum privaten Registry hochladen. Lassen Sie uns zunächst das busybox-Container von Docker Hub herunterladen und taggen.

  1. docker pull busybox
  2. docker tag busybox localhost:5000/busybox
  3. docker images

Die vorherige Befehlsausführung bestätigt, dass das busybox-Container jetzt mit localhost:5000 taggt ist, so können Sie das Image nach dem privaten Registrierungsdienst hochladen.

  1. docker push localhost:5000/busybox

Nachdem das Image ins lokale Register gehörig gemacht wurde, versuchen wir es aus dem Environment zu entfernen und es wieder vom Registrierungsdienst herunterzuladen.

  1. docker rmi -f localhost:5000/busybox
  2. docker images
  3. docker pull localhost:5000/busybox
  4. docker images

Wir haben durch den vollen Kreislauf gehen, das Image herunterzuladen, es taggen, es ins lokale Register hochzuladen und schließlich wieder herunterzuladen.

Es könnte sein, dass Sie in einem dedizierten Host den privaten Registrierungsdienst betreiben möchten. Der Docker-Engine, der auf unterschiedlichen Maschinen läuft, wird sich mit dem Remote-Registery verbinden, um Bilder herunterzuladen und hochzuladen.

Da das Register nicht gesichert ist, müssen wir die Konfiguration des Docker-Engines anpassen, um den Zugriff auf ein unsicheres Register zu ermöglichen. Dazu editieren Sie die Datei daemon.json, die sich unter /etc/docker/daemon.json befindet. Erstellen Sie die Datei, falls sie nicht existiert.

Fügen Sie den folgenden Eintrag hinzu:

Editing /etc/docker/daemon.json
{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

Ersetzen Sie REMOTE_REGISTRY_HOST durch den Hostnamen oder die IP-Adresse des entfernten Registers. Starten Sie den Docker-Engine neu, um sicherzustellen, dass die Konfigurationsänderungen angewendet werden.

##Fazit
Dieses Tutorial hat Ihnen den Einstieg in Docker erleichtert. Es deckte die wesentlichen Konzepte ab, einschließlich der Installation, der Verwaltung von Containern, der Verwaltung von Images, des Speichers und des privaten Registers. Die kommenden Sitzungen und Artikel in dieser Serie werden Ihnen helfen, über die Grundlagen von Docker hinauszukommen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-docker