Docker-Compose ist vorhanden, damit Sie nicht jede Menge Befehle schreiben müssen, die Sie mit Docker-CLI ausführen müssten.
Docker-Compose macht es auch einfach, mehrere Container gleichzeitig zu starten und sie automatisch mit einer Art Netzwerk zu verbinden.
Der Zweck von Docker-Compose besteht darin, als Docker-CLI zu fungieren, aber mehrere Befehle viel schneller auszugeben.
Um Docker-Compose verwenden zu können, müssen Sie die zuvor ausgeführten Befehle in eine docker-compose.ymlDatei codieren .
Sie werden sie nicht nur kopieren, sondern in die yaml-Datei einfügen, es gibt eine spezielle Syntax.
Einmal erstellt, müssen Sie es der Docker-Compose-CLI zuführen. Es liegt an der CLI, die Datei zu analysieren und alle verschiedenen Container mit der von uns angegebenen korrekten Konfiguration zu erstellen.
Sie haben also separate Container, zum Beispiel einen redis-serverund den zweiten, node-appund Sie möchten, dass diese mit dem Dockerfilein Ihrem aktuellen Verzeichnis erstellt werden.
Nachdem Sie diesen Container erstellt haben, ordnen Sie außerdem einen Port vom Container dem lokalen Computer zu, um auf alles zuzugreifen, was darin ausgeführt wird.
Für Ihre docker-compose.ymlDatei möchten Sie also die erste Zeile folgendermaßen beginnen:
version: '3'
Dadurch wird Docker mitgeteilt, welche Version docker-composeSie verwenden möchten. Danach müssen Sie hinzufügen:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Bitte beachten Sie die Einrückung, sehr wichtig. Beachten Sie auch, dass ich für einen Dienst ein Bild greife, für einen anderen Dienst jedoch docker-composein das aktuelle Verzeichnis schaue, um das Bild zu erstellen, das für den zweiten Container verwendet wird.
Anschließend möchten Sie alle verschiedenen Ports angeben, die für diesen Container geöffnet werden sollen.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Bitte beachten Sie den Bindestrich. Ein Bindestrich in einer Yaml-Datei gibt an, wie wir ein Array angeben. In diesem Beispiel ordne ich 8081auf meinem lokalen Computer 8081dem Container Folgendes zu:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Der erste Port ist also Ihr lokaler Computer, und der andere ist der Port auf dem Container. Sie können auch zwischen den beiden unterscheiden, um Verwechslungen wie folgt zu vermeiden:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Wenn Sie Ihre docker-compose.ymlDatei so entwickeln, werden diese Container im Wesentlichen im selben Netzwerk erstellt und sie haben freien Zugriff, um nach Belieben miteinander zu kommunizieren und so viele Informationen auszutauschen, wie sie möchten.
Wenn die beiden Container mit erstellt werden docker-compose, benötigen wir keine Portdeklarationen.
In meinem Beispiel müssen wir eine Codekonfiguration in der Nodejs-App vornehmen, die ungefähr so aussieht:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Ich verwende dieses Beispiel oben, um Sie darauf aufmerksam zu machen, dass Sie möglicherweise zusätzlich zu der docker-compose.ymlfür Ihr Projekt spezifischen Datei eine bestimmte Konfiguration vornehmen müssen .
Wenn Sie jemals mit einer Nodejs-App und Redis arbeiten, möchten Sie sicherstellen, dass Sie über den Standardport informiert sind, den Nodejs verwendet, und ich werde Folgendes hinzufügen:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Docker wird also feststellen, dass die Node-App redis-serverdiese Verbindung sucht, und diese Verbindung zu diesem laufenden Container umleiten.
Die ganze Zeit Dockerfileenthält das einzige Folgendes:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Während Sie also zuvor ausführen müssen docker run myimage, um eine Instanz aller Container oder Dienste in der Datei zu erstellen, können Sie diese stattdessen ausführen, docker-compose upund Sie müssen kein Image angeben, da Docker im aktuellen Arbeitsverzeichnis nach einem sucht docker-compose.ymlDatei innerhalb von dort.
Früher docker-compose.ymlmussten wir uns mit zwei separaten Befehlen von docker build .und befassen docker run myimage, aber in der docker-composeWelt, wenn Sie Ihre Bilder neu erstellen möchten, schreiben Sie docker-compose up --build. Dadurch wird Docker angewiesen, die Container erneut zu starten, sie jedoch neu zu erstellen, um die neuesten Änderungen zu erhalten.
Dies docker-composeerleichtert das Arbeiten mit mehreren Containern. Wenn Sie das nächste Mal diese Gruppe von Containern im Hintergrund starten müssen, können Sie dies tun docker-compose up -dund sie stoppen docker-compose down.