Implementierung der Docker Compose-Mehrcontainerbereitstellung

Implementierung der Docker Compose-Mehrcontainerbereitstellung

1. WordPress-Bereitstellung

Hier nehmen wir die Bereitstellung von WordPress als Beispiel, um Docker Compose vorzustellen. Die Bereitstellung von WordPress erfordert die Images von WordPress und MySQL:

1. Bereiten Sie die Umgebung vor

1. Ziehen Sie das WordPress-Bild

[root@docker-node1 /]# Docker-Pull WordPress

2. Ziehen Sie das MySQL-Image

[root@docker-node1 /]# docker pull mysql

3. Spiegelliste

[root@docker-node1 /]# Docker-Image ls
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
wordpress latest 0947f14b932b vor 25 Stunden 540MB
mysql latest 791b6e40940c vor 43 Stunden 465 MB

(II) Ausführen des Images

1. Führen Sie das MySQL-Image aus

root@docker-node1 /]# docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql
b6e7a57a5fcec79f436d3f65240adf833340b4a9640e3b4f9282870078fb8e57

Im obigen Befehl gibt -v das Speichervolumen an, MYSQL_ROOT_PASSWORD legt das Datenbankkennwort fest und MYSQL_DATABASE gibt den Namen der erstellten Datenbank an. Weitere Einzelheiten finden Sie unter: https://hub.docker.com/_/mysql

Zeigen Sie den gestarteten Container an:

[root@docker-node1 /]# docker ps
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
b6e7a57a5fce mysql "docker-entrypoint.s…" vor 6 Minuten Up 6 Minuten 3306/tcp, 33060/tcp mysql

2. Starten Sie das WordPress-Bild

[root@docker-node1 /]# docker run --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 -d wordpress
6cf0c0fc2ef332728a3ea2bf2dbee65299441b26751d5c64f0a66b329f2679f6

Im obigen Befehl ist WORDPRESS_DB_HOST die Datenbank, mit der eine Verbindung hergestellt werden soll, und die angegebene Datenbank ist der gerade erstellte MySQL-Container. Hier werden keine Umgebungsinformationen wie das Kennwort von WORDPRESS_DB_USER und WORDPRESS_DB_PASSWORD eingegeben, da der Standardbenutzername und das Standardkennwort des MySQL-Containers verwendet werden. Einzelheiten finden Sie unter: https://hub.docker.com/_/wordpress.

Sehen Sie sich dann die Containerinformationen an:

[root@docker-node1 /]# docker ps
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
6cf0c0fc2ef3 wordpress "docker-entrypoint.s…" vor 3 Minuten Up 3 Minuten 0.0.0.0:8080->80/tcp wordpress
b6e7a57a5fce mysql "docker-entrypoint.s…" vor 20 Minuten Up 20 Minuten 3306/tcp, 33060/tcp mysql

Jetzt sind beide Container aktiv und Sie können auf Port 8080 des Hosts zugreifen.

Docker Compose

Aus der obigen Bereitstellung können wir die folgenden Probleme erkennen:

  • Sie müssen mehrere Container separat abrufen und nacheinander bereitstellen
  • Müssen mehrere Container gleichzeitig verwalten (einschließlich Starten, Stoppen usw.)

Gibt es also eine der Stapelverarbeitung ähnliche Möglichkeit, bei der ein solch umständlicher Prozess nicht erforderlich ist? Hier kommt Docker Compose ins Spiel.

1. Einführung in Docker Compose

1. Was ist Docker Compose?

Docker Compose ist ein Werkzeug

Dieses Tool kann Multi-Container-Anwendungen über YML-Dateien definieren

Mit einem Befehl können Sie mehrere Container gemäß der Definition der YML-Datei erstellen und verwalten.

2. docker-compose.yml-Datei

Ein sehr wichtiger Teil von Docker Compose ist die Datei docker-compose.yml, die drei sehr wichtige Konzepte enthält: Dienste, Netzwerke und Volumes.

Dienstleistungen

Ein Dienst ist ein Container. Dieser Container kann aus einem Image in Dockerhub oder aus einem Image stammen, das aus einer lokalen Docker-Datei erstellt wurde. Das Starten eines Dienstes ist ähnlich wie das Starten eines Docker-Laufs. Wenn wir Docker-Lauf verwenden, können wir die Netzwerk- und Volume-Parameter dafür angeben. In ähnlicher Weise können wir auch das Netzwerk und das Volume für den Dienst angeben.

Zum Beispiel:

Leistungen:
  db:
    Bild:postgres:9.4
    Bände:
      -"db-data:/var/lib/postgresql/data"
    Netzwerke:
      -hintere Ebene

Die obige YML-Datei definiert einen Dienst, der dem folgenden Befehl entspricht:

docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4

Netzwerke

Netzwerke:
  hintere Ebene:
    Treiber:Brücke

Die obige YML-Datei definiert ein Netzwerk, was dem folgenden Befehl entspricht:

Docker-Netzwerk erstellen -d Bridge Back-Tier

Bände

Bände:
  DB-Daten:

Die obige YML-Datei definiert ein Volume, das dem folgenden Befehl entspricht:

Docker-Volume erstellt DB-Daten

(II) Vorbereitung der Docker Compose-Umgebung

Docker Cmpose ist ein Tool und muss daher installiert werden. Einzelheiten zur Installation finden Sie unter: https://docs.docker.com/compose/install/.

1. Laden Sie die ausführbare Datei herunter

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2. Berechtigungen festlegen

sudo chmod +x /usr/local/bin/docker-compose

3. Überprüfen Sie die Version

[root@docker-node1 ~]# docker-compose --version
Docker-Compose-Version 1.24.1, Build 4667896

4. Allgemeine Befehle in Docker-Compose

[root@docker-node1 komponieren-wordpress]# docker-compose --help
Definieren und führen Sie Multi-Container-Anwendungen mit Docker aus.

Verwendung:
 docker-compose [-f <arg>…] [Optionen] [BEFEHL] [ARGS…]
 docker-compose -h|--Hilfe

Optionen:
 -f, --file DATEI Gibt eine alternative Erstellungsdatei an
               (Standard: docker-compose.yml)
 -p, --project-name NAME Geben Sie einen alternativen Projektnamen an
               (Standard: Verzeichnisname)
 --verbose Weitere Ausgabe anzeigen
 --log-level LEVEL Protokollebene festlegen (DEBUG, INFO, WARNING, ERROR, CRITICAL)
 --no-ansi Keine ANSI-Steuerzeichen drucken
 -v, --version Version drucken und beenden
 -H, --host HOST Daemon-Socket zum Verbinden

 --tls TLS verwenden; impliziert durch --tlsverify
 --tlscacert CA_PATH Nur von dieser Zertifizierungsstelle signierte Zertifikate vertrauen
 --tlscert CLIENT_CERT_PATH Pfad zur TLS-Zertifikatsdatei
 --tlskey TLS_KEY_PATH Pfad zur TLS-Schlüsseldatei
 --tlsverify TLS verwenden und den Remote-
 --skip-hostname-check Vergleicht den Hostnamen des Daemons nicht mit dem
               Name, der im Client-Zertifikat angegeben ist
 --project-directory PATH Geben Sie ein alternatives Arbeitsverzeichnis an
               (Standard: der Pfad der Compose-Datei)
 --compatibility Wenn gesetzt, versucht Compose, Schlüssel zu konvertieren
               in v3-Dateien zu ihrem Nicht-Swarm-Äquivalent

Befehle:
 build Dienste erstellen oder neu erstellen
 Bundle: Generieren Sie ein Docker-Bundle aus der Compose-Datei
 config Überprüfen und Anzeigen der Compose-Datei
 erstellenErstellen von Diensten
 down Stoppen und entfernen Sie Container, Netzwerke, Bilder und Volumes
 Ereignisse Empfangen Sie Echtzeitereignisse von Containern
 exec Einen Befehl in einem laufenden Container ausführen
 Hilfe Erhalten Sie Hilfe zu einem Befehl
 Bilder Liste der Bilder
 töten Töten Sie Container
 logs Ausgabe von Containern anzeigen
 pause Dienste pausieren
 Port Den öffentlichen Port für eine Portbindung drucken
 ps Container auflisten
 Pull Pull-Dienst Bilder
 push-service Bilder
 Neustart. Dienste neu starten.
 rm Gestoppte Container entfernen
 run Einen einmaligen Befehl ausführen
 Skalieren Festlegen der Anzahl von Containern für einen Dienst
 Start Dienste starten
 stop Dienste stoppen
 top Anzeige der laufenden Prozesse
 unpause Dienste pausieren
 nach oben Container erstellen und starten
 version Zeigt die Docker-Compose-Versionsinformationen an

Docker-Compose-Up - Entwicklerhandbuch für Windows

Wird verwendet, um den Dienst zu starten, einen Container zu erstellen und die YML-Datei auszuführen

docker-komponieren -d

Containerdienst zur Hintergrundausführung

Docker-Compose PS

Laufende Container anzeigen

Docker-Compose-Stopp

Beenden Sie den laufenden Containerdienst

Docker-Compose nach unten

Stoppen Sie den Containerdienst und entfernen Sie Container, Image, Netzwerk und Volume.

Docker-Compose-Bilder

Zeigen Sie die Bildliste des von Docker-Compose Up erstellten Containerdienstes an

Docker-Compose Exec-Container (Namen) Bash

Betreten eines Containers und Ausführen von Vorgängen innerhalb des Containers

Docker Compose in Aktion

1. WordPress

Schreiben Sie die Datei docker-compose.yml

Version: „3“ #docker-compose.yml Version Dienste: #Mehrere Containerdienste definieren WordPress: #Name des WordPress-Containers Bild: WordPress #Bildquelle Ports: #Portzuordnung – 8080:80
  Umgebung: #Umgebungsvariablen WORDPRESS_DB_HOST: mysql #Die Datenbank, mit der eine Verbindung hergestellt werden soll, ist der Name des MySQL-Containers unten WORDPRESS_DB_PASSWORD: root #Datenbankkennwort Netzwerke: #Das verwendete Netzwerk ist my-bridge, das in den folgenden Netzwerken definiert ist
   -meine-Brücke

 mysql: #MySQL-ContainernameImage: mysql #MySQL-ImageBefehl: --default-authentication-plugin=mysql_native_password #Lösen Sie das Problem der Datenbank-PasswortverschlüsselungUmgebung: #UmgebungsvariableMYSQL_ROOT_PASSWORD: root
   MYSQL_DATABASE: WordPress
  volumes: #Definieren Sie das Speichervolumen, das in den folgenden Volumes definiert ist - mysql-data:/var/lib/mysql
  Netzwerke:
   -meine-Brücke

Bände:
 MySQL-Daten:

Netzwerke:
 meine Brücke:
  Treiber: Brücke

Starten Sie den Container in Diensten

[root@docker-node1 komponieren-wordpress]# ls
docker-compose.yml
[root@docker-node1 compose-wordpress]# docker-compose up

Starten Sie den Container mit docker-compose up. Dieser Befehl führt standardmäßig die Datei docker-compose.yml im aktuellen Verzeichnis aus. Sie können den vollständigen Befehl auch als docker-compose -f docker-compose.yml up schreiben.

2. Flask-Web

Erstellen Sie drei Dateien: app.py docker-compose.yml Dockerfile

[root@docker-node1 Compose-Flasche]# ls
app.py docker-compose.yml Docker-Datei

Schreiben Sie die Datei app.py

aus Flasche importieren Flasche
von Redis importieren Redis
Betriebssystem importieren

App = Flask(__name__)
redis = Redis(Host=os.environ.get('REDIS_HOST'),Port=6379)

@app.route('/')
def hallo():
  returniere 'Hallo Welt'

wenn __name__ == "__main__":
  app.run(Host="0.0.0.0",Port=5000,Debug=True)

Schreiben einer Docker-Datei

VON python:2.7
KOPIEREN ./app/
ARBEITSVERZEICHNIS /app/
Führen Sie den Befehl „pip install flask redis“ aus.
EXPOSE 5000
CMD ["python","app.py"]

Schreiben Sie die Datei docker-compose.yml

Version: "3"

Leistungen:

 Redis:
  Bild: Redis

 Webseite:
  bauen:
   Kontext: .
   Dockerdatei: Dockerdatei
  Häfen:
   8080:5000
  Umfeld:
   REDIS_HOST: redis

Starten des Containerdienstes

[root@docker-node1 compose-flask]# docker-compose up

Zugriffsdienste

4. Horizontale Erweiterung und Lastausgleich

1. Maßstab

Die Bereitstellung der Flask-Anwendung wird oben über Docker Compose abgeschlossen. Der aktuell ausgeführte Container ist:

[root@docker-node1 Compose-Flasche]# Docker-Compose ps
    Name Befehl Status Ports     
---------------------------------------------------------------------------------------------------
compose-flask_redis_1 docker-entrypoint.sh redis ... Bis 6379/tcp       
compose-flask_web_1 python app.py Hoch 0.0.0.0:8080->5000/tcp

Über den Befehl „docker-compose --help“ können Sie sehen, dass es einen Skalierungsparameter gibt:

[root@docker-node1 Compose-Flask]# docker-compose --Hilfe
  Skalieren Festlegen der Anzahl von Containern für einen Dienst

Dies bedeutet, dass mehrere Anwendungscontainer aktiviert werden können:

[root@docker-node1 compose-flask]# docker-compose up --scale web=3 -d

Aber das geht offensichtlich schief, warum? Da die Portzuordnungen der drei Container identisch sind, werden die verbleibenden zwei Anwendungscontainer zwangsläufig Portbelegungsfehler melden. An diesem Punkt müssen Sie die Datei docker-compose.yml ändern, um die Portkonfiguration der Webanwendung zu entfernen:

Version: "3"

Leistungen:

 Redis:
  Bild: Redis

 Webseite:
  bauen:
   Kontext: .
   Dockerdatei: Dockerdatei
  Ports: #Dieses Element entfernen - 8080:5000
  Umfeld:
   REDIS_HOST: redis

Das ist es.

[root@docker-node1 compose-flask]# docker-compose up --scale web=3 -d
Compose-flask_web_1 wird neu erstellt … 
Neuerstellung von compose-flask_web_1 … fertig
Neuerstellung von compose-flask_web_2 … fertig
Neuerstellung von compose-flask_web_3 … fertig

Sehen Sie sich den Container an:

[root@docker-node1 Compose-Flask]# Docker PS
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
d0ae3307eb9e compose-flask_web "python app.py" vor 51 Sekunden Aktiv 46 Sekunden 5000/tcp compose-flask_web_1
67483b8decd3 compose-flask_web "python app.py" vor 52 Sekunden Aktiv 47 Sekunden 5000/tcp compose-flask_web_2
741766d49902 compose-flask_web "python app.py" vor 52 Sekunden Up 47 Sekunden 5000/tcp compose-flask_web_3
be3800004658 redis "docker-entrypoint.s…" vor 5 Stunden Up 6 Minuten 6379/tcp compose-flask_redis_1

Aber offensichtlich kann darauf nur innerhalb des Containers zugegriffen werden, da der Port nicht zugeordnet ist. Was sollen wir also als Nächstes tun?

Als Nächstes können wir einen HAProxy-Container zum Empfangen von Anfragen verwenden und diese dann über Ports an verschiedene Webserver weiterleiten. Dadurch werden die folgenden Probleme gelöst:

  • Kein Zugriff von außen möglich, Zugriff nur innerhalb des Containers möglich
  • Lastenausgleich

2. Horizontale Expansion und Lastausgleich

Dateistruktur

[root@docker-node1 Compose-Flasche]# ls
app.py docker-compose.yml Docker-Datei

Schreiben Sie app.py

aus Flasche importieren Flasche
von Redis importieren Redis
Betriebssystem importieren

App = Flask(__name__)
redis = Redis(Host=os.environ.get('REDIS_HOST'),Port=6379)

@app.route('/')
def hallo():
  returniere 'Hallo Welt'

wenn __name__ == "__main__":
  app.run(Host="0.0.0.0",Port=80,Debug=True)

Schreiben einer Docker-Datei

VON python:2.7
KOPIEREN ./app/
ARBEITSVERZEICHNIS /app/
Führen Sie den Befehl „pip install flask redis“ aus.
AUSSETZEN 80
CMD ["python","app.py"]

Schreiben Sie die Datei docker-compose.yml

Version: "3"

Leistungen:

 Redis:
  Bild: Redis

 Webseite:
  bauen:
   Kontext: .
   Dockerdatei: Dockerdatei
  Umfeld:
   REDIS_HOST: redis

 Pfund:
  Bild: Dockercloud/Haproxy
  Links:
   - Netz
  Häfen:
   -8080:80
  Bände:
   – /var/run/docker.sock:/var/run/docker.sock

laufen

[root@docker-node1 Compose-Flask]# docker-compose up -d
Erstellen des Netzwerks „compose-flask_default“ mit dem Standardtreiber
Erstellen von compose-flask_web_1 … fertig
Erstellen von compose-flask_redis_1 … fertig
Erstellen von compose-flask_lb_1 … fertig

Sie können sehen, dass drei Container gestartet werden:

[root@docker-node1 Compose-Flasche]# Docker-Compose ps
    Name Befehl Status Ports        
--------------------------------------------------------------------------------------------------
compose-flask_lb_1 /sbin/tini --dockercloud- ... Bis 1936/tcp, 443/tcp,        
                                 0.0.0.0:8080->80/tcp       
compose-flask_redis_1 docker-entrypoint.sh redis ... Bis 6379/tcp             
compose-flask_web_1 python app.py Bis 5000/tcp

Wir können sehen, dass es derzeit nur eine Webanwendung gibt und mehrere gestartet werden können, um Anforderungen zu verarbeiten:

[root@docker-node1 compose-flask]# docker-compose up --scale web=5 -d
compose-flask_redis_1 ist auf dem neuesten Stand
Compose-flask_web_1 wird gestartet … fertig
Erstellen von compose-flask_web_2 … fertig
Erstellen von compose-flask_web_3 … fertig
Erstellen von compose-flask_web_4 … fertig
Erstellen von compose-flask_web_5 … fertig
compose-flask_lb_1 ist aktuell

Wie Sie sehen, werden fünf Container direkt für die Webanwendung gestartet, um die Anforderungen von HAProxy zu teilen.

Dies ist das Ende dieses Artikels über die Implementierung der Docker Compose-Mehrcontainerbereitstellung. Weitere Informationen zur Docker Compose-Mehrcontainerbereitstellung finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detailliertes Beispiel für die schnelle Bereitstellung von Multi-Container-Diensten mit Docker Compose
  • Implementierung der Master-Slave-Replikation im Docker Compose-Deployment
  • Verwenden von Docker Compose zum Erstellen und Bereitstellen des ElasticSearch-Konfigurationsprozesses

<<:  Details zur Vue-Vorlagenkompilierung

>>:  Analyse der Prinzipien der MySQL Slow Query-bezogenen Parameter

Artikel empfehlen

Die Vor- und Nachteile von Nginx und LVS und ihre geeignete Nutzungsumgebung

Lassen Sie uns zu Beginn darüber sprechen, was La...

MySQL-Anmelde- und Beendigungsbefehlsformat

Das Befehlsformat für die MySQL-Anmeldung ist: my...

MySQL kontrolliert die Anzahl der Versuche, falsche Passwörter einzugeben

1. So überwachen Sie MySQL-Deadlocks in Produktio...

MySQL-Abfrageoptimierung mit benutzerdefinierten Variablen

Inhaltsverzeichnis Optimieren von Sortierabfragen...

JavaScript-Simulationsrechner

In diesem Artikel wird der spezifische Code des J...

Einfache Anwendungsbeispiele für benutzerdefinierte MySQL-Funktionen

Dieser Artikel veranschaulicht anhand von Beispie...

So drücken Sie relative Pfade in Linux aus

Wenn Ihr aktueller Pfad beispielsweise /var/log i...

Detaillierte Erklärung der allgemeinen For-Schleife in JavaScript-Anweisungen

Es gibt viele Schleifenanweisungen in JavaScript,...

Der Quellcode zeigt, warum Vue2 Daten und Methoden direkt abrufen kann

Inhaltsverzeichnis 1. Beispiel: Hiermit können Da...