Virtualisation Apple M2 avec Colima et Docker Desktop

2023-09-14

Virtualisation Apple M2 avec Colima et Docker Desktop

Machine-translated from English. Read the English original

# Docker Desktop versus Colima sur les puces Apple M2

Cet article est rédigé du point de vue de quelqu’un qui ne se soucie pas vraiment du moteur de conteneurs qu’il utilise. Je voulais simplement évaluer le produit d’un éditeur et je savais que les conteneurs seraient le moyen le plus efficace pour démarrer rapidement. J’entreprends également cette activité dans le cadre d’un exercice de formation personnelle, ce qui signifie que la licence de Docker Desktop ne devrait pas poser de problème. Cependant, si vous utilisez des conteneurs dans un cadre professionnel mais que vous n’êtes pas licencié pour Docker Desktop, poursuivez votre lecture, car cela pourrait vous fournir une solution open source viable pour la gestion des conteneurs.

Notez également que les défis auxquels j’ai été confronté ici étaient spécifiques aux utilisateurs d’Apple MacOS fonctionnant sur les puces propriétaires M1/M2 d’Apple – l’ironie n’est pas perdue pour moi ici, utilisant un matériel aussi coûteux et m’inquiétant de coûts de licence relativement triviaux 😁.

TLDR

Si la licence n’est pas un problème et que vous manquez de engineering curiousity sur les différents moteurs de conteneurs mais que vous voulez simplement faire le travail, Docker Desktop est celui qu’il vous faut !

N’oubliez pas d’installer le logiciel Rosetta 2 d’Apple. Cet émulateur/traducteur aidera à traduire de manière transparente les conteneurs x86/AMD (pensez Intel) ou, plus précisément, les instructions CPU de bas niveau de ces conteneurs vers un jeu d’instructions reconnu par Apple M2.

softwareupdate --install-rosetta

Et configurez Docker Desktop pour utiliser Rosetta 2.

Docker Engine Config

Ensuite, c’est juste business as usual avec vos commandes Docker.

Colima est un remplacement direct, un peu !

Colima est un autre excellent projet communautaire qui aide à améliorer l’expérience des utilisateurs MacOS dans la gestion des conteneurs sur Linux, MacOS et Nix!?! (ne me demandez pas, je n’ai pas encore joué avec Nix non plus).

C’est aussi simple que

# Homebrew
brew install colima
...

suis de

colima start
...

et ensuite vous êtes prêt à partir, non ? Hmmm, oui, je suppose, à condition que vous utilisiez des images autonomes (jeu de mots voulu) qui ne nécessitent pas de montages externes.

Le défi auquel j’ai été confronté était que j’exécutais une application vendor relativement complexe qui nécessitait plusieurs conteneurs et des montages de volumes physiques sur le système d’exploitation sous-jacent.
De plus, je n’avais pas encore optimisé colima pour la puce M2.

Premièrement, pour optimiser pour la puce M2 et augmenter certaines des configurations de ressources de base au-delà de leurs valeurs par défaut, tuons ce moteur et apportons quelques modifications comme suit.

colima stop
...
colima delete
...
colima start --arch aarch64 --vm-type=vz --vz-rosetta --cpu 6 --memory 12 --disk 64

Cela devrait vous donner une configuration optimale à condition que vous disposiez de ressources similaires, sinon ajustez selon vos goûts.

Cependant, je n’ai toujours pas pu faire fonctionner l’application vendor avec succès. Rappelez-vous, cela a fonctionné du premier coup sur Docker Desktop.
En parcourant les journaux des conteneurs docker, j’ai pu voir que le conteneur principal était bloqué dans une boucle de démarrage d’initialisation – il se plaignait des autorisations de fichiers sur les lecteurs montés.

Une recherche rapide dans les problèmes de Colima a révélé le défi ainsi que la solution de contournement – au moins cela a fonctionné pour moi.

Donc la configuration Colima finale fonctionnelle pour mon 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

Veuillez ne pas oublier de remplacer (username) par votre propre nom d’utilisateur ci-dessus (si vous le faites, vous êtes en bonne compagnie mais il était tard pour moi, quelle est votre excuse ?)

colima stop
...
colima delete
...
colima start --arch aarch64 --vm-type=qemu --vz-rosetta --cpu 6 --memory 12 --disk 64 --mount-type 9p

Enfin, nous pouvons lancer avec succès la même application vendor sur la puce M2 en utilisant Colima ! Vos commandes Docker standard et les fichiers docker-compose.yml devraient tous fonctionner normalement.

Le changement de contexte de Docker est utile si vous décidez d’exécuter plusieurs moteurs de conteneurs. Il indique au binaire docker à quel moteur de conteneurs parler. Notez également que lorsque vous démarrez Docker Desktop, il change le contexte automatiquement (oui, cela a du sens, je suppose).

# 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
#

Conclusion

En théorie, les performances de Colima devraient être réduites car nous n’utilisons plus la virtualisation native d’Apple en revenant à QEMU dans ce cas.
J’ai senti qu’il y avait une légère réduction des performances par rapport à Docker Desktop.

Analyse scientifique – C’est une application robuste (terme technique) et elle a pris constamment 2 minutes de docker compose up -d à la connexion lors de l’exécution sur Docker Desktop, tandis qu’il fallait plus de 3 minutes pour obtenir l’invite de connexion lors de l’exécution sur Colima.

Si vous êtes pressé, êtes une entreprise et pouvez vous permettre la licence, alors Docker Desktop est probablement la meilleure option axée sur les entreprises.
Cependant, les ingénieurs et les développeurs joueront certainement avec Colima et veuillez contribuer au projet – cela fonctionne et s’améliore continuellement.

Détails MBP -> Apple M2 Max, 32 Go, OS 13.5.2
Docker Desktop -> version 4.22.0
Colima -> version 0.5.5

Bon Shipping !

Graz

Voici le fichier docker-compose.yml utilisé pour le déploiement.

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