Lima: Una Alternativa a Docker en MacOS

Xavier Llauca | Feb 17, 2024 min read

En este post, explicaré cómo instalar, configurar y utilizar Lima (Linux Machines) en MacOS como alternativa a Docker Desktop.

Introducción

Lima

Lima fue creado con el fin de promover containerd y nerdctl (contaiNERD ctl) a los usuarios de MacOS; sin embargo, con el paso del tiempo, también lo podemos utilizar para aplicaciones que no son contenedores.

Instalación de Lima

Ejecutamos el siguiente comando.

brew install lima

Nota: En caso de que no tengas instalado Homebrew, puedes instalarlo siguiendo estos pasos.

Uso de Lima

Como mencionamos anteriormente, el propósito inicial de Lima era fomentar el uso de containerd y nerdctl. Sin embargo, en la actualidad, se ha ampliado su utilidad para diversos propósitos, como desplegar diferentes tipos de distros (VMs), motores de contenedores, constructores de imágenes de contenedores, orquestación de contenedores, entre otros.

Para comenzar, ejecutamos limactl start, lo que desplegará una VM (runtime) con la plantilla predeterminada para ejecutar los contenedores. Esta instancia se despliega con las siguientes especificaciones predeterminadas:

  • OS: Ubuntu (containerd/nerdctl).
  • CPU: 4 cores
  • Memory: 4 GiB
  • Disk: 100 GiB
  • Mounts: ~ (read-only), /tmp/lima (writable)
  • SSH: 127.0.0.1:60022
limactl start
? Creating an instance "default"  [Use arrows to move, type to filter]
> Proceed with the current configuration
  Open an editor to review or modify the current configuration
  Choose another template (docker, podman, archlinux, fedora, ...)
  Exit
...
INFO[0029] READY. Run `lima` to open the shell.

Templates

Para crear instancias, Lima utiliza template que son VMs listas para ser utilizadas, lo que nos ahorra tiempo de configuración. Para ver las plantillas disponibles, ejecutamos el siguiente comando:

limactl create --list-templates
almalinux-8
almalinux-9
almalinux
alpine
...

Personalizar Instancias

Además de seleccionar nuestra plantilla, podemos personalizar la instancia que vamos a crear o desplegar a través de parámetros que podemos consultar con el siguiente comando limactl create --help.

A continuación, se muestra algunas de las opciones disponibles que tenemos para personalizar la instancia:

  • –name=default: Set the instance name to “default”
  • –cpus=4: Set the number of the CPUs to 4
  • –memory=8: Set the amount of the memory to 8 GiB
  • –vm-type=vz: Use Apple’s Virtualization.framework (vz) to enable Rosetta, virtiofs, and vzNAT
  • –mount-type=virtiofs: Use virtiofs for better performance
  • –mount-writable: Make the home mount (/Users/) writable
  • –network=vzNAT: Make the VM reachable from the host by its IP address template://fedora: Use Fedora

Ejemplos

limactl create --name="developer" --containerd "user" --cpus 2 --memory 2 --disk 10 --dns 1.1.1.1 --dns 8.8.8.8
limactl create --name="stg" --containerd "user" --cpus 2 --memory 2 --disk 10 --vm-type "vz"
limactl create --name="prod" --containerd "user" --cpus 2 --memory 2 --disk 10 --vm-type "qemu"  --arch "aarch64"

limactl list
NAME         STATUS     SSH                VMTYPE    ARCH       CPUS    MEMORY    DISK      DIR
developer    Stopped    127.0.0.1:0        qemu      x86_64     2       2GiB      10GiB     ~/.lima/developer
prod         Stopped    127.0.0.1:0        qemu      aarch64    2       2GiB      10GiB     ~/.lima/prod
stg          Stopped    127.0.0.1:0        vz        x86_64     2       2GiB      10GiB     ~/.lima/stg

Comandos para gestionar las instancias

limactl list #listar las instancias  existentes
limactl start developer #iniciar la instancia  'developer'
limactl shell developer  #acceder a la instancia 'developer'
limactl stop developer #detener la instancia 'developer'
limactl delete prod #eliminar la instancia 'developer'

Editar el archivo de configuración de una instancia creada.

Primero, identificamos el nombre de la instancia que necesitamos editar. En este caso, editaremos la instancia con el nombre alpine. Es importante tener en cuenta que la ruta del archivo dependerá del nombre de la instancia: $HOME/.lima/<nombre-instancia>/lima.yaml. Para editar el archivo utilizamos un editor de texto de nuestra preferencia.

cat $HOME/.lima/alpine/lima.yaml
# This template requires Lima v0.7.0 or later.
# Using the Alpine 3.19 aarch64 image with vmType=vz requires macOS Ventura 13.3 or later.

images:
  - location: "https://github.com/lima-vm/alpine-lima/releases/download/v0.2.35/alpine-lima-std-3.19.0-x86_64.iso"
    arch: "x86_64"
    digest: "sha512:e02599dc7fc4dc279d66d800f6edc68f6f112c4b370d4c74f43040214c53b23ae4c903ce56c7083fd56d5027ec33711d30d1c2e71836c60dc3bf639f76d4fa0e"
  - location: "https://github.com/lima-vm/alpine-lima/releases/download/v0.2.35/alpine-lima-std-3.19.0-aarch64.iso"
    arch: "aarch64"
    digest: "sha512:13e50601ee65af5d7a6dfd30bb41fd89f8bf806ecdb516c61fe238c3cf3b57cf67469418a99f329bb4c343e3387e6e0fd4fe20501cfd501f031f7244adc67215"
mounts:
  - location: "~"
  - location: "/tmp/lima"
    writable: true
# The built-in containerd installer does not support Alpine currently.
# Hint: use the "rd" ISO instead of the "std" ISO to enable containerd: https://github.com/lima-vm/alpine-lima/releases/
containerd:
  system: false
  user: false
cpus: 2
memory: 2GiB
disk: 10GiB

Container engines:

Containerd

Como se menciona en una de las secciones anteriores cuando ejecutamos lima start se despliega una instancia por defecto con containerd.

Para la gestión de los contenedores, debemos utilizar el comando lima nerdctl desde nuestra máquina host o acceder a la VM desplegada (runtime) mediante el comando lima, y luego ejecutar el comando nerdctl con sus respectivas opciones y parámetros.

lima nerdctl run -d -p 127.0.0.1:80:80 nginx:alpine # Para desplegar contenedores

Podman

Para crear una instancia de Lima con Podman sin root, utilice la plantilla podman:

limactl start --name=podman template://podman

Para crear una instancia de Lima con Podman rootful, utilice la plantilla podman-rootful:

limactl start --name=podman template://podman-rootful

Gestionar contenedores

Opción 1: Acceder a la instancia con limactl shell podman una vez dentro podemos ejecutar los típicos comandos de podman.

[xllauca@lima-podman xllauca]$ podman run hello-world
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /`  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Desktop:   https://podman-desktop.io
Documents: https://docs.podman.io
YouTube:   https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon:  @Podman_io@fosstodon.org

Opción 2: Desde la maquina host con el comando podman.lima, los argumentos y parámetros son los mismo a que si hubiéramos instalado “podman cli” en nuestro Mac.

podman.lima run -d -p 127.0.0.1:80:80 nginx:alpine
Integrar lima con Podman Desktop

Vaya a Configuración > Preferencias > Extensión: Lima, para cambiar el nombre y tipo de instancia.

  • Podman (por defecto)
    • Tipo: podman
    • Nombre: podman (nombre de la instancia creada con lima)

Texto alternativo

Posterior a eso reiniciamos la aplicación y podremos visualizar los contenedores antes desplegados con la opción 1 y 2. alt text

Docker

Para crear una instancia de Lima con Docker sin root, utilice la plantilla Docker:

limactl start --name=docker template://docker

Para crear una instancia de Lima con Docker rootful, utilice la plantilla docker-rootful:

limactl start --name=docker template://docker-rootful

¡Importante!

Para gestionar los contenedores desde nuestro host, Lima nos muestra mensajes de ayuda después de desplegar la instancia. Sin embargo, necesitamos tener instalado docker en nuestro Mac, lo cual no tiene mucho sentido. Por ello, utilizaremos el comando docker.lima desde nuestro Mac.

docker.lima context list #listamos los contextos disponibles
docker.lima context show #verificamos el contexto actual

docker.lima run -d -p 127.0.0.1:80:80 nginx:alpine
577fa6abc8225bdb2ad94632adc423fd18f1c7cb306501aa9c9b19131c8b4383

docker.lima ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
577fa6abc822   nginx:alpine   "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   127.0.0.1:80->80/tcp   admiring_meitner

Orquestación de contenedores

Kubernetes

Para desplegar un cluster de kubernetes ejecutamos el siguiente comando.

limactl start template://k8s

Para gestionar nuestro cluster tenemos dos opciones disponibles:

Opción 1: Tener instalado kubectl en nuestra maquina host, posterior es eso exportar KUBECONFIG a nuestra shell.

export KUBECONFIG="/Users/mysuer/.lima/k8s/copied-from-guest/kubeconfig.yaml"
kubectl run test --image=nginx

Opción 2: Gestionar el cluster con el comando de lima limactl shell k8s kubectl, podriamos crear un alias para mejor comodidad y guardar en nuestor shell. sin embargo los manifiestos debemos crear dentro de la instancia.

alias k="limactl shell k8s kubectl"
k get nodes -owide
NAME       STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
lima-k8s   Ready    control-plane   39m   v1.29.2   192.168.5.15   <none>        Ubuntu 22.04.3 LTS   5.15.0-92-generic   containerd://1.7.13

Nota: Lima implementa una máquina virtual que simultáneamente cumple las funciones de control-plane y nodo. Sin embargo, se presenta una limitación en caso de requerir alta disponibilidad (HA) en el control-plane o al agregar más nodos.