Virtualización con Apple M2 usando Colima y Docker Desktop

2023-09-14

Virtualización con Apple M2 usando Colima y Docker Desktop

Machine-translated from English. Read the English original

# Docker Desktop frente a Colima en silicona Apple M2

Así que esto está escrito desde la perspectiva de alguien que realmente no le importa demasiado qué motor de contenedores está utilizando. Simplemente quería evaluar el producto de un proveedor y sabía que los contenedores serían la forma más eficiente de empezar y funcionar rápidamente. También estoy realizando esta actividad como un ejercicio de formación personal, lo que significa que la licencia de Docker Desktop no debería ser un problema. Sin embargo, si está utilizando contenedores en un entorno laboral pero no tiene licencia para Docker Desktop, siga leyendo, ya que esto podría proporcionarle una solución de código abierto viable para la gestión de contenedores.

También tenga en cuenta que los desafíos que enfrenté aquí eran específicos de los usuarios de Apple MacOS que ejecutan en la silicona propietaria M1/M2 de Apple; la ironía no se me escapa aquí, ejecutando en un equipo tan caro y preocupado por costos de licencia relativamente triviales 😁.

TLDR

Si la licencia no es un problema y le falta esa curiosidad de ingeniería sobre los varios motores de contenedores, pero simplemente quiere hacer el trabajo, Docker Desktop es el adecuado para usted.

Solo no olvide instalar el software Rosetta 2 de Apple. Este emulador/traductor ayudará a traducir sin problemas los contenedores x86/AMD (piense en Intel) o, más correctamente, las instrucciones de CPU de nivel inferior de esos contenedores a un conjunto de instrucciones reconocido por Apple M2.

softwareupdate --install-rosetta

Y configure Docker Desktop para usar Rosetta 2.

Docker Engine Config

Luego, es solo negocios como de costumbre con sus comandos de Docker.

Colima es un reemplazo directo, ¡casi!

Colima es otro excelente proyecto comunitario que está ayudando a mejorar la experiencia de los usuarios de MacOS en la gestión de contenedores en Linux, MacOS y Nix!?! (no pregunten, yo tampoco he jugado con Nix todavía).

Es tan simple como

# Homebrew
brew install colima
...

seguido por

colima start
...

y luego está listo para ir, ¿verdad? Hmmm, sí, supongo que sí, siempre que esté ejecutando algunas imágenes autocontenidas (juego de palabras intencionado) que no requieran montajes externos.

El desafío que tuve fue que estaba ejecutando una aplicación de proveedor relativamente compleja que requería múltiples contenedores y montajes de volúmenes físicos en el sistema operativo subyacente.
También aún no había optimizado Colima para la silicona M2.

Primero lo primero, para optimizar para la silicona M2 y aumentar algunas de las configuraciones básicas de recursos más allá de sus valores predeterminados, detengamos este motor y hagamos algunos ajustes como sigue.

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

Esto debería darle una configuración óptima siempre que tenga recursos similares disponibles; de lo contrario, ajústelo a su gusto.

Sin embargo, aún no pude hacer que la aplicación del proveedor se ejecutara con éxito. Recuerde, funcionó a la primera en Docker Desktop.
Buscando en los registros del contenedor de Docker, pude ver que el contenedor principal estaba atascado en un bucle de arranque de inicialización; se quejaba de permisos de archivo en las unidades montadas.

Una búsqueda rápida en los problemas de Colima reveló el desafío junto con la solución alternativa – al menos esto funcionó para mí.

Así que la configuración final de Colima que funcionó para mi MBP M2:

mountType: 9p
mounts:
  - location: "/Users/(nombre de usuario)"
    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

Por favor, no olvide cambiar (nombre de usuario) por su propio nombre de usuario arriba (si lo hace, está en buena compañía, pero era tarde por la noche para mí, ¿cuál es su excusa?).

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

Finalmente, podemos lanzar con éxito la misma aplicación del proveedor en la silicona M2 usando Colima. Sus comandos estándar de Docker y los archivos docker-compose.yml deberían funcionar con normalidad.

El cambio de contexto de Docker es útil si decide ejecutar múltiples motores de contenedores. Le dice al binario de docker a qué motor de contenedores hablar. También tenga en cuenta que, cuando inicia Docker Desktop, cambia el contexto automáticamente (sí, eso tiene sentido, supongo).

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

Conclusión

En teoría, el rendimiento de Colima debería reducirse ya que ya no estamos utilizando la virtualización nativa de Apple al volver a QEMU en este caso.
Sentí que había una ligera reducción en el rendimiento en comparación con Docker Desktop.

Análisis científico: Es una aplicación potente (término técnico) y tardó consistentemente 2 minutos desde docker compose up -d hasta el inicio de sesión cuando se ejecutaba en Docker Desktop, mientras que tardaba más de 3 minutos en obtener el indicador de inicio de sesión cuando se ejecutaba en Colima.

Si tiene prisa, es una empresa y puede permitirse la licencia, entonces Docker Desktop es posiblemente la mejor opción enfocada en el negocio.
Sin embargo, los ingenieros y desarrolladores definitivamente jugarán con Colima y por favor contribuyan al proyecto: funciona y está mejorando continuamente.

Detalles del MBP -> Apple M2 Max, 32GB, OS 13.5.2
Docker Desktop -> versión 4.22.0
Colima -> versión 0.5.5

¡Feliz envío!

Graz

A continuación se muestra el archivo docker-compose.yml utilizado para el despliegue.

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