Was ist Docker Compose?
Wenn Ihre Docker-Anwendung mehr als einen Container enthält (z. B. einen Webserver und eine Datenbank, die in separaten Containern ausgeführt werden), ist das Erstellen, Ausführen und Verbinden der Container aus separaten Dockerfiles umständlich und zeitaufwändig. Docker Compose löst dieses Problem, indem es Ihnen ermöglicht, eine YAML-Datei zu verwenden, um Multi-Container-Apps zu definieren. Sie können beliebig viele Container konfigurieren, wie sie aufgebaut und verbunden werden sollen und wo Daten gespeichert werden sollen. Wenn die YAML-Datei vollständig ist, können Sie einen einzigen Befehl ausführen, um alle Container zu erstellen, auszuführen und zu konfigurieren.
Diese Anleitung erklärt, wie die docker-compose.yml
Datei ist organisiert und zeigt, wie man sie verwendet, um mehrere grundlegende App-Konfigurationen zu erstellen.
Hinweis Im Allgemeinen werden die Container in einer Anwendung, die mit Docker Compose erstellt wurde, alle auf demselben Host ausgeführt. Die Verwaltung von Containern, die auf verschiedenen Hosts ausgeführt werden, erfordert normalerweise ein zusätzliches Tool, z. B. Docker Swarm oder Kubernetes.
Bevor Sie beginnen
Installieren Sie Docker CE
Sie benötigen einen Linode mit installiertem Docker CE, um den Schritten in dieser Anleitung zu folgen.
Um Docker CE (Community Edition) zu installieren, befolgen Sie die Anweisungen in einer der folgenden Anleitungen:
-
Installieren und Verwenden von Docker unter Ubuntu und Debian
-
Installieren und Verwenden von Docker unter CentOS und Fedora
Vollständige Anweisungen zu noch mehr Linux-Distributionen finden Sie im Abschnitt „Install Docker Engine“ der offiziellen Docker-Dokumentation.
Installieren Sie Docker Compose
-
Laden Sie die neueste Version von Docker Compose herunter. Sehen Sie auf der Releases-Seite nach und ersetzen Sie
1.25.4
im folgenden Befehl mit der als Neueste Version gekennzeichneten Version :sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
Dateiberechtigungen festlegen:
sudo chmod +x /usr/local/bin/docker-compose
Grundlegende Verwendung
In diesem Abschnitt wird eine Docker Compose-Beispieldatei aus der offiziellen Docker-Dokumentation überprüft.
-
Öffnen Sie
docker-compose.yml
in einem Texteditor und fügen Sie den folgenden Inhalt hinzu:- Datei:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
version: '3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:
-
Speichern Sie die Datei und führen Sie Docker Compose aus demselben Verzeichnis aus:
docker-compose up -d
Dadurch wird die
db
erstellt und ausgeführt undwordpress
Behälter. Genauso wie beim Ausführen eines einzelnen Containers mitdocker run
, das-d
Flag startet die Container im getrennten Modus. -
Sie haben jetzt einen WordPress-Container und einen MySQL-Container, die auf Ihrem Host ausgeführt werden. Navigieren Sie zu
192.0.8.1:8000/wordpress
in einem Webbrowser, um Ihre neu installierte WordPress-Anwendung anzuzeigen. Sie können auchdocker ps
verwenden um die resultierende Konfiguration weiter zu untersuchen:docker ps
-
Halten Sie an und entfernen Sie die Behälter:
docker-compose down
Dateisyntax erstellen
Eine docker-compose.yml
Datei ist in vier Abschnitte gegliedert:
Richtlinie | Verwenden |
---|---|
Version | Gibt die Syntaxversion der Compose-Datei an. In diesem Handbuch wird durchgehend Version 3 verwendet. |
Dienste | In Docker ist ein Service die Bezeichnung für einen „Container in der Produktion“. Dieser Abschnitt definiert die Container, die als Teil der Docker Compose-Instanz gestartet werden. |
Netzwerke | Dieser Abschnitt wird verwendet, um das Netzwerk für Ihre Anwendung zu konfigurieren. Sie können die Einstellungen des Standardnetzwerks ändern, eine Verbindung zu einem externen Netzwerk herstellen oder App-spezifische Netzwerke definieren. |
Volumen | Hängt einen verknüpften Pfad auf dem Hostcomputer ein, der vom Container verwendet werden kann. |
Der Großteil dieses Leitfadens konzentriert sich auf die Einrichtung von Containern mithilfe der services
Sektion. Hier sind einige der allgemeinen Direktiven, die zum Einrichten und Konfigurieren von Containern verwendet werden:
Richtlinie | Verwenden |
---|---|
Bild | Legt das Image fest, das zum Erstellen des Containers verwendet wird. Bei Verwendung dieser Anweisung wird davon ausgegangen, dass das angegebene Image bereits entweder auf dem Host oder onDocker Hub vorhanden ist. |
erstellen | Diese Direktive kann anstelle von image verwendet werden . Gibt den Speicherort der Docker-Datei an, die zum Erstellen dieses Containers verwendet wird. |
db | Im Fall der Dockercompose-Beispieldatei db ist eine Variable für den Container, den Sie gerade definieren. |
Neustart | Teilt dem Container mit, dass er neu starten soll, wenn das System neu gestartet wird. |
Volumen | Hängt einen verknüpften Pfad auf dem Hostcomputer ein, der vom Container verwendet werden kann |
Umgebung | Definieren Sie Umgebungsvariablen, die an den Docker-Ausführungsbefehl übergeben werden sollen. |
abhängig_von | Legt einen Dienst als Abhängigkeit für den aktuellen blockdefinierten Container fest |
Port | Ordnet einen Port vom Container dem Host auf folgende Weise zu:host:container |
Links | Verknüpfen Sie diesen Dienst mit anderen Diensten in der Docker Compose-Datei, indem Sie hier ihre Namen angeben. |
Viele andere Konfigurationsanweisungen sind verfügbar. Weitere Informationen finden Sie in der Referenz zum Erstellen von Dateien.
Achtung Das Beispieldocker-compose.yml
oben verwendet dieenvironment
Anweisung zum Speichern von MySQL-Benutzerkennwörtern direkt in der YAML-Datei, die als Umgebungsvariablen in den Container importiert werden sollen. Dies wird für vertrauliche Informationen in Produktionsumgebungen nicht empfohlen. Stattdessen können sensible Informationen in einer separaten.env
gespeichert werden Datei (die nicht in die Versionskontrolle eingecheckt oder veröffentlicht wird) und auf die innerhalb vondocker-compose.yml
zugegriffen wird indem Sie dieenv_file
verwenden Direktive.
Eine Anwendung von Grund auf neu erstellen
Erstellen Sie eine docker-compose.yml
Datei Abschnitt für Abschnitt, um die Schritte zum Erstellen einer Anwendung mit mehreren Containern zu veranschaulichen.
Einen einfachen Dienst definieren:
-
Erstellen Sie eine neue
docker-compose.yml
in einem Texteditor und fügen Sie den folgenden Inhalt hinzu:- Datei:docker -compose.yml
1 2 3 4 5 6 7 8
version: '3' services: distro: image: alpine restart: always container_name: Alpine_Distro entrypoint: tail -f /dev/null
Jeder Eintrag in den
services
-Abschnitt erstellt einen separaten Container, wenndocker-compose
es läuft. An dieser Stelle enthält der Abschnitt einen einzelnen Container, der auf der offiziellen Alpine-Verteilung basiert:- Der
restart
wird verwendet, um anzugeben, dass der Container immer neu gestartet werden soll (z. B. nach einem Absturz oder Systemneustart). - Der
container_name
Direktive wird verwendet, um den zufällig generierten Containernamen zu überschreiben und durch einen Namen zu ersetzen, den man sich leichter merken und mit dem man besser arbeiten kann. - Docker-Container werden standardmäßig beendet, wenn kein Prozess auf ihnen ausgeführt wird.
tail -f
ist ein fortlaufender Prozess, sodass er auf unbestimmte Zeit ausgeführt wird und verhindert, dass der Container angehalten wird. Der standardmäßigeentrypoint
wird überschrieben, um den Container am Laufen zu halten.
-
Rufen Sie Ihren Container auf:
docker-compose up -d
-
Überprüfen Sie den Status Ihres Containers:
docker ps
Die Ausgabe sollte wie folgt aussehen:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 967013c36a27 alpine "tail -f /dev/null" 3 seconds ago Up 2 seconds Alpine_Distro
-
Bringen Sie den Container herunter:
docker-compose down
Zusätzliche Dienste hinzufügen
Von hier aus können Sie mit dem Aufbau eines Container-Ökosystems beginnen. Sie können festlegen, wie sie zusammenarbeiten und kommunizieren.
-
Öffnen Sie
docker-compos.yml
erneut und fügen Sie diedatabase
hinzu Dienst unten:- Datei:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432"
Es sind jetzt zwei Dienste definiert:
- Distribution
- Datenbank
Der Distro-Dienst ist derselbe wie zuvor. Der Datenbankserver enthält die Anweisungen für einen Postgres-Container und die Anweisungen:
volumes: - ../dumps:/tmp
undports:-"5432:5432"
, ordnet die erste Direktive den containerd/dumps
zu Ordner in unseren lokalen/tmp
Mappe. Die zweite Direktive ordnet die Container-Ports den Ports des lokalen Hosts zu. -
Überprüfen Sie die laufenden Container:
docker ps
Dieser Befehl zeigt den Status der Container, die Portzuordnung, die Namen und den letzten Befehl, der auf ihnen ausgeführt wird. Es ist wichtig zu beachten, dass der Postgres-Container „docker-entrypoint…“ lautet. unter Befehlen. Das PostgresDocker Entrypoint-Skript ist das Letzte, was gestartet wird, wenn der Container gestartet wird.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecc37246f6ef postgres:latest "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp postgres_db 35dab3e712d6 alpine "tail -f /dev/null" About a minute ago Up About a minute Alpine_Distro
-
Bringen Sie beide Container herunter:
docker-compose down
Fügen Sie einen nginx-Dienst hinzu
-
Fügen Sie einen Nginx-Container hinzu, damit Ihre Anwendung Websites bedienen kann:
- Datei:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro
Diese
docker-compose
Datei enthält einige neue Direktiven:environment und Links . Die erste Direktive legt Optionen auf Laufzeitebene innerhalb des Containers fest.links
erstellt ein Abhängigkeitsnetzwerk zwischen den Containern. Der nginx-Container hängt von den anderen beiden zur Ausführung ab. Außerdem sind die entsprechenden Container unter einem durch den Alias angegebenen Hostnamen erreichbar. In diesem Fall pingen Siedb
aus demweb
Container erreicht diedatabase
Service. Dabei brauchen Sie dielinks
nicht Anweisung, damit die Container miteinander kommunizieren können,links
kann als Ausfallsicherung beim Starten der Docker-Compose-Anwendung dienen. -
Starten Sie Docker Compose und überprüfen Sie den Containerstatus:
docker-compose up -d docker ps
Die Ausgabe sollte ähnlich aussehen wie:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 55d573674e49 nginx:latest "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp nginx ad9e48b2b82a alpine "tail -f /dev/null" 3 minutes ago Up 3 minutes Alpine_Distro 736cf2f2239e postgres:latest "docker-entrypoint..." 3 minutes ago Up 3 minutes 0.0.0.0:5432->5432/tcp postgres_db
-
Testen Sie nginx, indem Sie zur öffentlichen IP-Adresse Ihres Linode navigieren, Port
8080
in einem Browser (zum Beispiel192.0.2.0:8080
). Sie sollten die standardmäßige Nginx-Zielseite angezeigt sehen.
Persistente Datenspeicherung
Es wird nicht empfohlen, PostgreSQL-Daten direkt in einem Container zu speichern. Docker-Container sollen als flüchtig behandelt werden:Die Container Ihrer Anwendung werden von Grund auf neu erstellt, wenn docker-compose up
ausgeführt wird und zerstört, wenn docker-compose down
ausgeführt wird . Darüber hinaus führt jeder unerwartete Absturz oder Neustart Ihres Systems dazu, dass alle in einem Container gespeicherten Daten verloren gehen.
Aus diesen Gründen ist es wichtig, auf dem Host ein persistentes Volume einzurichten, das die Datenbankcontainer zum Speichern ihrer Daten verwenden.
-
Fügen Sie ein
volumes
hinzu Abschnitt zudocker-compose.yml
und bearbeiten Sie diedatabase
Dienst, um auf das Volumen zu verweisen:- Datei:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - data:/var/lib/postgresql ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro volumes: data: external: true
-
external: true
weist Docker Compose an, ein bereits vorhandenes externes Datenvolume zu verwenden. Wenn kein Volume mit dem Namendata
vorhanden ist, führt das Starten der Anwendung zu einem Fehler. Volume erstellen:docker volume create --name=data
-
Starten Sie die Anwendung wie zuvor:
docker-compose up -d
Nächste Schritte
Docker Compose ist ein leistungsstarkes Tool zum Orchestrieren von Gruppen von Containern, die zusammenarbeiten können. Dinge wie eine App oder eine Entwicklungsumgebung können Docker-compose nutzen. Das Ergebnis ist eine modulare und konfigurierbare Umgebung, die überall eingesetzt werden kann.