Docker Compose – Speicherlimits

Docker Compose Memory Limits



Docker Compose ist ein leistungsstarkes Dienstprogramm. Es spart Zeit und reduziert Fehler bei der Bereitstellung Ihrer Dockerized-Anwendung. Normalerweise ist es keine gute Idee, den gesamten Stack einschließlich des Frontends, des Datenbankservers usw. in einem einzigen Container auszuführen.

Wir stellen verschiedene Container auf, um verschiedene Workloads einer Anwendung zu verarbeiten, und verwenden Docker Compose, um dies einfach zu tun. Jeder logisch unterschiedliche Workload wird als anders aufgeführt Service . Beispielsweise wird Ihr Front-End-HTTP-Server als Front-End-Dienst aufgeführt, auf dem ein Apache- oder Nginx-Image als Container ausgeführt wird.







Alle Dienste, ihre Netzwerkanforderungen, Speicheranforderungen usw. können in einer docker-compose.yml-Datei angegeben werden. Wir konzentrieren uns hier auf die Angabe der Speicherauslastung.



Sie benötigen die folgenden Tools in Ihrem Arsenal, um mitzumachen:



  1. Grundverständnis von Docker
  2. Docker für Windows oder Mac oder wenn Sie Linux verwenden, DockerCE für Linux
  3. Docker Compose-Binärdatei y (Windows- und Mac-Benutzer haben dies bereits installiert)

Wir bleiben bei der Version 2.4 für unsere docker-compose.yml-Dateien, da diese Version 17.12 und höher der Docker Engine und höher unterstützt. Wir hätten mit Version 3 gehen können, die neuer ist, aber die alte Speicherbeschränkungssyntax nicht unterstützt. Wenn Sie versuchen, die neuere Syntax zu verwenden, besteht diese stattdessen darauf, Docker im Schwarmmodus zu verwenden. Um die Sache für normale Docker-Benutzer einfach zu halten, bleibe ich bei Version 2.4





Der größte Teil des Codes würde für Version 3 genauso funktionieren, und wo es einen Unterschied geben wird, werde ich die neuere Syntax für Docker Swarm-Benutzer erwähnen.

Beispielanwendung

Lassen Sie uns versuchen, einen einfachen Nginx-Dienst auf Port 80 auszuführen, indem Sie zuerst die CLI und dann eine einfache docker-compose.yml verwenden. Im nächsten Abschnitt werden wir die Speicherbeschränkungen und -nutzung untersuchen und unsere docker-compose.yml ändern, um zu sehen, wie die benutzerdefinierten Beschränkungen auferlegt werden.



Starten wir einen einfachen nginx-Server mit Docker-CLI :

$ docker run -d --name my-nginx -p80:80nginx: neuestes

Sie können sehen, wie der nginx-Server funktioniert, indem Sie besuchen http://localhost oder ersetzen Sie lcoalhost

Mit der IP-Adresse Ihres Docker-Hosts. Dieser Container kann potenziell den gesamten verfügbaren Speicher auf Ihrem Docker-Host nutzen (in unserem Fall sind es etwa 2 GB). Um die Speicherauslastung zu überprüfen, können wir unter anderem den Befehl verwenden:

$ docker stats my-nginx

CONTAINER ID NAME CPU % MEM NUTZUNG / LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 mein-nginx0,00%2.133MiB / 1.934GiB0,11% 3,14kB / 2,13kB 0B / 0B2

Die MEM-NUTZUNG/LIMIT liegt bei 2,133 MiB von den insgesamt 1,934 GiB. Entfernen wir diesen Container und beginnen mit dem Schreiben von Docker-Compose-Skripten.

$ docker stop my-nginx
$ docker rm my-nginx

Äquivalente ym-Datei

Der genaue Container wie oben kann erstellt werden, wenn wir die folgenden Schritte ausführen:

$ mkdir mein-komponieren
$ cd mein-komponieren
$ vim docker-compose.yml

Wir erstellen ein neues leeres Verzeichnis und legen darin eine Datei docker-compose.yml an. Wenn wir docker-compose von diesem Verzeichnis aus ausführen, wird nach dieser bestimmten Datei gesucht (alle anderen ignoriert) und unsere Bereitstellung entsprechend erstellt. Fügen Sie dieser .yml-Datei den folgenden Inhalt hinzu.

Ausführung:'3'
Dienstleistungen:
mein-nginx:
Bild: nginx:neueste
Häfen:
-'80:80'

$ docker-compose up -d

Das Flag -d wird hinzugefügt, damit die neu erstellten Container im Hintergrund ausgeführt werden. Andernfalls hängt sich das Terminal an die Container an und beginnt mit dem Drucken von Berichten. Jetzt können wir die Statistiken der neu erstellten Container sehen:

$ docker stats -all

CONTAINER ID NAME CPU% MEM NUTZUNG/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10,00% 2,25MiB/1,934GiB0,11% 1,65kB/0B 7,35MB/0B2

Sie werden feststellen, dass ein ähnlicher Container wie zuvor mit ähnlichen Speichergrenzen und gleichmäßiger Auslastung erstellt wurde. Aus demselben Verzeichnis, das die yml-Datei enthält. Führen Sie den folgenden Befehl aus, um den neu erstellten Container zusammen mit dem erstellten Kundenbrückennetzwerk zu löschen.

$docker-compose down

Dadurch wird Docker mit Ausnahme aller erstellten Volumes in einen sauberen Zustand zurückgesetzt (wir haben keine erstellt, daher ist dies kein Problem.)

Speichergrenzen und Speicherreservierungen

Speicherlimits und Speicherreservierungen sind zwei verschiedene Aspekte, um ein reibungsloses Funktionieren Ihrer Anwendungen und des Docker-Hosts zu gewährleisten, auf dem Sie laufen.

Im Großen und Ganzen legt Memory Limit eine Obergrenze für die Speichermenge fest, die potenziell von einem Docker-Container verwendet werden kann. Standardmäßig kann ein Docker-Container wie jeder andere Systemprozess den gesamten verfügbaren Speicher des Docker-Hosts nutzen. Dies kann zu einer Out-of-Memory-Exception führen und Ihr System kann sehr gut abstürzen. Selbst wenn es nie dazu kommt, kann es anderen Prozessen (einschließlich anderer Container) wertvolle Ressourcen entziehen, was wiederum die Leistung beeinträchtigt. Memory Limits stellt sicher, dass ressourcenhungrige Container ein bestimmtes Limit nicht überschreiten. Dadurch wird der Explosionsradius einer schlecht geschriebenen Anwendung auf einige Container beschränkt, nicht auf den gesamten Host.

Memory Reservations hingegen ist weniger starr. Wenn der Speicher des Systems knapp wird und versucht, einen Teil davon zurückzugewinnen. Es versucht, den Speicherverbrauch des Containers auf oder unter das Reservierungslimit zu bringen. Wenn jedoch viel Speicher vorhanden ist, kann die Anwendung bis zum fest eingestellten Speicherlimit erweitert werden.

Zusammenfassen:

  1. Speichergrenze: Eine strikte Obergrenze für die einem Container zur Verfügung gestellte Speichermenge.
  2. Arbeitsspeicherreservierung: Dies sollte als das absolute Minimum an Arbeitsspeicher festgelegt werden, den eine Anwendung für die ordnungsgemäße Ausführung benötigt. Es stürzt also nicht ab oder verhält sich schlecht, wenn das System versucht, einen Teil des Speichers zurückzugewinnen.

Wenn die Speicherreservierung größer als das Speicherlimit ist, hat das Speicherlimit Vorrang.

Festlegen von Speichergrenzen und -reservierung

Version 2

Gehen wir zurück zur docker-compose.yml, die wir zuvor geschrieben haben, und fügen wir ein Speicherlimit hinzu. Ändern Sie die Version auf 2.4 aus Gründen, die im Abschnitt „Voraussetzungen“ erläutert werden.

Ausführung:'2.4'
Dienstleistungen:
mein-nginx:
Bild: nginx:neueste
Häfen:
-'80:80'
Speichergrenze: 300m

Die letzte Zeile legt das Limit für den my-nginx-Dienst auf 300 MiB fest. Sie können k für KiB und g für GiB und b für nur Byte verwenden. Die Zahl davor muss jedoch eine ganze Zahl sein. Sie können keine Werte wie 2,4 m verwenden, sondern müssen stattdessen 2400 k verwenden. Wenn Sie jetzt laufen:

$ docker stat --all

BEHÄLTER-ID NAME CPU% MEM NUTZUNG/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10,00% 2.141MiB/300MiB0,71% 1,16kB/0B 0B/0B2

Sie werden feststellen, dass das Speicherlimit auf 300 MiB eingestellt ist. Ebenso einfach ist das Einstellen der Speicherreservierung, fügen Sie einfach eine Zeile mem_reservation: xxx am Ende hinzu.

Ausführung:'2.4'
Dienstleistungen:
mein-nginx:
Bild: nginx:neueste
Häfen:
-'80:80'
Speichergrenze: 300m
mem_reservation: 100m

Version 3 (optional)

Um Version drei zu verwenden, müssen Sie Docker im Schwarmmodus ausführen. Für Windows und Mac können Sie es über das Docker-Einstellungsmenü aktivieren. Linux-Benutzer müssten Docker Swarm Init ausführen. Weitere Informationen dazu finden Sie Hier . Es ist jedoch kein notwendiger Schritt, und wenn Sie es nicht aktiviert haben, ist das auch in Ordnung. Dieser Abschnitt ist für Leute schon im Schwarmmodus läuft und die neuere Version nutzen kann.

Ausführung:'3'
Dienstleistungen:
mein-nginx:
Bild: nginx:neueste
Häfen:
-'80:80'
einsetzen:
Ressourcen:
Grenzen:
Speicher: 300m
Reservierungen:
Speicher: 100m

All dies definieren wir unter Ressourcenoption. Limits und Reservation werden zu eigenen Primärschlüsseln und der Speicher ist nur eine der vielen Ressourcen, die hier verwaltet werden. CPU ist ein weiterer wichtiger Parameter.

Weitere Informationen

Mehr über docker-compose erfahren Sie in der offiziellen Dokumentation hier verlinkt . Sobald Sie wissen, wie Sie eine Compose-Datei schreiben, kann Ihnen die Dokumentation bei den Besonderheiten verschiedener Parameter helfen.

Sie müssen nicht alles wissen, suchen Sie einfach nach den Anforderungen Ihrer Anwendung und die Referenz hilft Ihnen bei der Umsetzung.