GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Alles, was Sie über die Verwendung von Docker Compose wissen müssen

Wenn Sie sich fragen, wie Sie mit Docker Compose reproduzierbare Docker-Container erstellen können, sind Sie hier genau richtig. In diesem Docker Compose-Tutorial lernen Sie Schritt für Schritt, wie Sie einfache Container erstellen, Ports mit Docker Compose zuordnen, bis hin zu komplexen Multi-Container-Szenarien.

Sind Sie bereit? Lassen Sie uns graben!

Voraussetzungen

Wenn Sie diesem Tutorial Schritt für Schritt folgen möchten, stellen Sie sicher, dass Sie über Folgendes verfügen:

  1. Eine Neuinstallation von Ubuntu Server LTS mit aktiviertem SSH . In diesem Handbuch wird Ubuntu Server LTS 20.04.1 als Docker-Hostcomputer verwendet.
  2. Ein Computer mit VS Code installiert (optional). In diesem Handbuch wird Visual Studio Code 1.52.1 verwendet, um SSH mit dem Docker-Host zu verbinden und Befehle auszuführen.
  3. Die offizielle SSH-Erweiterung von VS Code ist installiert und mit dem Docker-Host verbunden. (optional)

Was ist Docker Compose?

Einzelne Befehle können in Docker sehr lang werden. Nehmen Sie das Folgende als Beispiel. Dieses Beispiel erstellt einen Container für eine Softwareanwendung namens Bookstack.

docker create \
   --name=bookstack \
   -e PUID # UID of user to take ownership of application/files \
   -e PGID # GID of user to take ownership of application/files \
   -e DB_USER # The database user \
   -e DB_PASS # The database password \
   -e DB_HOST # The database host \
   -e DB_DATABASE # The database to be used \
   -e APP_URL # The url your application will be accessed on (required for correct operation of reverse proxy) \
   -v /host/path/to/config:/config # Location of any uploaded data \
   -p 80:80/tcp # Web UI port \
   --restart unless-stopped \
   linuxserver/bookstack:version-v0.31.4

Mit zunehmender Komplexität einer Docker-Umgebung steigt auch die Menge an Flags und Bedingungen, die für ein funktionierendes Container-Setup erforderlich sind. Die Docker-Befehlszeile wird umständlich und schwierig zu beheben; besonders wenn Multi-Container-Setups in den Mix eintreten.

Docker Compose ist eine Möglichkeit, reproduzierbare Docker-Container mithilfe einer Konfigurationsdatei anstelle extrem langer Docker-Befehle zu erstellen. Durch die Verwendung einer strukturierten Konfigurationsdatei können Fehler leichter erkannt und Containerinteraktionen einfacher definiert werden.

Docker Compose wird schnell unschätzbar, wenn es um Containerabhängigkeiten oder Umgebungen mit mehreren Containern geht.

Docker Compose ist eine fantastische Möglichkeit, ohne die Komplexität verteilter Systeme wie Kubernetes in Infrastructure as Code einzusteigen.

Docker Compose verwendet eine Konfigurationsdateistruktur namens YAML . YAML ähnelt JSON oder HTML darin, dass YAML eine strukturierte, maschinenlesbare Sprache ist. YAML konzentriert sich speziell darauf, so menschenlesbar wie möglich zu sein und gleichzeitig diese strukturierte Leistung beizubehalten.

YAML hat einen Nachteil, da Tabulatoren und andere Leerzeichen wichtig sind und richtig formatiert werden müssen. VS Code erledigt einen Großteil dieser harten Arbeit für Sie und ist auch der Grund, warum Sie viele der Beispiele sehen werden, die in VS Code ausgeführt werden.

Installieren von Docker Compose

Fangen wir jetzt an, uns die Hände schmutzig zu machen. Angenommen, Sie sind mit Ihrem Docker-Host verbunden, ist es an der Zeit, Docker Compose zu installieren.

Docker Compose ist ein separates Paket von der Docker-Laufzeit. Durch die Installation von Docker Compose wird jedoch auch die Docker-Laufzeitumgebung installiert, sodass Sie zwei Fliegen mit einer Klappe schlagen!

Um Docker Compose und die Docker-Laufzeitumgebung zu installieren, führen Sie die folgenden beiden Befehle aus.

# update the software list (known as a repository) and then install docker compose
# with any needed dependencies. the -y flag is used to skip confirmation
sudo apt update -y
sudo apt install docker-compose -y

Nach der Installation sollten Sie nun eine Ordnerstruktur zum Speichern von Containern erstellen.

Erstellen einer Ordnerstruktur für Docker Compose

Bevor Sie mit Docker Compose einen Container erstellen können, sollten Sie zunächst einen Ordner zum Speichern von Containern erstellen. Sie sollten nicht nur eine Ordnerstruktur zum Speichern von Containern erstellen, sondern Sie werden feststellen, dass verschiedene Docker-Befehle empfindlich auf den Speicherort verschiedener Konfigurationsdateien reagieren. Docker Compose ist da nicht anders.

Die wichtigste Komponente von Docker Compose ist seine Konfigurationsdatei namens docker-compose.yaml . Diese Konfigurationsdatei bestimmt, wie oben erläutert, wie die Docker-Laufzeit einen Container erstellen soll.

Wenn Sie Docker Compose ausführen, sucht der Befehl nach seiner Konfigurationsdatei im selben Ordner, in dem der Befehl ausgeführt wird. Aufgrund dieser Anforderung ist es immer am besten, beim Ausführen von Docker Compose einen separaten Ordner zu erstellen.

Es darf nur eine Docker Compose-Konfigurationsdatei pro Ordner geben.

Um das Erstellen eines Docker-Containers mit Docker Compose zu demonstrieren, erstellen Sie zunächst eine Ordnerstruktur, um den zukünftigen Container und seine Konfigurationsdatei mithilfe eines kleinen Dateiservers namens Caddy. zu speichern

Caddy ist ein Dateiserver, ähnlich wie Apache httpd oder nginx , aber in der Go-Sprache geschrieben. Caddy ist speziell auf Benutzerfreundlichkeit ausgelegt (und generiert oder liefert automatisch eine index.html-Datei) ohne Konfiguration. Diese Kombination macht Caddy zu einer guten Wahl für Einsteiger.

Angenommen, Sie sind bei Ihrem Docker-Host angemeldet, erstellen Sie die Ordnerstruktur wie folgt:

  1. Erstellen Sie in Ihrem Home-Verzeichnis einen Ordner namens containers . Dieser Ordner ist ein guter Platzhalter für diesen und andere Container.
  2. In den Containern erstellen Sie einen Unterordner namens caddy . Dieser Ordner enthält die Docker Compose-Konfigurationsdatei und den Caddy-Container selbst.
  3. Schließlich erstellen Sie im Containerordner caddy eine leere Textdatei mit dem Namen docker-compose.yaml das wird zur Docker Compose-Konfigurationsdatei.

Nachdem die Ordnerstruktur und die Docker Compose-Konfigurationsdatei erstellt wurden, können Sie nun damit beginnen, diese Konfigurationsdatei mit einer Docker Compose-Konfiguration auszufüllen.

Erstellen einer Docker Compose-Konfigurationsdatei

In ihrer einfachsten Form eine docker-compose.yaml Datei für den Caddy-Container sieht wie folgt aus. Kopieren Sie in Ihrem bevorzugten Linux-Texteditor oder mit VS Code den folgenden Code und fügen Sie ihn in die zuvor erstellte Docker Compose-Konfigurationsdatei ein.

version: "3.7"
services:
  caddy:
    container_name: "caddy"
    image: "caddy:latest"
    ports:
      - "80:80"

Lassen Sie uns die angezeigten Optionen schrittweise durchgehen:

  • version gibt die Version der docker-compose-Datei an. Jede neue Definition von Docker Compose enthält Breaking Changes an der Spezifikation. Daher ist die Version wichtig, damit Docker Compose erkennen kann, welche Funktionen verwendet werden müssen. Version 3.7 ist die neueste Version, die Ubuntu 20.04.1 LTS unterstützt.

Die vollständige Spezifikation für Docker Compose 3.x finden Sie hier. Die verlinkte Dokumentation erwähnt jede einzelne Option, die Sie in Docker Compose verwenden können

  • services enthalten die Spezifikationen für die eigentlichen Container. In diesem Abschnitt können Sie mehrere Container definieren.
  • caddy ist der Name des ersten Containers (dies dient nur als Referenz).
  • container_name definiert den tatsächlichen Namen, der dem Container von Docker gegeben wird, und muss eindeutig sein.
  • image ist der Name des Bildes. In diesem Fall Caddy aus dem Docker Hub ist definiert. Der Name oder die Nummer nach dem Tag, getrennt durch einen Doppelpunkt, ist die Version.

Portzuordnung

Insbesondere die letzte Option erfordert eine besondere Erwähnung:

ports:
  - "80:80"

In Docker Compose sind die ports -Direktive können Sie eine oder mehrere Zuordnungen vom Host zum Container festlegen. Oben haben Sie beispielsweise Port 80 zugeordnet auf dem Host auf Port 80 auf dem Behälter. Sie müssen die Portnummer jedoch nicht abgleichen. Das folgende Beispiel bildet Port 8800 ab auf dem Host auf Port 80 im Behälter.

ports:
  - "8800:80"

Sie können auch mehrere Ports wie unten definieren.

ports:
  - "80:80"
  - "443:443"

Dadurch würden beide Ports 80 zugeordnet und 443 an den Host (eine übliche Konfiguration für Webserver, um sowohl HTTP als auch HTTPS zu bedienen).

Der Docker-Image-Ersteller definiert verfügbare Ports zum Zeitpunkt der Erstellung. Überprüfen Sie unbedingt die Dokumentation des Images, mit dem Sie auf Docker Hub oder auf der Website des Betreuers arbeiten, auf abbildbare Ports. Es hat keinen Sinn, einen Port zuzuordnen, wenn der Port nicht verwendet wird!

Sehen wir uns vor diesem Hintergrund an, wie der Container tatsächlich ausgeführt wird.

Container ausführen

Inzwischen sollten Sie die docker-compose.yaml haben Datei in Ihrem ~\containers\caddy Mappe. Jetzt ist es an der Zeit, den Caddy-Container zu erstellen und zu starten.

Führen Sie auf Ihrem Terminal den folgenden Befehl aus, der die in docker-compose.yaml definierten Docker-Container aufruft Datei.

# This command must be run in the same folder as the file. The -d flag runs
# the command *detached*, which will bring up the container in the background
sudo docker-compose up -d

Möglicherweise stellen Sie fest, dass Sie beim Ausführen von sudo docker-compose up -d den Speicherort der Datei docker-compose.yaml nicht angeben mussten . Docker Compose erwartet, dass Sie alle Befehle in dem Ordner ausführen, der die Datei „docker-compose.yaml“ enthält, da viele Befehle relativ zu diesem Ordner sind.

Überprüfen Sie nun, ob der Container betriebsbereit ist, indem Sie zu http:// navigieren . Diese Anleitung verwendet http://homelab-docker als Referenz.

In der folgenden Animation können Sie sehen, wie diese Verarbeitung in VS Code erfolgt, während Sie per SSH in den Docker-Host eingebunden werden:

Erfolg! Sie haben jetzt Docker Compose erfolgreich verwendet, um einen Container aus einer Konfigurationsdatei zu starten. Sehen wir uns nach diesem ersten wichtigen Schritt an, wie Sie den Status Ihres Containers verwalten.

Befehle zum Verwalten getrennter Container

Im vorherigen Abschnitt haben Sie den Caddy-Container mit -d gestartet Flagge. Dabei lief ein Container in einem getrennten Zustand. Wenn sich ein Container in einem getrennten Zustand befindet, wird der Container weiterhin im Hintergrund ausgeführt. Dies stellt jedoch ein Problem dar:Wie verwalten Sie diesen Container, wenn Sie keine direkte Kontrolle mehr haben?

Um dieses Problem zu lösen, verfügt Docker Compose über eine Reihe von Befehlen, die Container verwalten, die mit einer docker-compose.yaml gestartet wurden Datei:

  • docker-compose restart wird verwendet, um einen aktuell ausgeführten Container neu zu starten. Dies unterscheidet sich vom tatsächlichen erneuten Ausführen von docker-compose up -d . Der Neustartbefehl startet einfach einen vorhandenen Container neu, führt docker-compose up -d erneut aus Befehl und erstellen Sie den Container von Grund auf neu (falls die Konfigurationsdatei geändert wurde).
  • docker-compose stop stoppt einen laufenden Container, ohne den Container zu zerstören. Ebenso docker-compose start startet den Container neu.
  • docker-compose down stoppt die laufenden Container und zerstört sie auch . Hier kommen Bindungsmounts von Volumes ins Spiel (lesen Sie weiter unten mehr).
  • docker-compose pull zieht die aktuelle Version des Docker-Images (oder der Images) aus dem Repository. Bei Verwendung des latest Tag können Sie mit docker-compose down && sudo docker-compose up -d folgen um den Container durch die neueste Version zu ersetzen. Verwenden von docker-compose pull ist eine bequeme Möglichkeit, Container schnell und mit minimaler Ausfallzeit zu aktualisieren.
  • docker-compose logs zeigt die Protokolle des laufenden (oder angehaltenen) Containers an. Sie können auch einzelne Container (falls mehrere Container in der Compose-Datei definiert sind) mit docker-compose logs <container name> ansprechen .

Eine vollständige Liste der docker-compose-Befehle kann durch Ausführen von docker-compose angezeigt werden ohne zusätzliche Argumente oder hier in der Dokumentation referenziert.

Nachdem Sie nun einen laufenden Container haben, sehen wir uns die Verwendung von Inhalten an, die lokal auf Ihrem Computer gespeichert sind.

Bind-Mounts in Docker Compose erstellen

Reittiere binden So ordnet Docker wichtige Benutzerdaten dem lokalen Speicher auf Ihrem Server zu. Generieren Sie zunächst einige Inhalte für den zu hostenden Container:

  1. Auf dem Docker-Host, innerhalb von ~/containers/caddy Ordner erstellen Sie einen neuen Ordner namens files .

2. Erstellen Sie eine neue Datei namens index.html innerhalb von ~/containers/caddy Ordner, der wie unten aussieht. Dies ist die Hauptseite, die der Caddy-Webserver anbietet.

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

3. Ändern Sie Ihre Docker Compose-Konfigurationsdatei so, dass sie wie unten aussieht. Die folgende Beispieldatei fügt die volumes hinzu -Abschnitt und zeigt einen Bind-Mount auf die Dateien gerade erstellten Ordner, um ihn dem Container zur Verfügung zu stellen.

version: "3.7" services: caddy: container_name: "caddy" image: "caddy:latest" ports: - "80:80" volumes: #the ./ refers a folder relative to the docker-compose file - "./files:/usr/share/caddy"

4. Führen Sie docker-compose up -d aus wieder. Docker Compose erkennt nun, dass die Datei geändert wurde, und erstellt Ihren Container neu.

5. Navigieren Sie mit einem Browser zur Seite des Containers und Sie sollten jetzt sehen, dass er die Nachricht „Hello World!“ bedient. Seite.

Folgendes können Sie in der folgenden Animation sehen:

Sie hosten jetzt Inhalte, die lokal auf Ihrem Computer gespeichert sind! Was aber, wenn sich Ihre Inhalte auf einer externen Quelle wie einer Netzwerkfreigabe befinden?

Verwendung von Docker Compose mit Docker-Volumes

Sobald Sie mit Docker Compose einen einfachen Container erstellt haben, benötigen Sie diesen Container wahrscheinlich, um an anderer Stelle auf Dateien zuzugreifen, möglicherweise auf einer Netzwerkfreigabe. In diesem Fall können Sie den Container direkt in Ihrer Docker Compose-Konfigurationsdatei für die Verwendung von Docker-Volumes konfigurieren.

Zu Demonstrationszwecken wird in diesem Handbuch ein Network File Share (NFS)-Server auf dem Docker-Host erstellt. Das Bereitstellen lokaler Inhalte als NFS-Mount hat keinen praktischen Zweck außerhalb der Demonstration. Wenn Sie ein NFS-Volume mounten, stammt es im Allgemeinen von einer externen Quelle wie einem NAS oder Remote-Server.

Richten Sie eine NFS-Freigabe ein

Wenn Sie noch keine NFS-Freigabe eingerichtet haben, erstellen Sie jetzt eine auf dem Docker-Host für dieses Tutorial. Dazu:

  1. Installieren Sie den NFS-Server Paket, indem Sie apt install nfs-kernel-server -y ausführen .

2. Fügen Sie den Container als NFS-Export (ähnlich einer Windows CIFS-Freigabe) hinzu, indem Sie Folgendes ausführen.

# Add a line to the /etc/exports config file to create a NFS share for # /home/homelab/containers. This share is only exposed to localhost (to # prevent other computers from having access) echo '/home/homelab/containers localhost(rw,sync,no_root_squash,no_subtree_check)' | sudo tee -a /etc/exports # Restart the NFS server with the new config sudo systemctl restart nfs-kernel-server

3. Überprüfen Sie nun, ob der Host die NFS-Freigabe verfügbar macht, indem Sie showmount -e localhost ausführen . Dieser Befehl zeigt alle derzeit exponierten NFS-Freigaben und wer Zugriff hat.

Im folgenden Screenshot sehen Sie /home/homelab/containers ausgesetzt ist, aber nur für den localhost-Computer (der derselbe Server ist, auf dem der Docker-Host ausgeführt wird).

Wenn Sie den Ordner /home//containers sehen in der Ausgabe wird die NFS-Freigabe eingerichtet.

Definieren eines benannten Docker-Volumes

Nachdem Sie die NFS-Freigabe erstellt haben, müssen Sie Docker nun mitteilen, wie auf diese Freigabe zugegriffen werden soll. Mit Docker Compose können Sie dies tun, indem Sie ein benanntes Volume definieren in der Docker Compose-Konfigurationsdatei.

Ein benanntes Volume ist eine Möglichkeit für Docker, netzwerkbasierte Dateifreigaben zu abstrahieren. Die gemeinsame Nutzung von Netzwerkdateien gibt es heutzutage in allen möglichen Formen und Größen:CIFS-Freigaben (Windows), NFS-Freigaben (Linux), AWS S3-Buckets und mehr. Durch das Erstellen eines benannten Volumes erledigt Docker den schwierigen Teil, um herauszufinden, wie es mit der Netzwerkfreigabe kommunizieren kann, und lässt den Container die Freigabe einfach so behandeln, als ob es sich um einen lokalen Speicher handelt.

So erstellen Sie ein benanntes Volume:

  1. Öffnen Sie die Docker Compose-Konfigurationsdatei (docker-compose.yaml ). Wenn Sie dem folgen, sollte sich die Datei im Verzeichnis ~/containers/caddy befinden Ordner.

2. Fügen Sie innerhalb der Docker Compose-Konfigurationsdatei ein volumes hinzu Abschnitt nach den services Sektion. Ihre Konfigurationsdatei sollte wie unten aussehen. Die volumes -Abschnitt erstellt ein benanntes Volume namens MyWebsite . Innerhalb dieses benannten Volumes werden die erforderlichen Parameter (z. B. IP, NFS-Einstellungen und Pfad) angegeben. Die volumes Parameter innerhalb der services Abschnitt wurde ebenfalls geändert, um auf das Namensvolume im Gegensatz zu einem lokalen Ordner zu verweisen.

version: "3.7"
 services:
   caddy:
     container_name: "caddy"
     image: "caddy:latest"
     ports:
       - "80:80"
     volumes:
       - "MyWebsite:/usr/share/caddy"
 volumes:
   MyWebsite:
     driver_opts:
       type: "nfs"
       o: "addr=localhost,nolock,soft,rw"
       device: ":/home/homelab/containers/caddy/files"

3. Nachdem Sie das benannte Volume definiert haben, das auf die NFS-Freigabe in der Docker Compose-Konfigurationsdatei verweist, führen Sie docker-compose up -d aus um den Container zu erstellen und zu starten. Wenn alles gut geht, sollten der Container und die Website wieder verfügbar sein.

4. Navigieren Sie erneut zur Seite des Containers. Die index.html Der Inhalt sollte so angezeigt werden, als ob die Datei lokal bereitgestellt würde. Diese Datei wird jedoch über den im Netzwerk eingerichteten NFS-Server bereitgestellt.

Da Sie jetzt externe Docker-Volumes in Docker Compose mounten können, können Sie jetzt alle Arten von Netzwerkspeicher in Ihre Container bringen. Docker Compose kann jedoch mehr, als nur einzelne Container oder Volumes zu definieren. Lassen Sie uns in komplexere Szenarien mit mehreren Containern eintauchen.

In dieser Anleitung wird der Caddy-Container nicht mehr verwendet, sodass Sie den Container mit docker-compose down entfernen können .

Mehrere Container in Docker Compose definieren

Die meisten Docker-Container funktionieren nicht in einem Vakuum. Docker-Container haben normalerweise Dienstabhängigkeiten wie Datenbanken oder separate Webdienste, die über eine API kommunizieren.

Mit Docker Compose können Sie Container gruppieren, die in einer einzigen Datei definiert sind. Durch die Definition mehrerer Container in einer einzigen Datei können Container zwischen abhängigen Diensten kommunizieren und die Organisation komplexer Container-Layouts vereinfachen.

Um ein solches Szenario zu demonstrieren, richten wir eine beliebte Wiki-Anwendung namens BookStack ein .

BookStack ist eine beliebte Wiki-Software, die für ihre Benutzerfreundlichkeit und ihr hierarchisches Layout bekannt ist (im Gegensatz zu einem flachen Layout wie MediaWiki).

BookStack erfordert wie viele Webanwendungen eine separate Datenbank, um ordnungsgemäß zu funktionieren, sowie die Informationen, die für die Kommunikation mit der Datenbank erforderlich sind. Docker Compose zeichnet sich durch die Einrichtung einer solchen Situation aus.

Erstellen Sie die Docker Compose-Konfigurationsdatei

BookStack hat jedoch kein intern gepflegtes Docker-Image, linuxserver.io unterhält ein seriöses Docker Hub-Image im Namen von BookStack. Während die Dokumentation auf der Docker-Hub-Site eine empfohlene Docker Compose-Konfigurationsdatei enthält, erstellt dieses Tutorial eine neue Konfigurationsdatei, während die Konzepte erklärt werden.

Auf dem Docker-Host:

  1. Erstellen Sie zuerst einen Ordner für BookStack. Wenn Sie die Tutorials des vorherigen Abschnitts befolgt haben, sollten Sie ein ~/containers haben Mappe. Erstellen Sie einen Ordner namens bookstack drin.

2. Erstellen Sie dann eine leere Docker Compose-Konfigurationsdatei namens docker-compose.yaml innerhalb des Bücherstapels Mappe.

3. Öffnen Sie nun die Konfigurationsdatei von Docker Compose und definieren Sie zwei Container:den bookstack container und die bookstack_db (mariadb)-Container.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"

Bisher diese docker-compose.yaml Datei verwendet hauptsächlich bereits eingeführte Konzepte:Sie haben zwei Dienste (bookstack und bookstack_db ), sowohl mit Bildern als auch mit Bindungshalterungen. Der Bookstack-Container hat eine Port-Zuordnung von Host-Port 8080 zu internem Port 80.

Aufgrund des extrem geringen Overheads von Docker-Containern ist es üblich, für jede Webanwendung einen separaten Datenbankcontainer zu definieren. Dies ermöglicht eine stärkere Aufgabentrennung. Dies unterscheidet sich deutlich von herkömmlichen Datenbank-Setups, bei denen eine einzelne Datenbankinstallation Hunderte von Webanwendungen bedienen kann.

Eine neue Option, die Sie in der obigen Datei sehen können, ist depends_on Befehl. Dieser Befehl teilt Docker die Reihenfolge mit, in der die Container gestartet werden sollen. depends_on definieren Befehl teilt Docker mit, dass die bookstack_db Behälter muss Beginnen Sie zuerst.

Einrichten der Containerkommunikation mit Umgebungsvariablen

Diese im letzten Abschnitt erstellte Konfigurationsdatei ist noch nicht vollständig. Während Sie zwei Dienste (Container) definiert haben, sprechen sie nicht miteinander! Der bookstack Container hat keine Ahnung, wie er mit bookstack_db kommunizieren soll Container. Lassen Sie uns das mithilfe von Umgebungsvariablen lösen.

Umgebungsvariablen sind die gebräuchlichste Art, Variablen für Docker-Container bereitzustellen. Dies sind Variablen, die zur Laufzeit angegeben (oder in docker-compose.yaml definiert werden Konfigurationsdatei), um Informationen darüber bereitzustellen, was der Container tun muss.

Umgebungsvariablen werden von der Person definiert, die das Docker-Image erstellt. Sie unterscheiden sich je nach verwendetem Docker-Image, und Sie müssen sich auf die Dokumentation des Erstellers bezüglich der zu verwendenden Umgebungsvariablen beziehen.

Es gibt zwei Methoden zum Definieren von Umgebungsvariablen; direkt in der docker-compose.yaml Datei selbst oder als separate Datei.

Eine separate Datei ist normalerweise die empfohlene Methode, insbesondere wenn Variablen sensible Daten wie Passwörter enthalten. Eine docker-compose.yaml Die Datei ist so konzipiert, dass sie geteilt oder sogar in ein öffentlich zugängliches GitHub-Repo hochgeladen werden kann. Das Vorhandensein einer separaten Datei für vertrauliche Daten verringert die Wahrscheinlichkeit einer versehentlichen Sicherheitsverletzung.

Erstellen Sie nun auf dem Docker-Host zwei Umgebungsvariablen; eine für den Bücherstapel Container und eine für die bookstack_db Behälter.

  1. Erstellen Sie eine neue Datei im ~/containers/bookstack Ordner namens bookstack.env mit folgendem Inhalt:
APP_URL is the IP address or hostname of your server. This article is using homelab-docker
 APP_URL=http://homelab-docker:8080
 DB_HOST is the container name you gave your container
 DB_HOST=bookstack_db
 DB_USER is defined in the bookstack_DB environment file
 DB_USER=bookstack_user
 DB_PASS is also defined in the bookstack_DB environment file
 DB_PASS=MySecurePassword
 DB_DATABASE is the name of the database within mariadb
 DB_DATABASE=bookstack

2. Erstellen Sie eine neue Datei im ~/containers/bookstack Ordner namens bookstack_db.env und folgenden Inhalt enthalten:

The root password for our database, keep it secret, keep it safe
 MYSQL_ROOT_PASSWORD=MySecureRootPassword
 The database bookstack will be using
 MYSQL_DATABASE=bookstack
 the user bookstack will be using
 MYSQL_USER=bookstack_user
 the password bookstack will be using
 MYSQL_PASSWORD=MySecurePassword

3. Stellen Sie jetzt als Best Practice sicher, dass beide env Dateien sind für andere Benutzer nicht lesbar.

chmod 600 bookstack.env bookstack_db.env

Sie sollten den Lesezugriff ändern, da sowohl die Dateien bookstack.env als auch bookstack_db.env vertrauliche Daten enthalten.

4. Aktualisieren Sie ~/containers/bookstack/docker-compose.yaml Docker Compose-Datei, um auf diese beiden unten gezeigten Umgebungsdateien zu verweisen.

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"

5. Starten Sie nun den Bookstack und bookstack_db Container mit Docker Compose.

sudo docker-compose up -d

Sie können jeden der oben genannten Schritte in diesem Abschnitt unten im VS-Code ausführen sehen.

Überwachung von Docker-Compose-Protokollen

Die Docker-Engine arbeitet mit Docker Compose zusammen, um viele verschiedene Aufgaben im Hintergrund auszuführen. Es ist hilfreich, überwachen zu können, was vor sich geht, insbesondere wenn Sie mit mehreren Containern gleichzeitig arbeiten.

Um beispielsweise den Bücherstapel-Container zu überwachen, verwenden Sie die logs Befehl. Sobald Sie in diesem Tutorial die Protokolle sehen, wird [services.d] done angezeigt , können Sie zur URL des Bücherstapels wechseln.

sudo docker-compose logs bookstack

In diesem Stadium sollten Sie ein voll funktionsfähiges Wiki haben, das in einem eigenen Container läuft, mit einer eigenen Datenbank, vollständig in Docker!

Solange Sie die Ordner bookstack und bookstack_db haben, können Sie Ihre bookstack-Umgebung von Grund auf neu erstellen.

Docker Compose und Networking

Bis zu diesem Punkt haben Sie noch nicht allzu viel über die Kommunikations- und Netzwerkaspekte der Zusammenarbeit von Containern gelernt. Lass uns das ändern.

Wenn Sie mehrere Container innerhalb einer einzigen docker-compose.yaml erstellen Datei, wie Sie es in den vorherigen Abschnitten getan haben, werden sie alle demselben Netzwerk zugewiesen (normalerweise als Name-des-übergeordneten-Ordners_Standard bezeichnet ).

Sie können das für die Container erstellte Netzwerk sehen, wenn Sie docker-compose up -d ausführen wie unten gezeigt.

Wenn alle Container innerhalb desselben Netzwerks zugewiesen werden, erstellt Docker intern DNS-Einträge für sie. Aus diesem Grund haben Sie im vorherigen Beispiel auf Ihre Datenbank als bookstack_db verwiesen in den Umgebungsvariablen. Diese bookstack_db name ist eigentlich ein DNS-Eintrag, der auf die IP-Adresse des Datenbankcontainers verweist.

Sie müssen sich auch nicht darauf verlassen, dass Docker Compose automatisch Netzwerke für Sie generiert. Sie können interne oder externe Netzwerke manuell definieren. Das manuelle Definieren von Netzwerken ist großartig, wenn Sie einen Container haben, der mit einem anderen Container in einer separaten docker-compose.yaml kommunizieren muss Datei. Sie könnten die Ports freigeben oder ein Netzwerk erstellen, dem beide beitreten können!

Beachten Sie, dass Sie beim expliziten Definieren von Netzwerken auch das Standardnetzwerk explizit definieren müssen. Docker Compose beendet die automatische Erstellung dieses Netzwerks, sobald Sie mit der Definition der Netzwerke beginnen

Ändern Sie nun den Bücherstapel docker-compose.yaml um ein extern erstelltes Netzwerk einzubinden.

  1. Erstellen Sie das externe Netzwerk mit docker network create my_external_network .

2. Definieren Sie das externe Netzwerk in docker-compose.yaml :

version: "3.7"
 services:
   bookstack:
     container_name: "bookstack"
     image: "ghcr.io/linuxserver/bookstack"
     ports:
       - "8080:80"
     volumes:
       - "./files:/usr/share/caddy"
     depends_on:
       - "bookstack_db"
     env_file:
       - "./bookstack.env"
     networks:
       - "my_external_network"
       - "bookstack_default"
   bookstack_db:
     container_name: "bookstack_db"
     image: "mariadb"
     volumes:
       - "./db:/var/lib/mysql"
     env_file:
       - "./bookstack_db.env"
     networks:
       - "bookstack_default"
 networks:
   bookstack_default:
   my_external_network:
     external: true

3. Führen Sie docker-compose up -d aus um die Container neu zu erstellen. Ihre beiden Container sind jetzt wie unten gezeigt mit zwei Netzwerken verbunden.

Der Bücherstapelbehälter ist jetzt auch mit einem extern definierten Netzwerk verbunden. Dadurch können Sie einen weiteren Container erstellen, der den HTTP-Verkehr des Bücherstapels in HTTPS umwandelt, bevor er Docker verlässt (als Reverse-Proxy bezeichnet). ).

Festlegen, dass ein bestimmter Benutzer einen Container ausführt

Standardmäßig werden alle Docker-Container als Sandbox-Root-Benutzer ausgeführt. Dies entspricht dem Ausführen einer virtuellen Maschine, die als standardmäßiger Administratorbenutzer angemeldet ist. Während dies allgemein ist kein Problem, es gibt Sicherheitsbedenken, wenn die Sandbox kompromittiert wird.

Das andere Problem beim Ausführen als Root sind Dateiberechtigungen. Sie können das bemerken, wenn Sie versuchen, die db zu löschen Ordner innerhalb des Bücherstapels Ordner, das können Sie eigentlich nicht; der Inhalt gehört root.

Während die meisten Images es nicht mögen, als Nicht-Root-Benutzer ausgeführt zu werden, ist linuxserver.io Insbesondere Bilder bieten eine Umgebungsvariable zum Festlegen des Benutzers, der im Container ausgeführt wird. Sie können dies tun, indem Sie UID=1000 hinzufügen und GID=1000 innerhalb der bookstack.env Konfiguration.

1000:1000 ist die Standard-Benutzer-ID und -Gruppe für den ersten Benutzer in Ubuntu (was Sie möglicherweise nicht sind). You can read more about User IDs and Group IDs at Related:A Windows Guy in a Linux World:Users and File Permissions )

You can also force a UID and GID using the user parameter in docker-compose, but this is not recommended as most containers do not behave well when forced to a different user

Setting the Restart Policy

If you’d like containers built with Docker Compose to restart on failure, use the restart policy by adding a restart: <option> parameter under the container settings in docker-compose.yaml .

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

Adding this parameter will cause containers to automatically restart on failure to help maintain uptime in the event of unexpected power issues.

Manually setting DNS entries for Containers

Just like with Windows and Linux, Docker also has a “hosts file”. By using the extra_hosts parameter in a config file, you can force a host to resolve to a specific IP. This can be useful when you have DNS constraints, such as split DNS or a test server you want to interact with temporarily.

extra_hosts:
  - "somehost:x.x.x.x"
  - "otherhost:x.x.x.x"

Running Commands

Once the container is started, you can run commands inside of the container using the docker-compose run . For example, maybe you’d like to start up a Bash terminal inside of your bookstack Container. To do that, you’d run the command below.

docker-compose run web bash

Fazit

At this stage, you should have enough information to follow along with the majority of docker-compose tutorials out on the web. Having this knowledge can vastly expand your ability to move into the world of Docker, and the building of web apps in Infrastructure as Code.


Docker
  1. Podman vs. Docker:Alles, was Sie wissen müssen

  2. Alles, was Sie über Zorin OS 12 wissen wollten

  3. Alles, was Sie über Ubuntu 13.04 wissen müssen

  4. Alles, was Sie über CentOS Stream wissen müssen

  5. Was ist ein VPN? Alles, was Sie über VPNs wissen müssen

Alles, was Sie über Peppermint Linux OS wissen müssen

Alles, was Sie über Black Lab Linux wissen müssen

Alles, was Sie über die Linux Mint-Distribution wissen müssen

Alles, was Sie über Inodes in Linux wissen müssen

Alles Wichtige, was Sie über Hard Link in Linux wissen müssen

Alles Wichtige, was Sie über UID in Linux wissen müssen