

Bild vom Autor
# Einführung
Docker hat die Artwork und Weise, wie wir Anwendungen erstellen und bereitstellen, vereinfacht. Aber wenn Sie anfangen Docker lernenkann die Terminologie oft verwirrend sein. Sie werden wahrscheinlich Begriffe wie „Bilder“, „Container“ und „Volumes“ hören, ohne wirklich zu verstehen, wie sie zusammenpassen. Dieser Artikel hilft Ihnen, die wichtigsten Docker-Konzepte zu verstehen, die Sie kennen müssen.
Fangen wir an.
# 1. Docker-Picture
Ein Docker-Picture ist ein Artefakt, das enthält alles Ihre Anwendung muss ausgeführt werden: Code, Laufzeit, Bibliotheken, Umgebungsvariablen und Konfigurationsdateien.
Bilder sind unveränderlich. Sobald Sie ein Bild erstellt haben, ändert es sich nicht. Dies stellt sicher, dass Ihre Anwendung auf Ihrem Laptop computer, dem Pc Ihres Kollegen und in der Produktion auf die gleiche Weise läuft, wodurch umgebungsspezifische Fehler vermieden werden.
So erstellen Sie ein Picture aus einer Docker-Datei. Eine Docker-Datei ist ein Rezept, das definiert, wie Sie das Picture erstellen:
docker construct -t my-python-app:1.0 .
Der -t Flag markiert Ihr Bild mit einem Namen und einer Model. Der . weist Docker an, im aktuellen Verzeichnis nach einer Docker-Datei zu suchen. Nach der Erstellung wird dieses Picture zu einer wiederverwendbaren Vorlage für Ihre Anwendung.
# 2. Docker-Container
Ein Container ist das, was Sie erhalten, wenn Sie ein Picture ausführen. Es handelt sich um eine isolierte Umgebung, in der Ihre Anwendung tatsächlich ausgeführt wird.
docker run -d -p 8000:8000 my-python-app:1.0
Der -d Flag führt den Container im Hintergrund aus. Der -p 8000:8000 Ordnet Port 8000 auf Ihrem Host Port 8000 im Container zu, sodass Ihre App unter localhost:8000 zugänglich ist.
Sie können mehrere Container mit demselben Picture ausführen. Sie agieren unabhängig. Auf diese Weise können Sie verschiedene Versionen gleichzeitig testen oder horizontal skalieren, indem Sie zehn Kopien derselben Anwendung ausführen.
Behälter sind leicht. Im Gegensatz zu virtuellen Maschinen booten sie kein vollständiges Betriebssystem. Sie starten in Sekundenschnelle und teilen sich den Kernel des Hosts.
# 3. Docker-Datei
Eine Docker-Datei enthält Anweisungen zum Erstellen eines Photographs. Dabei handelt es sich um eine Textdatei, die Docker genau mitteilt, wie Ihre Anwendungsumgebung einzurichten ist.
Hier ist eine Docker-Datei für eine Flask-Anwendung:
FROM python:3.11-slim
WORKDIR /app
COPY necessities.txt .
RUN pip set up --no-cache-dir -r necessities.txt
COPY . .
EXPOSE 8000
CMD ("python", "app.py")
Lassen Sie uns jede Anweisung aufschlüsseln:
FROM python:3.11-slim– Beginnen Sie mit einem Foundation-Picture, auf dem Python 3.11 installiert ist. Die Slim-Variante ist kleiner als das Standardbild.WORKDIR /app— Legen Sie das Arbeitsverzeichnis auf /app fest. Alle nachfolgenden Befehle werden von hier aus ausgeführt.COPY necessities.txt .— Kopieren Sie zunächst nur die Anforderungsdatei, noch nicht den gesamten Code.RUN pip set up --no-cache-dir -r necessities.txt— Installieren Sie Python-Abhängigkeiten. Das Flag –no-cache-dir hält die Bildgröße kleiner.COPY . .— Kopieren Sie nun den Relaxation Ihres Anwendungscodes.EXPOSE 8000– Dokumentieren Sie, dass die App Port 8000 verwendet.CMD ("python", "app.py")— Definieren Sie den Befehl, der beim Begin des Containers ausgeführt werden soll.
Die Reihenfolge dieser Anweisungen ist wichtig dafür, wie lange Ihre Builds dauern. Deshalb müssen wir die Ebenen verstehen.
# 4. Bildebenen
Jede Anweisung in einer Docker-Datei erstellt eine neue Ebene. Diese Schichten werden übereinander gestapelt, um das endgültige Bild zu ergeben.
Docker speichert jede Ebene zwischen. Wenn Sie ein Picture neu erstellen, prüft Docker, ob jede Ebene neu erstellt werden muss. Wenn sich nichts geändert hat, wird die zwischengespeicherte Ebene wiederverwendet, anstatt sie neu zu erstellen.
Deshalb kopieren wir necessities.txt bevor Sie die gesamte Anwendung kopieren. Ihre Abhängigkeiten ändern sich seltener als Ihr Code. Wenn Sie ändern app.pyDocker verwendet die zwischengespeicherte Ebene, die Abhängigkeiten installiert hat, wieder und erstellt die Ebenen erst nach der Codekopie neu.
Hier ist die Ebenenstruktur aus unserem Dockerfile:
- Foundation-Python-Picture (
FROM) - Arbeitsverzeichnis festlegen (
WORKDIR) - Kopie
necessities.txt(COPY) - Abhängigkeiten installieren (
RUN pip set up) - Anwendungscode kopieren (
COPY) - Metadaten zum Port (
EXPOSE) - Standardbefehl (
CMD)
Wenn Sie nur Ihren Python-Code ändern, erstellt Docker nur die Ebenen 5–7 neu. Die Schichten 1–4 stammen aus dem Cache, wodurch Builds viel schneller werden. Das Verständnis der Ebenen hilft Ihnen Schreiben Sie effiziente Docker-Dateien. Platzieren Sie häufig wechselnde Dateien am Ende und stabile Abhängigkeiten am Anfang.
# 5. Docker-Volumes
Container sind temporär. Wenn Sie einen Container löschen, verschwindet alles darin, einschließlich der von Ihrer Anwendung erstellten Daten.
Docker-Volumes dieses Downside lösen. Dabei handelt es sich um Verzeichnisse, die außerhalb des Container-Dateisystems vorhanden sind und nach dem Entfernen des Containers bestehen bleiben.
docker run -d
-v postgres-data:/var/lib/postgresql/information
postgres:15
Dadurch wird ein benanntes Quantity mit dem Namen erstellt postgres-data und montiert es an /var/lib/postgresql/information im Inneren des Behälters. Ihre Datenbankdateien überstehen Container-Neustarts und -Löschungen.
Sie können auch Verzeichnisse von Ihrem Host-Rechner mounten, was während der Entwicklung nützlich ist:
docker run -d
-v $(pwd):/app
-p 8000:8000
my-python-app:1.0
Dadurch wird Ihr aktuelles Verzeichnis im Container unter bereitgestellt /app. Änderungen, die Sie an Dateien auf Ihrem Host vornehmen, werden sofort im Container angezeigt, sodass eine Dwell-Entwicklung möglich ist, ohne dass das Picture neu erstellt werden muss.
Es gibt drei Arten von Halterungen:
- Benannte Bände (
postgres-data:/path) – Von Docker verwaltet, am besten für Produktionsdaten - Reittiere binden (
/host/path:/container/path) – Hängen Sie ein beliebiges Hostverzeichnis ein, intestine für die Entwicklung - tmpfs wird bereitgestellt – Daten nur im Speicher speichern, nützlich für temporäre Dateien
# 6. Docker-Hub
Docker-Hub ist ein öffentliches Register, in dem Menschen Docker-Photographs teilen. Wenn du schreibst FROM python:3.11-slimDocker ruft dieses Picture vom Docker Hub ab.
Sie können nach Bildern suchen:
Und ziehen Sie sie auf Ihre Maschine:
docker pull redis:7-alpine
Sie können auch Ihre eigenen Bilder pushen, um sie mit anderen zu teilen oder auf Servern bereitzustellen:
docker tag my-python-app:1.0 username/my-python-app:1.0
docker push username/my-python-app:1.0
Docker Hub hostet offizielle Photographs für beliebte Software program wie PostgreSQL, Redis, Nginx, Pythonund Tausende mehr. Diese werden von den Softwareentwicklern gepflegt und folgen den Finest Practices.
Für personal Projekte können Sie personal Repositorys auf Docker Hub erstellen oder different Registrierungen wie verwenden Amazon Elastic Container Registry (ECR), Google Container Registry (GCR)oder Azure Container Registry (ACR).
# 7. Docker Compose
Echte Anwendungen benötigen mehrere Dienste. Eine typische Internet-App verfügt über eine Python Backend, a PostgreSQL Datenbank, a Redis-Cacheund vielleicht ein Arbeitsprozess.
Docker Compose können Sie alle diese Dienste in einem einzigen definieren Noch eine weitere Auszeichnungssprache (YAML) ablegen und gemeinsam verwalten.
Erstellen Sie eine docker-compose.yml Datei:
model: '3.8'
companies:
internet:
construct: .
ports:
- "8000:8000"
setting:
- DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
volumes:
- .:/app
db:
picture: postgres:15-alpine
volumes:
- postgres-data:/var/lib/postgresql/information
setting:
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=myapp
cache:
picture: redis:7-alpine
volumes:
postgres-data:
Starten Sie nun Ihren gesamten Anwendungsstapel mit einem Befehl:
Dadurch werden drei Container gestartet: internet, dbUnd cache. Docker Compose kümmert sich automatisch um die Vernetzung: Der Webdienst kann die Datenbank unter dem Hostnamen erreichen db und Redis unter Hostname cache.
Um alles zu stoppen, führen Sie Folgendes aus:
So erstellen Sie es nach Codeänderungen neu:
docker-compose up -d --build
Docker Compose ist für Entwicklungsumgebungen unerlässlich. Anstatt PostgreSQL und Redis auf Ihrem Pc zu installieren, führen Sie sie mit einem Befehl in Containern aus.
# 8. Containernetzwerke
Wenn Sie mehrere Container ausführen, müssen diese miteinander kommunizieren. Docker erstellt virtuelle Netzwerke, die Container verbinden.
Standardmäßig erstellt Docker Compose ein Netzwerk für alle in Ihrem definierten Dienste docker-compose.yml. Container verwenden Dienstnamen als Hostnamen. In unserem Beispiel stellt der Webcontainer über PostgreSQL eine Verbindung her db:5432 Weil db ist der Dienstname.
Sie können benutzerdefinierte Netzwerke auch manuell erstellen:
docker community create my-app-network
docker run -d --network my-app-network --name api my-python-app:1.0
docker run -d --network my-app-network --name cache redis:7
Nun die api Der Container kann Redis unter erreichen cache:6379. Docker stellt mehrere Netzwerktreiber bereit, von denen Sie die folgenden häufig verwenden werden:
- Bridge – Standardnetzwerk für Container auf einem einzelnen Host
- host – Container nutzt das Netzwerk des Hosts direkt (keine Isolation)
- none – Container hat keinen Netzwerkzugriff
Netzwerke sorgen für Isolation. Container in verschiedenen Netzwerken können nur kommunizieren, wenn sie explizit verbunden sind. Dies ist aus Sicherheitsgründen nützlich, da Sie Ihre Frontend-, Backend- und Datenbanknetzwerke trennen können.
Um alle Netzwerke anzuzeigen, führen Sie Folgendes aus:
Führen Sie Folgendes aus, um ein Netzwerk zu überprüfen und festzustellen, welche Container verbunden sind:
docker community examine my-app-network
# 9. Umgebungsvariablen und Docker-Geheimnisse
Die Hardcoding-Konfiguration erfordert Probleme. Ihr Datenbankkennwort sollte in der Entwicklung und Produktion nicht dasselbe sein. Ihre API-Schlüssel sollten auf keinen Fall in Ihrer Codebasis vorhanden sein.
Docker erledigt dies durch Umgebungsvariablen. Übergeben Sie sie zur Laufzeit mit dem -e oder --env Flag, und Ihr Container erhält die Konfiguration, die er benötigt, ohne Werte in das Picture einzubacken.
Docker Compose macht dies sauberer. Zeigen Sie auf einen .env Datei und halten Sie Ihre Geheimnisse außerhalb der Versionskontrolle. Einwechseln .env.manufacturing bei der Bereitstellung oder definieren Sie Umgebungsvariablen direkt in Ihrer Compose-Datei, wenn diese nicht vertraulich sind.
Docker-Geheimnisse Führen Sie dies weiter für Produktionsumgebungen aus, insbesondere im Schwarmmodus. Anstelle von Umgebungsvariablen – welche dürfen werden in Protokollen oder Prozesslisten angezeigt – Geheimnisse werden während der Übertragung und im Ruhezustand verschlüsselt und dann als Dateien im Container bereitgestellt. Nur Dienste, die sie benötigen, erhalten Zugriff. Sie sind für Passwörter, Token, Zertifikate und alles andere konzipiert, dessen Verlust katastrophale Folgen hätte, wenn es durchsickern würde.
Das Muster ist einfach: Trennen Sie den Code von der Konfiguration. Verwenden Sie Umgebungsvariablen für die Standardkonfiguration und Geheimnisse für vertrauliche Daten.
# 10. Containerregister
Docker Hub funktioniert intestine für öffentliche Bilder, Sie möchten jedoch nicht, dass die Anwendungsbilder Ihres Unternehmens öffentlich verfügbar sind. Eine Container-Registrierung ist ein privater Speicher für Ihre Docker-Photographs. Zu den beliebten Optionen gehören:
Für jede der oben genannten Optionen können Sie ein ähnliches Verfahren zum Veröffentlichen, Abrufen und Verwenden von Bildern anwenden. Mit ECR werden Sie beispielsweise Folgendes tun.
Ihr lokaler Rechner bzw Kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD) Das System weist ECR zunächst seine Identität nach. Dadurch kann Docker sicher mit Ihrer privaten Picture-Registrierung statt mit einer öffentlichen interagieren. Das lokal erstellte Docker-Picture erhält einen vollständig qualifizierten Namen, der Folgendes enthält:
- Die Adresse der AWS-Kontoregistrierung
- Der Repository-Title
- Die Bildversion
Dieser Schritt teilt Docker mit, wo das Bild in ECR gespeichert wird. Das Bild wird dann in das personal ECR-Repository hochgeladen. Nach dem Push wird das Picture zentral gespeichert, versioniert und steht autorisierten Systemen zur Verfügung.
Produktionsserver authentifizieren sich mit ECR und laden das Picture aus der privaten Registrierung herunter. Dadurch bleibt Ihre Bereitstellungspipeline schnell und sicher. Anstatt Photographs auf Produktionsservern zu erstellen (langsam und erfordert Zugriff auf den Quellcode), erstellen Sie sie einmal, übertragen sie in die Registrierung und laden sie auf allen Servern herunter.
Viele CI/CD-Systeme lassen sich in Containerregister integrieren. Dein GitHub-Aktionen Der Workflow erstellt das Picture, überträgt es an ECR und Ihr Kubernetes-Cluster ruft es automatisch ab.
# Zusammenfassung
Diese zehn Konzepte bilden die Grundlage von Docker. So verbinden sie sich in einem typischen Arbeitsablauf:
- Schreiben Sie eine Docker-Datei mit Anweisungen für Ihre App und erstellen Sie ein Picture aus der Docker-Datei
- Führen Sie einen Container aus dem Picture aus
- Verwenden Sie Volumes, um Daten beizubehalten
- Legen Sie Umgebungsvariablen und Geheimnisse für die Konfiguration und vertrauliche Informationen fest
- Erstellen Sie eine
docker-compose.ymlfür Multi-Service-Apps und lassen Sie Docker-Netzwerke Ihre Container verbinden - Schieben Sie Ihr Picture in eine Registrierung, ziehen Sie es herunter und führen Sie es überall aus
Beginnen Sie mit der Containerisierung eines einfachen Python-Skripts. Fügen Sie Abhängigkeiten mit a hinzu necessities.txt Datei. Führen Sie dann eine Datenbank mit Docker Compose ein. Jeder Schritt baut auf den vorherigen Konzepten auf. Docker ist nicht kompliziert, wenn Sie diese Grundlagen verstanden haben. Es handelt sich lediglich um ein Software, das Anwendungen konsistent verpackt und in isolierten Umgebungen ausführt.
Viel Spaß beim Entdecken!
Bala Priya C ist ein Entwickler und technischer Redakteur aus Indien. Sie arbeitet gerne an der Schnittstelle von Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Zu ihren Interessen- und Fachgebieten gehören DevOps, Datenwissenschaft und Verarbeitung natürlicher Sprache. Sie liebt es zu lesen, zu schreiben, zu programmieren und Kaffee zu trinken! Derzeit arbeitet sie daran, zu lernen und ihr Wissen mit der Entwickler-Group zu teilen, indem sie Tutorials, Anleitungen, Meinungsbeiträge und mehr verfasst. Bala erstellt außerdem ansprechende Ressourcenübersichten und Programmier-Tutorials.
