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.yml
Datei 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-server
und den zweiten, node-app
und Sie möchten, dass diese mit dem Dockerfile
in 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.yml
Datei möchten Sie also die erste Zeile folgendermaßen beginnen:
version: '3'
Dadurch wird Docker mitgeteilt, welche Version docker-compose
Sie 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-compose
in 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 8081
auf meinem lokalen Computer 8081
dem 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.yml
Datei 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.yml
fü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-server
diese Verbindung sucht, und diese Verbindung zu diesem laufenden Container umleiten.
Die ganze Zeit Dockerfile
enthä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 up
und Sie müssen kein Image angeben, da Docker im aktuellen Arbeitsverzeichnis nach einem sucht docker-compose.yml
Datei innerhalb von dort.
Früher docker-compose.yml
mussten wir uns mit zwei separaten Befehlen von docker build .
und befassen docker run myimage
, aber in der docker-compose
Welt, 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-compose
erleichtert 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 -d
und sie stoppen docker-compose down
.