Verständnis der Beziehung zwischen Docker-Images und -Containern

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Tutorial bietet ein umfassendes Verständnis der Beziehung zwischen Docker-Images und -Containern. Es behandelt die wichtigsten Konzepte zum Erstellen, Speichern und Verwalten von Docker-Images sowie zum Erstellen, Ausführen und Überwachen von Docker-Containern. Sie lernen, wie Sie Networking, Volumes und Docker Compose nutzen, um mehrcontainerige Anwendungen zu erstellen und bereitzustellen. Am Ende dieses Leitfadens haben Sie ein tiefes Verständnis dafür, wie Docker-Images und -Container zusammenarbeiten, um Ihre Anwendungsbereitstellung und -verwaltung zu optimieren.

Einführung in Docker: Was ist Docker und warum sollte man es verwenden?

Docker ist eine leistungsstarke Open-Source-Plattform, die Entwicklern und IT-Experten die konsistente und effiziente Erstellung, Bereitstellung und Verwaltung von Anwendungen ermöglicht. Sie bietet eine standardisierte Methode zum Packen und Verteilen von Software, was die Entwicklung, das Testen und die Bereitstellung von Anwendungen in verschiedenen Umgebungen vereinfacht.

Was ist Docker?

Docker ist eine Containerisierungsplattform, die es Ihnen ermöglicht, Ihre Anwendung und ihre Abhängigkeiten in eine leichte, portable und selbstkonsistente Einheit, einen Docker-Container, zu verpacken. Diese Container lassen sich einfach bereitstellen, skalieren und verwalten, wodurch sichergestellt wird, dass Ihre Anwendung in verschiedenen Umgebungen, von der Entwicklung bis zur Produktion, konsistent läuft.

Warum Docker verwenden?

Es gibt mehrere wichtige Vorteile bei der Verwendung von Docker:

  1. Konsistenz und Reproduzierbarkeit: Docker stellt sicher, dass Ihre Anwendung und ihre Abhängigkeiten unabhängig von der zugrunde liegenden Infrastruktur auf dieselbe Weise gepackt und bereitgestellt werden. Dies hilft, das Problem "funktioniert auf meinem Rechner" zu beseitigen, bei dem eine Anwendung auf einem System einwandfrei läuft, aber auf einem anderen nicht.

  2. Skalierbarkeit und Flexibilität: Docker-Container sind leichtgewichtig und lassen sich leicht skalieren, wodurch es einfacher wird, Schwankungen in der Anwendungsnachfrage zu bewältigen. Darüber hinaus ermöglicht das modulare Design von Docker, einzelne Komponenten Ihrer Anwendung einfach zu ersetzen oder zu aktualisieren, ohne den Rest des Systems zu beeinträchtigen.

  3. Verbesserte Entwicklerproduktivität: Docker vereinfacht den Entwicklungs- und Bereitstellungsprozess, indem es eine konsistente, isolierte Umgebung für die Erstellung, das Testen und die Ausführung von Anwendungen bietet. Dies reduziert die Zeit und den Aufwand, die für die Einrichtung und Wartung von Entwicklungs- und Produktionsumgebungen erforderlich sind.

  4. Effiziente Ressourcennutzung: Docker-Container teilen sich den Kernel des Host-Betriebssystems, was bedeutet, dass sie schnell starten und stoppen können und weniger Ressourcen benötigen als herkömmliche virtuelle Maschinen. Dies kann zu einer effizienteren Nutzung der Rechenressourcen und niedrigeren Infrastrukturkosten führen.

  5. Portabilität und Flexibilität bei der Bereitstellung: Docker-Container lassen sich problemlos zwischen verschiedenen Umgebungen, vom Laptop eines Entwicklers bis zu einem Produktionsserver, verschieben, ohne sich um Unterschiede in der zugrunde liegenden Infrastruktur kümmern zu müssen. Dies erleichtert die Bereitstellung und Verwaltung von Anwendungen in verschiedenen Umgebungen, einschließlich On-Premise, in der Cloud oder in hybriden Umgebungen.

Um mit Docker zu beginnen, müssen Sie den Docker-Engine auf Ihrem System installieren. In diesem Tutorial verwenden wir Ubuntu 22.04 als Host-Betriebssystem. Sie können Docker auf Ubuntu 22.04 installieren, indem Sie folgende Schritte ausführen:

sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

Sobald Docker installiert ist, können Sie die Installation überprüfen, indem Sie den folgenden Befehl ausführen:

docker version

Dies sollte die installierte Docker-Version auf Ihrem System anzeigen.

Docker-Images verstehen: Erstellen, Speichern und Ziehen von Images

Docker-Images sind die Grundlage von Docker-Containern. Sie sind die schreibgeschützten Vorlagen, die zum Erstellen von Containern verwendet werden. In diesem Abschnitt werden wir untersuchen, wie Docker-Images erstellt, gespeichert und gezogen werden.

Erstellen von Docker-Images

Um ein Docker-Image zu erstellen, benötigen Sie eine Dockerfile, eine Textdatei, die Anweisungen zum Erstellen des Images enthält. Hier ist ein Beispiel für eine Dockerfile, die einen einfachen Webserver mit Nginx erstellt:

FROM nginx:latest
COPY index.html /usr/share/nginx/html/
EXPOSE 80

Sie können dieses Image mit folgendem Befehl erstellen:

docker build -t my-nginx-image .

Dieser Befehl erstellt ein neues Image mit dem Namen my-nginx-image basierend auf den Anweisungen in der Dockerfile.

Speichern von Docker-Images

Docker-Images können in einem Docker-Registry gespeichert werden, einem zentralen Repository für Docker-Images. Das beliebteste öffentliche Registry ist Docker Hub, aber Sie können auch Ihr eigenes privates Registry einrichten.

Um ein Image auf Docker Hub zu pushen, müssen Sie sich zuerst bei Ihrem Docker Hub-Konto anmelden:

docker login

Anschließend können Sie Ihr Image mit Ihrem Docker Hub-Benutzernamen taggen und es in das Registry pushen:

docker tag my-nginx-image username/my-nginx-image:latest
docker push username/my-nginx-image:latest

Ziehen von Docker-Images

Um ein Docker-Image aus einem Registry zu ziehen, können Sie den Befehl docker pull verwenden. Um beispielsweise das neueste Nginx-Image von Docker Hub zu ziehen:

docker pull nginx:latest

Sie können auch Images aus einem privaten Registry ziehen, indem Sie die Registry-URL angeben:

docker pull private-registry.example.com/my-image:latest

Sobald Sie ein Image haben, können Sie es verwenden, um einen Docker-Container zu erstellen, was wir im nächsten Abschnitt behandeln werden.

Erstellen und Verwalten von Docker-Containern: Ausführen, Stoppen und Überwachen von Containern

Nachdem wir nun grundlegende Kenntnisse über Docker-Images haben, wollen wir uns ansehen, wie Docker-Container erstellt und verwaltet werden.

Ausführen von Docker-Containern

Um einen neuen Container aus einem Docker-Image zu erstellen, können Sie den Befehl docker run verwenden. Um beispielsweise einen neuen Nginx-Container aus dem Image nginx:latest zu erstellen:

docker run -d -p 80:80 --name my-nginx-container nginx:latest

Dieser Befehl:

  • -d: Führt den Container im detachierten Modus (im Hintergrund) aus.
  • -p 80:80: Mapt Port 80 des Hosts auf Port 80 im Container.
  • --name my-nginx-container: Weist dem Container den Namen "my-nginx-container" zu.
  • nginx:latest: Verwendet das Image nginx:latest, um den Container zu erstellen.

Stoppen und Löschen von Containern

Um einen laufenden Container zu stoppen, verwenden Sie den Befehl docker stop:

docker stop my-nginx-container

Um einen gestoppten Container zu löschen, verwenden Sie den Befehl docker rm:

docker rm my-nginx-container

Überwachen von Containern

Sie können den Status Ihrer Container mit dem Befehl docker ps überwachen. Dieser zeigt eine Liste aller laufenden Container an:

docker ps

Um die Logs eines laufenden Containers anzuzeigen, verwenden Sie den Befehl docker logs:

docker logs my-nginx-container

Mit dem Befehl docker stats können Sie die Echtzeit-Ressourcenverwendung Ihrer Container einsehen:

docker stats my-nginx-container

Durch das Verständnis der Erstellung, Verwaltung und Überwachung von Docker-Containern können Sie Ihre Anwendungen effektiv mit der Docker-Plattform bereitstellen und verwalten.

Netzwerkverbindungen und Containerverbindungen: Ports freigeben, Container verknüpfen und Netzwerkmodi

Docker bietet ein flexibles Netzwerkssystem, das es Ihnen ermöglicht, Container untereinander sowie mit dem Hostsystem und externen Netzwerken zu verbinden und zu kommunizieren. In diesem Abschnitt werden wir die Netzwerkverwaltung in Docker untersuchen.

Ports freigeben

Wenn Sie einen Container ausführen, können Sie seine internen Ports mithilfe des Flags -p oder --publish dem Hostsystem freigeben. Dadurch können externe Systeme auf die im Container laufenden Dienste zugreifen.

Beispielsweise, um einen Nginx-Container auszuführen und Port 80 auf dem Hostsystem freizugeben:

docker run -d -p 80:80 nginx:latest

Dies ordnet Port 80 des Hostsystems Port 80 im Container zu.

Container verknüpfen

Docker ermöglicht es Ihnen auch, Container miteinander zu verknüpfen, sodass sie miteinander kommunizieren können. Dies ist nützlich, wenn Sie mehrere Container haben, die interagieren müssen, z. B. eine Webanwendung und eine Datenbank.

Um zwei Container zu verknüpfen, können Sie das Flag --link bei der Ausführung der Container verwenden:

docker run -d --name my-db-container postgres:latest
docker run -d --name my-app-container --link my-db-container:db my-app-image

In diesem Beispiel kann der Container my-app-container auf den Container my-db-container über den Hostnamen db zugreifen.

Netzwerkmodi

Docker unterstützt verschiedene Netzwerkmodi, die bestimmen, wie Container mit dem Netzwerk verbunden sind:

  1. Bridge: Dies ist der Standard-Netzwerkmodus, bei dem Container an ein virtuelles Bridge-Netzwerk angeschlossen sind und miteinander sowie mit dem Hostsystem kommunizieren können.
  2. Host: In diesem Modus teilt der Container die Netzwerkstapel des Hostsystems, wodurch die Netzwerkisolierung zwischen Container und Host effektiv aufgehoben wird.
  3. None: Dieser Modus deaktiviert die Netzwerkverbindung für den Container und isoliert ihn vom Netzwerk.
  4. Overlay: Dieser Modus ermöglicht es Containern, über mehrere Docker-Hosts hinweg zu kommunizieren und die Erstellung verteilter Anwendungen auf mehreren Hosts zu ermöglichen.

Sie können den Netzwerkmodus bei der Ausführung eines Containers mithilfe des Flags --network angeben:

docker run -d --network host nginx:latest

Durch das Verständnis der Netzwerkfunktionen von Docker können Sie Ihre Container effektiv miteinander sowie mit externen Systemen verbinden und kommunizieren.

Datenpersistenz mit Docker Volumes: Speichern und Verwalten von Daten in Containern

Standardmäßig sind Daten, die innerhalb eines Docker-Containers gespeichert werden, flüchtig, d. h. sie gehen verloren, wenn der Container gestoppt oder entfernt wird. Um Daten zu speichern, bietet Docker ein Feature namens Volumes, mit dem Sie ein Verzeichnis vom Hostsystem in den Container mounten können.

Was sind Docker Volumes?

Docker Volumes sind eine Möglichkeit, Daten außerhalb des Dateisystems des Containers zu speichern und zu verwalten. Volumes können verwendet werden, um Anwendungsdaten, Konfigurationsdateien oder andere Daten zu speichern, die über den Lebenszyklus eines Containers hinaus bestehen bleiben müssen.

Volumes können mit dem Befehl docker volume erstellt und verwaltet werden. Beispielsweise, um ein neues Volume zu erstellen:

docker volume create my-data-volume

Volumes in Containern mounten

Um ein Volume in einem Container zu mounten, können Sie das Flag -v oder --mount beim Ausführen des Befehls docker run verwenden. Beispielsweise, um einen Nginx-Container auszuführen und ein Volume auf das Verzeichnis /usr/share/nginx/html zu mounten:

docker run -d -p 80:80 -v my-data-volume:/usr/share/nginx/html nginx:latest

In diesem Beispiel wird das Volume my-data-volume auf das Verzeichnis /usr/share/nginx/html innerhalb des Containers gemountet. Alle in dieses Verzeichnis geschriebenen Daten werden im Volume gespeichert und bleiben bestehen, auch wenn der Container gestoppt oder entfernt wird.

Volumes verwalten

Sie können alle Volumes auf Ihrem System mit dem Befehl docker volume ls auflisten:

docker volume ls

Um die Details eines bestimmten Volumes zu untersuchen, können Sie den Befehl docker volume inspect verwenden:

docker volume inspect my-data-volume

Wenn Sie ein Volume nicht mehr benötigen, können Sie es mit dem Befehl docker volume rm entfernen:

docker volume rm my-data-volume

Durch die Verwendung von Docker Volumes können Sie sicherstellen, dass Ihre Anwendungsdaten über den Lebenszyklus einzelner Container hinaus bestehen bleiben, was die Verwaltung und Skalierung Ihrer Anwendungen vereinfacht.

Dockerfile und Bildoptimierung: Erstellung effizienter Docker-Images

Das Dockerfile ist die Grundlage für die Erstellung von Docker-Images. Es enthält die Anweisungen zur Erstellung eines Docker-Images, einschließlich des Basis-Images, des Anwendungscodes und aller notwendigen Abhängigkeiten. In diesem Abschnitt werden wir untersuchen, wie effiziente Dockerfiles geschrieben und Docker-Images optimiert werden können.

Verständnis von Dockerfiles

Ein Dockerfile ist eine Textdatei, die eine Reihe von Anweisungen zur Erstellung eines Docker-Images enthält. Jede Anweisung im Dockerfile entspricht einer Schicht im endgültigen Image. Hier ist ein Beispiel für ein Dockerfile:

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dieses Dockerfile erstellt ein neues Image basierend auf dem Basis-Image ubuntu:22.04, installiert Nginx, kopiert eine index.html-Datei in das Nginx-Webverzeichnis, exponiert Port 80 und setzt den Standardbefehl zum Starten des Nginx-Servers.

Optimierungsmethoden für Images

Um effiziente Docker-Images zu erstellen, können Sie die folgenden Optimierungsmethoden verwenden:

  1. Verwendung eines minimalen Basis-Images: Beginnen Sie mit einem minimalen Basis-Image, z. B. alpine oder scratch, um die Größe Ihres endgültigen Images zu reduzieren.
  2. Mehrstufige Builds nutzen: Verwenden Sie mehrstufige Builds, um die Build- und Laufzeitumgebungen zu trennen und die Größe des endgültigen Images zu reduzieren.
  3. Optimierung der Schicht-Caching: Ordnen Sie Ihre Dockerfile-Anweisungen so an, dass Sie das Docker-Schicht-Caching nutzen, wodurch der Build-Prozess deutlich beschleunigt werden kann.
  4. Unnötige Pakete vermeiden: Installieren Sie nur die Pakete und Abhängigkeiten, die für den Betrieb Ihrer Anwendung erforderlich sind, und entfernen Sie sie nach Verwendung.
  5. .dockerignore verwenden: Erstellen Sie eine .dockerignore-Datei, um unnötige Dateien und Verzeichnisse aus dem Build-Kontext auszuschließen und die Menge der Daten zu reduzieren, die an den Docker-Daemon gesendet werden müssen.
  6. Komprimierung von Build-Artefakten: Komprimieren Sie große Build-Artefakte, wie z. B. Quellcode oder Abhängigkeiten, bevor Sie sie in das Image kopieren.

Durch die Einhaltung dieser Best Practices können Sie effiziente und optimierte Docker-Images erstellen, die kleiner und schneller zu erstellen und bereitzustellen sind.

Docker Compose: Definition und Ausführung von Multi-Container-Anwendungen

Docker Compose ist ein Werkzeug, mit dem Sie Multi-Container-Anwendungen definieren und ausführen können. Es vereinfacht den Prozess der Verwaltung und Orchestrierung mehrerer Docker-Container, indem es eine deklarative Möglichkeit bietet, die Dienste, Netzwerke und Volumes der Anwendung zu definieren.

Was ist Docker Compose?

Docker Compose ist eine YAML-basierte Konfigurationsdatei, die die Dienste beschreibt, aus denen Ihre Anwendung besteht. Sie ermöglicht es Ihnen, die Beziehungen zwischen den verschiedenen Containern und deren Bereitstellung und Verwaltung zu definieren.

Hier ist ein Beispiel für eine docker-compose.yml-Datei, die eine einfache Webanwendung mit einem Webserver und einer Datenbank definiert:

version: "3"
services:
  web:
    build: .
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: postgres:12
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

Diese Konfiguration definiert zwei Dienste: web und db. Der Dienst web wird aus einem Dockerfile im aktuellen Verzeichnis erstellt und exponiert Port 80 auf dem Host. Der Dienst db verwendet das postgres:12-Image und richtet eine PostgreSQL-Datenbank mit einem bestimmten Datenbanknamen, Benutzer und Passwort ein. Außerdem wird ein Volume zur dauerhaften Speicherung der Datenbankdaten gemountet.

Verwendung von Docker Compose

Um Docker Compose zu verwenden, gehen Sie folgendermaßen vor:

  1. Erstellen Sie eine docker-compose.yml-Datei in Ihrem Projektverzeichnis.
  2. Definieren Sie die Dienste und ihre Konfigurationen in der YAML-Datei.
  3. Führen Sie den Befehl docker-compose up aus, um die Anwendung zu starten.
docker-compose up -d

Dies startet alle in der docker-compose.yml-Datei definierten Dienste im Hintergrund.

Sie können auch andere Docker Compose-Befehle verwenden, um Ihre Anwendung zu verwalten, z. B.:

  • docker-compose down: Stoppen und entfernen Sie die Container, Netzwerke und Volumes.
  • docker-compose ps: Listen Sie die laufenden Container auf.
  • docker-compose logs: Zeigen Sie die Logs der laufenden Container an.

Mit Docker Compose können Sie komplexe, Multi-Container-Anwendungen einfach verwalten und bereitstellen, was es zu einem leistungsstarken Werkzeug in Ihrem Docker-Toolset macht.

Zusammenfassung

In diesem Tutorial haben Sie die wesentlichen Unterschiede und Beziehungen zwischen Docker-Images und -Containern kennengelernt. Sie verstehen nun, wie Docker-Images erstellt, gespeichert und heruntergeladen werden, sowie wie Docker-Container erstellt, ausgeführt und verwaltet werden. Sie haben außerdem Netzwerke, Volumes und Docker Compose erkundet, um Multi-Container-Anwendungen zu erstellen und bereitzustellen. Mit diesem Wissen können Sie die Leistungsfähigkeit von Docker effektiv nutzen, um Ihre Anwendungsbereitstellungs- und Verwaltungsworkflows zu optimieren.