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)
Posterior a eso reiniciamos la aplicación y podremos visualizar los contenedores antes desplegados con la opción 1 y 2.
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.