Ich Docker verwende Docker schon seit einigen Jahren für meine lokale Entwicklungsumgebung. Am Anfang habe ich noch selbst geschriebene Images verwendet, aber in letzter Zeit verwende ich hauptsächlich „Abstraktionen“ wie DDEV oder wp-env, insbesondere bei der Arbeit mit WordPress-Projekten. Meistens verwende ich hierbei Linux, aber ich habe auch ein Setup auf einem Windows-Dual-Boot-Rechner.
Mein früherer Linux-Arbeitslaptop war nur ein Core i5-7200U Dual-Core mit 16GB RAM. Da ich manchmal an verschiedenen Projekten gleichzeitig gearbeitet habe, war mein Rechner mit mehreren geöffneten PhpStorm-Instanzen und Chrome-Browser-Tabs ziemlich schnell an seiner Grenze. Bei der Überprüfung der Ressourcen wurde schnell klar, dass Docker das Problem war, weil es 50 % aller Ressourcen verwendet hat.
Messung der von Docker verwendeten Ressourcen
Verschiedene Betriebssysteme haben unterschiedliche Tools, um die Auslastung der laufenden Prozesse anzuzeigen. Wenn man herausfinden will, welcher Prozess wie viel verbrauchen, benutzt man diese auch normalerweise. Es gibt aber auch einen in Docker selbst eingebauten Befehl dazu: docker stats
. Mit diesem Befehl erhalten ihr eine Ausgabe wie diese:
$ docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
NAME CPU % MEM USAGE / LIMIT
34774832e449e0c5323d0c6eb5b88fdf-tests-cli-1 0.00% 628KiB / 15.01GiB
34774832e449e0c5323d0c6eb5b88fdf-cli-1 0.00% 1.133MiB / 15.01GiB
34774832e449e0c5323d0c6eb5b88fdf-tests-wordpress-1 0.01% 15.95MiB / 15.01GiB
34774832e449e0c5323d0c6eb5b88fdf-wordpress-1 0.00% 16.63MiB / 15.01GiB
34774832e449e0c5323d0c6eb5b88fdf-tests-mysql-1 0.02% 180.4MiB / 15.01GiB
34774832e449e0c5323d0c6eb5b88fdf-mysql-1 0.02% 183.1MiB / 15.01GiB
ddev-router 0.82% 43.99MiB / 15.01GiB
ddev-theme-tests-web 0.03% 144.4MiB / 15.01GiB
ddev-theme-tests-db 0.11% 150.6MiB / 15.01GiB
ddev-ssh-agent 0.32% 5.805MiB / 15.01GiB
ddev-theme-tests-dba 0.01% 20.1MiB / 15.01GiB
Ändern der Ressourcen-Limit in WSL2
Dieses Beispiel stammt aus einem WSL2-Docker-Setup. Ihr könnt hier zwei Projekte mit ihren Containern sehen. Die Spalte „MEM USAGE“ zeigt euch auch das „LIMIT“ an, das alle Container maximale ausnutzen können. Auf dem hier gezeigten Rechner mit 32B RAM sind es 50% des verfügbaren Speichers.
Diese Begrenzung wird von WSL selbst festgelegt. Standardmäßig werden 50% des verfügbaren Arbeitsspeichers oder 8GB verwendet, je nachdem, welcher Wert kleiner ist. Bei älteren Builds (vor 20715) wurden jedoch bis zu 80% des Arbeitsspeichers beansprucht! Das kann selbst leistungsstarke Rechner schnell zum Absturz bringen.
Glücklicherweise ist es recht einfach, dies zu überschreiben. Dazu müsst ihr nur eine .wsconfig
Datei im Home-Verzeichnis eures Benutzers (%UserProfile%) erstellen. Hier legen legt ihr dann die Datei mit dem folgenden Inhalt an:
[wsl2]
memory=8G
Anschließend müsst ihr WLS2 mit folgendem Befehl neu starten, was alle laufenden Distros herunterfährt. Stellt also sicher, dass dies in eurer Umgebung in Ordnung ist:
wsl --shutdown
Docker für Windows wird jetzt wahrscheinlich melden, dass Docker gestoppt wurde, und ihr können den „Restart“ Button klicken, um es neu zu starten. Wenn ihr jetzt erneut den Befehl docker stats
ausführt, sollten ihr eine Speicherbegrenzung auf 8GB sehen. Es gibt noch weitere Einstellungen, die ihr in der .wslconfig
Datei überschreiben könnt, wie z.B. die Anzahl der verwendeten Prozessoren. Da der virtuelle Server, auf dem dieses Blog gehostet wird, auch nur 4GB RAM hat, sind die 8GB, die ich hier definiert habe, immer noch sehr großzügig.
Begrenzung der Ressourcen in anderen Betriebssystemen
Ich benutze keinen Mac, daher kann ich euch nicht sagen, wie die Einstellungen dort geändert werden können. Und unter Linux gibt es viele verschiedene Möglichkeiten, das Gleiche zu erreichen. Es würde aber den Rahmen des Beitrags sprengen, alle verschiedenen Varianten aufzuzählen. Aber ich habe einen Tipp für diejenigen von euch, die Linux verwenden.
Begrenzung der Ressourcen pro Projekt
Anstatt die Ressourcen global zu begrenzen, können ihr sie pro Container oder für ein Projekt, das eine docker-compose.yml
Datei verwendet, begrenzen. Bei der manuellen Ausführung eines Containers können ihr die Ressourcen an den Aufruf direkt übergeben. Aber mit einer docker-compose.yml
Datei könnt ihr sie auch für einen einzelnen Dienst festlegen, wie in diesem Beispiel, wo ich die Datei für das wp-env
Projekt angepasst habe:
version: '3.7'
services:
mysql:
image: mariadb
deploy:
resources:
limits:
memory: 2GB
# ...
Mit dem resources
Key könnt ihr die Werte für jeden Dienst ändern. Mit dieser Änderung sehen die Statistiken dann wie folgt aus:
$ docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
NAME CPU % MEM USAGE / LIMIT
34774832e449e0c5323d0c6eb5b88fdf-cli-1 0.00% 576KiB / 7.761GiB
34774832e449e0c5323d0c6eb5b88fdf-wordpress-1 0.01% 15.87MiB / 7.761GiB
34774832e449e0c5323d0c6eb5b88fdf-mysql-1 0.02% 177.6MiB / 2GiB
34774832e449e0c5323d0c6eb5b88fdf-tests-cli-1 0.00% 2.664MiB / 7.761GiB
34774832e449e0c5323d0c6eb5b88fdf-tests-wordpress-1 0.00% 16.17MiB / 7.761GiB
34774832e449e0c5323d0c6eb5b88fdf-tests-mysql-1 0.03% 86.56MiB / 7.761GiB
Wie ihr sehen könnt, verwenden alle Dienste die zuvor definierten 8GB, aber der MySQL-Dienst ist jetzt auf 2GB begrenzt. Da der MySQL-Dienst in der Regel am meisten Speicher verbraucht, würde ich empfehlen, diesen Dienst zuerst zu begrenzen.
Fazit
Das hier ist kein Blogbeitrag darüber, wie man die Ressourcen für Docker-Container in allen Betriebssystemen und in allen möglichen Szenarien optimiert. Ich hoffe aber, dass er euch zeigen könnte, welche Möglichkeiten es gibt und euch dabei hilft, sie auf einem Rechner mit wenig Gesamtspeicher oder wenigen Prozessoren/Threads schnell zu begrenzen. Bei meinem alten Arbeitslaptop hat das wirklich geholfen, und ich konnte viel schneller arbeiten, da sich die anderen Prozesse nicht die verbleibenden 50% des Speichers unter sich aufteilen mussten.