Apple M2 Virtualisierung mit Colima und Docker Desktop
2023-09-14
Machine-translated from English. Read the English original
Was Docker Desktop im Vergleich zu Colima auf Apple M2-Silicon angeht
Dieser Beitrag wird aus der Perspektive jemanden geschrieben, dem es eigentlich egal ist, welche Container-Engine er verwendet. Ich wollte einfach ein Produkt eines Herstellers evaluieren und wusste, dass Container der effizienteste Weg sind, um schnell startklar zu sein. Ich unternehme dies auch als persönliche Schulungsmaßnahme, was bedeutet, dass die Docker-Desktop-Lizenzierung kein Problem darstellen sollte. Wenn Sie jedoch Container beruflich nutzen, aber nicht für Docker Desktop lizenziert sind, lesen Sie weiter, da dies Ihnen möglicherweise eine praktikable Open-Source-Lösung für das Container-Management bietet.
Beachten Sie auch, dass die Herausforderungen, auf die ich hier stieß, spezifisch für Apple-MacOS-Benutzer waren, die auf Apples proprietärer M1/M2-Silicon-Hardware laufen – die Ironie geht an mir nicht vorbei, auf so teurem Blech zu laufen und sich über relativ unbedeutende Lizenzkosten Gedanken zu machen 😁.
TLDR
Wenn die Lizenzierung kein Problem ist und Ihnen die engineering curiousity über die verschiedenen Container-Engines fehlt, aber Sie die Aufgabe einfach erledigen möchten, ist Docker Desktop das Richtige für Sie!
Vergessen Sie nicht, Apples Rosetta-2-Software zu installieren. Dieser Emulator/Translator hilft dabei, die x86/AMD-Container (denken Sie an Intel) oder genauer gesagt die Low-Level-CPU-Befehle dieser Container nahtlos in einen von Apple M2 erkannten Befehlssatz zu übersetzen.
softwareupdate --install-rosetta
Und konfigurieren Sie Docker Desktop so, dass es Rosetta 2 verwendet.
Dann geht es mit Ihren Docker-Befehlen ganz normal weiter.
Colima ist sozusagen ein Drop-in-Ersatz!
Colima ist ein weiteres hervorragendes Community-Projekt, das dazu beiträgt, die Erfahrung von MacOS-Benutzern beim Verwalten von Containern unter Linux, MacOS und Nix!?! (fragen Sie nicht, ich habe mich noch nicht mit Nix beschäftigt) zu verbessern.
Es ist ganz einfach
# Homebrew
brew install colima
...
gefolgt von
colima start
...
und dann können Sie loslegen, oder? Hmmm, ja, nehme ich an, vorausgesetzt, Sie verwenden einige eigenständige (Wortspiel beabsichtigt) Images, die keine externen Einhängepunkte benötigen.
Die Herausforderung, mit der ich konfrontiert war, bestand darin, dass ich eine relativ komplexe Anwendung eines Herstellers ausführte, die mehrere Container und physische Volume-Einhängepunkte im zugrunde liegenden Betriebssystem erforderte.
Außerdem hatte ich Colima noch nicht für die M2-Silicon-Hardware optimiert.
Als Erstes müssen wir die Engine beenden und einige der grundlegenden Ressourcenkonfigurationen über die Standardwerte hinaus optimieren, um sie für die M2-Silicon-Hardware anzupassen. Führen Sie dazu die folgenden Änderungen durch.
colima stop
...
colima delete
...
colima start --arch aarch64 --vm-type=vz --vz-rosetta --cpu 6 --memory 12 --disk 64
Dies sollte Ihnen eine optimale Konfiguration bieten, sofern Sie über ähnliche Ressourcen verfügen. Wenn nicht, passen Sie die Werte nach Belieben an.
Dennoch konnte ich die Anwendung des Herstellers nicht erfolgreich zum Laufen bringen. Denken Sie daran, dass sie auf Docker Desktop beim ersten Versuch funktioniert hat.
Bei der Durchsicht der Docker-Container-Protokolle konnte ich sehen, dass der Hauptcontainer in einer Initialisierungs-Boot-Schleife steckte – er beschwerte sich über Dateiberechtigungen auf den eingehängten Laufwerken.
Eine schnelle Suche in den Colima-Issues ergab die Herausforderung sowie die Umgehungslösung – zumindest hat dies bei mir funktioniert.
Die endgültige funktionierende Colima-Konfiguration für meinen M2 MBP:
- Erstellen Sie die folgende Datei in
/Users/(username)/.lima/_config/override.yamloder fügen Sie sie dort ein
mountType: 9p
mounts:
- location: "/Users/(username)"
writable: true
9p:
securityModel: mapped-xattr
cache: mmap
- location: "~"
writable: true
9p:
securityModel: mapped-xattr
cache: mmap
- location: /tmp/colima
writable: true
9p:
securityModel: mapped-xattr
cache: mmap
Vergessen Sie nicht, (username) oben durch Ihren eigenen Benutzernamen zu ersetzen (wenn Sie das tun, sind Sie in guter Gesellschaft, aber es war spät am Abend für mich, was ist Ihre Ausrede?)
- Löschen Sie die vorhandene Engine und starten Sie erneut – wechseln Sie diesmal zurück zur QEMU-Emulation und dem älteren mountType
colima stop
...
colima delete
...
colima start --arch aarch64 --vm-type=qemu --vz-rosetta --cpu 6 --memory 12 --disk 64 --mount-type 9p
Schließlich können wir dieselbe Anwendung des Herstellers auf der M2-Silicon-Hardware mit Colima erfolgreich starten! Ihre Standard-Docker-Befehle und docker-compose.yml-Dateien sollten wie gewohnt funktionieren.
Der Docker-Kontextwechsel ist nützlich, wenn Sie sich entscheiden, mehrere Container-Engines auszuführen. Er teilt dem Docker-Binary mit, mit welcher Container-Engine es kommunizieren soll. Beachten Sie auch, dass Docker Desktop den Kontext beim Start automatisch wechselt (ja, das ergibt Sinn, nehme ich an).
# docker context ls
NAME DESCRIPTION DOCKER ENDPOINT ERROR
colima colima unix:///Users/graz/.colima/default/docker.sock
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock
desktop-linux * Docker Desktop unix:///Users/graz/.docker/run/docker.sock
#
Fazit
Theoretisch sollte die Leistung von Colima reduziert sein, da wir in diesem Fall durch den Wechsel zurück zu QEMU nicht mehr die native Virtualisierung von Apple nutzen.
Ich hatte das Gefühl, dass die Leistung im Vergleich zu Docker Desktop leicht reduziert war.
Wissenschaftliche Analyse – Es ist eine leistungsstarke (Fachbegriff) Anwendung, die auf Docker Desktop konsistent 2 Minuten von docker compose up -d bis zum Login benötigte, während es auf Colima mehr als 3 Minuten dauerte, bis der Login-Prompt erschien.
Wenn Sie es eilig haben, ein Unternehmen sind und sich die Lizenz leisten können, ist Docker Desktop möglicherweise die beste geschäftsfokussierte Option.
Ingenieure und Entwickler werden Colima auf jeden Fall ausprobieren, und bitte tragen Sie zum Projekt bei – es funktioniert und wird kontinuierlich verbessert.
MBP-Details -> Apple M2 Max, 32 GB, OS 13.5.2
Docker Desktop -> Version 4.22.0
Colima -> Version 0.5.5
Happy Shipping!
Unten ist die docker-compose.yml-Datei, die für die Bereitstellung verwendet wurde.
version: '3.6'
services:
web:
image: 'gitlab/gitlab-ce:16.2.6-ce.0'
depends_on:
- redis
- postgresql
hostname: 'gitlab.demo'
networks:
vpcbr:
ipv4_address: 10.5.0.4
environment:
GITLAB_OMNIBUS_CONFIG: |
postgresql['enable'] = false
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "gitlab"
gitlab_rails['db_host'] = "postgresql"
gitlab_rails['db_database'] = "gitlabDB"
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
redis['enable'] = false
gitlab_rails['redis_host'] = 'redis'
gitlab_rails['redis_port'] = '6379'
prometheus['enable'] = false
external_url "http://gitlab.demo"
gitlab_rails['gitlab_shell_ssh_port'] = 23
container_name: gitlabce
extra_hosts:
- "gitlab.demo:127.0.0.1"
restart: always
ports:
- '80:80'
- '443:443'
- '23:22'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
shm_size: '4GB'
postgresql:
container_name: postgress
image: postgres:15.4
networks:
vpcbr:
ipv4_address: 10.5.0.5
environment:
- POSTGRES_USER=gitlab
- POSTGRES_PASSWORD=gitlab
- POSTGRES_DB=gitlabDB
redis:
image: redis:7.2.1
container_name: redis
networks:
vpcbr:
ipv4_address: 10.5.0.6
runner:
image: gitlab/gitlab-runner:v16.3.0
container_name: gitlab-runner
restart: always
extra_hosts:
- "gitlab.demo:10.5.0.4"
volumes:
- '$GITLAB_HOME/gitlab-runner/config:/etc/gitlab-runner'
- '/var/run/docker.sock:/var/run/docker.sock'
networks:
vpcbr:
ipv4_address: 10.5.0.7
networks:
vpcbr:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/24
gateway: 10.5.0.1
Originally published on allthingscloud.eu (2023-09-14).
