Beherrschen Sie Docker unter Ubuntu: Praxisleitfaden für Bereitstellungen

Wenn Sie Informationen zur Installation von Docker auf Ubuntu suchen, sind Sie hier genau richtig. Und als Bonus wird Ihnen dieses Tutorial auch zeigen, wie Sie die grundlegenden Docker-Befehle zum Ausführen und Verwalten von Containern verwenden können.

Mit den praktischen Funktionen von Visual Studio (VS) Code lernen Sie außerdem, Ihre SSH-Fähigkeiten zu verbessern. Fangen wir an!

Verwandt: Ein Windows-Guy in einer Linux-Welt: VS Code und Remote SSH

Voraussetzungen

Wenn Sie Schritt für Schritt vorgehen möchten, stellen Sie sicher, dass Sie Folgendes haben:

Installation von Docker auf Ubuntu

Fangen wir damit an, Docker auf Ubuntu zu installieren. An diesem Punkt geht das Tutorial davon aus, dass Sie sich auf Ihrem lokalen Windows-Computer befinden, VS Code geöffnet haben und über SSH mit Ihrem Ubuntu Server verbunden sind. Erfahren Sie, wie Sie diese praktische Umgebung in dem neuesten Artikel zur Verwendung von VS Code und SSH einrichten können.

Im folgenden Beispiel ist VSCode remote mit Ubuntu verbunden und der home-Ordner (in diesem Fall /home/homelab) ist als Arbeitsbereich geöffnet:

VSCode when SSHed into a Ubuntu Machine

Der eigentliche Prozess zur Installation von Docker in Ubuntu Server ist nur zwei Befehle entfernt. Ubuntu stellt Docker als Installationsoption im standardmäßigen Paketmanager zur Verfügung, der mit Ubuntu ausgeliefert wird und bekannt ist als apt.

Führen Sie in einem SSH-Terminalfenster von VS Code die folgenden zwei Befehle aus, um Docker zu installieren:

sudo apt update -y
sudo apt install docker.io -y

Während der Installation von Ubuntu Server wurde Ihnen möglicherweise die Option angeboten, Docker als snap zu installieren. Wenn Sie dies getan haben, entfernen Sie zuerst das Snap-Paket, indem Sie den Befehl sudo snap remove docker ausführen.

Sie können die Installation von Docker in der folgenden Animation verfolgen:

The Installation Process for Docker on Ubuntu

Ubuntu ist so nett, den Dienst automatisch zu aktivieren und ihn so einzurichten, dass er beim Booten startet. Sie sind also bereit, Docker zu verwenden!

Erstellen und Ausführen eines Docker-Containers auf Ubuntu

Jetzt, da Sie Docker installiert haben, was können Sie damit tun? Beginnen wir mit dem Erstellen eines Docker-Containers. Dieses Tutorial wird einen statischen Webserver als gutes Beispiel für einen Docker-Container einrichten. In diesem Abschnitt werden Sie:

  • Einen neuen Container aus dem Docker Hub-Image-Repository einrichten, um einen HTTP-Dienst auszuführen
  • Port-Mapping verwenden, um den HTTP-Port innerhalb des Containers auf Ihren Ubuntu-Host abzubilden
  • Bind-Mounts einrichten, um wichtige Daten aus dem Container auf Ihren Ubuntu-Host abzubilden
  • Richten Sie die Persistenz über Neustarts für Ihren Container ein.

Wenn einer der oben genannten Schritte verwirrend klingt, keine Sorge, wir werden jeden Schritt einzeln behandeln, um Ihnen den Prozess zu erklären.

Herunterladen des Docker-Images

Die erste Frage, die Sie stellen müssen, ist: Woher soll dieser Container stammen? Schauen wir uns den Docker Hub an.

A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.

A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.

Diese Dateisystemerfassung macht Docker so beliebt: Die Software wird zusammen mit der gesamten Betriebsumgebung erfasst. Dadurch werden Probleme eliminiert, die durch Unterschiede zwischen Serverumgebungen entstehen.

Eines der beliebtesten Repositories (und das Standardrepository) für Images ist der Docker Hub, auch bekannt als offizielles Docker-Repository. Das Image-Repository ist der Ort, an dem Sie Tausende vorerstellter Docker-Images herunterladen können, um sie als Container auszuführen.

Da in diesem Tutorial ein statischer Webserver eingerichtet wird, müssen Sie ein Webserver-Image herunterladen. Die beiden beliebtesten Webserver sind Apache httpd und Nginx. Um jedoch etwas Neues auszuprobieren und Sie möglicherweise mit einem neuen Webserver vertraut zu machen, verwenden wir einen namens Caddy.

Caddy ist ein Webserver, der für seine Einfachheit bekannt ist. Viele gültige Serverkonfigurationen können mit einer einzigen Zeile in einer Datei bereitgestellt werden. Einfach ist gut und dient auch als gutes Basiselement.

  1. Zunächst müssen Sie das Docker-Image finden. Auf Ihrem Windows-Rechner navigieren Sie zu https://hub.docker.com.
  2. Führen Sie eine Suche nach caddy in der oberen linken Ecke der Seite durch. Sie sollten eine Seite ähnlich der folgenden sehen:
Searching for caddy on the Docker Hub

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.

Sie müssen vorsichtig sein und sicherstellen, dass das von Ihnen gewählte Image von einer vertrauenswürdigen Quelle stammt. Jeder kann Malware in ein Image einfügen, wenn er dies wünscht, und seine Version auf Docker Hub hochladen.

3. Notieren Sie sich den Namen des Images. In dem obigen Screenshot ist der Name genau caddy. Sie benötigen diesen Namen, um den Image-Namen in den nächsten Schritten anzugeben.

Ausführen eines Containers mit Docker unter Ubuntu

Wenn Sie den Namen des Images, das Sie herunterladen möchten, kennen, ist es an der Zeit, es herunterzuladen und daraus einen Container zu erstellen.

Das Starten eines Containers aus einem Image erfordert einen einzigen Befehl. Führen Sie in Ihrem über SSH mit Ihrem Ubuntu-Server verbundenen Terminal den folgenden Befehl docker run aus.

Der untenstehende Befehl überprüft das caddy-Image auf dem lokalen Rechner. Wenn es nicht vorhanden ist, lädt es das Image von Docker Hub herunter, erstellt einen Container und startet ihn. Der untenstehende Befehl verwendet den Schalter -p, um den Hörport 80 des Ubuntu-Servers auf den Port 80 des Containers abzubilden. Diese Funktion wird Port-Mapping genannt.

sudo docker run -p 80:80 caddy

Die meisten Docker Hub-Images folgen einer Namenskonvention von <Benutzer>/<Image-Name>. Offizielle Docker-Images haben jedoch keinen <Benutzer> vor ihnen (wie oben caddy).

Die Ausführung des obigen Befehls gibt Folgendes aus, wobei die Protokollinformationen von Caddy direkt im Terminal angezeigt werden:

Running the Caddy Docker container

Sie werden möglicherweise feststellen, dass fast alle Docker-Befehle mit sudo versehen sind, um die Befehle als Administrator auszuführen. Standardmäßig läuft der Docker-Dienst als root und alle Änderungen, die Sie an Containern oder Images vornehmen, müssen als Administrator durchgeführt werden.

Und… Sie sind bereit loszulegen! Das ist alles, was dazu gehört. Sind Sie froh, dass Sie Docker auf Ubuntu installiert haben?

Navigieren Sie nun auf Ihrem Windows-Computer zu http://<Ihre-IP> und Sie sollten eine Startseite für Caddy sehen. Sie können sie unten sehen (die IP in dieser Anleitung wurde durch http://homelab-docker ersetzt):

The default landing page for Caddy

Der caddy-Container läuft jetzt, aber Sie haben möglicherweise ein Problem bemerkt. Das Ausführen dieses docker-Befehls übernimmt Ihre Befehlszeile. Sie können keine weiteren Befehle ausführen, und wenn die Sitzung endet, wird der laufende Container gestoppt. Lassen Sie uns dieses Problem lösen, indem wir den Container im Hintergrund (auch bekannt als Abtrennen des Containers) ausführen.

Ausführen von Docker-Containern im Hintergrund

Sie haben jetzt einen laufenden Container, aber Ihre Befehlszeile ist blockiert. Sie können nichts anderes tun. Sie benötigen eine bessere Methode, um einen Container im Hintergrund wie einen Dienst zu starten. Um das zu tun:

  1. Stoppen Sie den aktuellen Container, indem Sie in der Befehlszeile Strg+C drücken. Dadurch erhalten Sie Ihre Befehlszeile zurück.
  2. Führen Sie nun denselben Befehl wie zuvor, diesmal jedoch mit dem Parameter -d aus, wie unten gezeigt. Sie werden sehen, dass Docker eine Container-ID zurückgibt und die Befehlszeile an Sie zurückgibt.
sudo docker run -d -p 80:80 caddy
Running a detached container

Verwaltung von Hintergrundcontainern mit Docker-Befehlen

Wenn Sie einen oder mehrere Hintergrund-Docker ausführen, müssen Sie diese auf irgendeine Weise verwalten. Docker stellt Ihnen einige verschiedene Befehle zur Verfügung, um dies mit den docker container-Befehlen zu tun.

  • sudo docker container list -a: Listet alle Container (sowohl aktive als auch gestoppte) und ihren Status auf
  • sudo docker container stop <name>: Stoppt einen Docker-Container anhand seines Namens (oder seiner ID)
  • sudo docker container start <name>: Startet einen Docker-Container anhand seines Namens (oder seiner ID)
  • sudo docker container prune: Löscht und entfernt alle gestoppten Container

Sie können alle oben genannten Befehle im untenstehenden Screenshot im Kontext sehen:

Managing detached containers using docker container commands

Es gibt viele weitere Docker-Container-Befehle, um Container auf Ihrem Server anzuzeigen, zu ändern, zu inspizieren oder sogar aus der Ferne darauf zuzugreifen. Sie können sie alle anzeigen, indem Sie sudo docker container --help ausführen.

Auch wenn Sie nun einen Webserver in einem im Hintergrund laufenden Container bereitgestellt haben, haben Sie immer noch keine Möglichkeit, Ihren eigenen Inhalt zu hosten. Aktuell stellt Caddy nur die Standard-Webseite bereit.

Werfen wir nun einen Blick darauf, wie Sie Docker-Images mit einem Konzept namens Bind-Mounts verwenden können, um Container mit bedeutungsvollen Daten bereitzustellen.

Speichern von Container-Daten mit Bind-Mounts

Docker arbeitet mit dem Konzept von Images (und den von ihnen generierten Containern), die als „wegwerfbar“ oder vorübergehend angesehen werden. Wenn es ein Update für die Caddy-Software gibt, aktualisieren Sie nicht den Dienst, sondern werfen den gesamten Container weg und verwenden ein völlig neues Image von Grund auf neu.

Die Vorteile des Entsorgens und Neuerstellens von Containern auf diese Weise sind erheblich. Instabilitäten in der Software entstehen im Laufe der Zeit durch kontinuierliche Updates einer (potenziell) jahrelangen Software. Durch die Verwendung eines frischen Images bei jedem Update bietet Docker eine stabile, zuverlässige und (vermutlich) getestete Grundlage.

Dieses Konzept entspricht der Verwendung einer Neuinstallation von Windows jedes Mal, wenn Sie Ihre Windows-Anwendungssoftware aktualisieren. Keine lustige Idee unter Windows, aber in Docker äußerst anwendbar.

Die Wegwerfmethode hat jedoch ein klares Problem. Sie möchten nicht, dass wichtige Daten verloren gehen, wenn Ihr aktueller Dienst gelöscht wird. Docker löst dieses Problem mit einem Konzept namens Bind-Mounts.

Lassen Sie uns nun erkunden, wie Sie ein Bind-Mount für einen Container erstellen können.

Erstellen der Ordnerstruktur und Aufräumen

Bevor Sie Bind-Mounts verwenden können, müssen Sie einen Speicherort für diese Daten erstellen. In diesem Tutorial wird ein Ordner im Home-Verzeichnis erstellt. Um dies in VS Code zu tun, während Sie weiterhin mit Ihrem Ubuntu-Server verbunden sind:

  1. Klicken Sie mit der rechten Maustaste auf einen leeren Bereich des Explorer-Panels von VS Code und wählen Sie „Neuer Ordner“.

2. Benennen Sie den neuen Ordner containers/caddy/files.

Die Ordner können beliebig benannt werden, solange sie in dem kommenden Docker-Befehl korrekt definiert sind. Durch die Verwendung eines Schrägstrichs interpretiert VS Code dies als Erstellung von drei Ordnern. Der Ordner „files“ ist ein Unterverzeichnis von „caddy“ und „caddy“ ist ein Unterverzeichnis von „containers“. Sie müssen diese Ordnerstruktur nicht verwenden, aber sie ergibt mehr Sinn, wenn Sie mehrere Container auf demselben Server haben.

Wenn Sie dies nicht bereits getan haben, stoppen und entfernen Sie alle zuvor erstellten Container mit dem folgenden Befehl:

# Alle aktuell ausgeführten Container stoppen und entfernen.
# Der Befehl $(sudo docker ps -q) erfasst dynamisch alle IDs der ausgeführten Container.
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

Sie können diesen Befehl im nachstehenden Screenshot sehen:

Using the VSCode Explorer Window

Bereitstellen eines Caddy-Containers mit Bind-Mounts

Die Ordnerstruktur ist nun auf dem Ubuntu Server erstellt. Es ist an der Zeit, einen Caddy-Container mit Bind-Mounts zu erstellen.

  1. Bevor Sie zu weit gehen, finden Sie zunächst heraus, wo der Container, mit dem Sie arbeiten, persistente Daten speichert. Dieser Speicherort ist je nach Ersteller des Docker-Images und dessen Zweck unterschiedlich.

Die beste Option, um herauszufinden, wo persistente Daten gespeichert werden, besteht darin, die Dokumentation auf Docker Hub für das betreffende Image zu überprüfen. Für Caddy finden Sie die Dokumentation hier:

The Caddy documentation on Docker Hub

2. Starten Sie den Container mit dem folgenden Befehl. Der Parameter -v ~/containers/caddy/files:/usr/share/caddy ordnet den Pfad vor dem Doppelpunkt (~/containers/caddy/files) dem Ordner innerhalb des Containers (/usr/share/caddy) zu. Dies funktioniert ähnlich wie der Port-Mapping-Befehl, nur dass hier ein Ordner anstelle eines Ports zugeordnet wird. Dieser Befehlstyp wird als Bind Mount bezeichnet.

# Ordnen Sie einen Ordner auf dem Host (der Pfad vor dem Doppelpunkt) zu
# /usr/share/caddy innerhalb des Containers zu
sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

Die Tilde (~) im obigen Code bezieht sich auf den Home-Ordner. In diesem Artikel entspricht dies /home/homelab.

3. Öffnen Sie einen Browser und navigieren Sie zur HTTP-Adresse Ihres Servers. Sie werden feststellen, dass der Server jetzt eine 404-Seite ausliefert. Dies ist zu erwarten, da Sie derzeit keine index.html-Datei in ~/containers/caddy/files haben.

4. Erstellen Sie eine index.html-Datei in ~/containers/caddy/files auf dem Ubuntu-Server im VS Code Explorer-Fenster, die wie folgt aussieht:

<body><h2>hello world!</h2></body>

5. Navigieren Sie zur HTTP-Adresse Ihres Servers und bestätigen Sie, dass der Container jetzt Ihre neue index.html-Seite bereitstellt.

Sie können all dies in der folgenden Animation sehen:

container is now serving your new index.html page.

Im Gegensatz zu den Docker-Verwaltungsbefehlen benötigen die von Ihnen erstellten Dateien (wie index.html) keine Administratorrechte. Dies liegt daran, dass Ihnen der Inhalt gehört, den der Caddy-Server bereitstellt, da er sich in Ihrem Home-Ordner befindet.

Validierung des Bind-Mounts

Ausgezeichnet! Sie verwenden nicht nur einen vollständig neuen Docker-Container, sondern dieser Container stellt auch lokal in Ihrem Home-Ordner gespeicherte Inhalte bereit! Sie können dies nachweisen, indem Sie Folgendes ausführen:

  1. Stoppen und Entfernen Sie den laufenden Container. Dieser Schritt entfernt alles, einschließlich der index.html-Datei, wenn Sie keine Bind-Mounts verwenden.
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Erstellen Sie einen brandneuen Container.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy caddy

3. Überprüfen Sie, ob der neue Container weiterhin die index.html-Datei unter der Adresse http://<Ihr Server> bereitstellt.

Erstellen von persistenten Docker-Containern

A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.

  1. Stoppen und Entfernen Sie alle laufenden Container.
# Stoppen und Entfernen ALLER derzeit ausgeführten Container
sudo docker container stop $(sudo docker ps -q)
sudo docker container prune

2. Starten Sie den Caddy-Container mit dem Parameter --restart always, um diesen neuen Container beim Neustart mit dem Host zu starten. Mit der Option --restart always verhält sich Ihr Container nun wie ein ordnungsgemäßer Dienst und startet automatisch beim Booten.

sudo docker run -d -p 80:80 -v ~/containers/caddy/files:/usr/share/caddy --restart always caddy

3. Starten Sie den Server neu.

4. Überprüfen Sie nun, ob der neue Container hochgefahren wird und weiterhin die index.html-Datei unter der Adresse http://<Ihr Server> bereitstellt.

Sie können die folgenden Befehle unten sehen:

Setting caddy to restart on boot

Weiter geht’s

Zu diesem Zeitpunkt sollten Sie eine funktionierende Docker-Umgebung und ein grundlegendes Verständnis von Images und Containern haben. Sie können Container ziehen, starten, stoppen und grundlegende Verwaltungsaufgaben durchführen. Sie haben auch erfolgreich einen laufenden Webdienst-Container mit Bind-Mounts und Port-Mapping erstellt.

Es gibt noch viel mehr über Docker zu erfahren: Bleiben Sie dran an diesem Bereich, denn im nächsten Artikel wird es um fortgeschrittenes Docker-Management mithilfe von Docker Compose gehen.

Source:
https://adamtheautomator.com/docker-ubuntu/