Apple M2 Virtualisierung mit Colima und Docker Desktop

2023-09-14

Apple M2 Virtualisierung mit Colima und Docker Desktop

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.

Docker Engine Config

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:

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?)

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!

Graz

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).

← All posts