Hướng dẫn cài đặt và sử dụng Lima trên macOS: Tạo máy ảo Linux nhẹ nhàng với QEMU và VZ Framework thay thế Docker Desktop miễn phí

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Docker Desktop trên macOS: Vấn đề thực tế và lý do nhiều người muốn thoát

Nếu bạn đang dùng macOS để phát triển phần mềm và cần chạy container Docker, khả năng cao là bạn đang dùng Docker Desktop. Nhưng từ 2022, Docker Desktop chuyển sang mô hình trả phí cho doanh nghiệp có trên 250 nhân viên hoặc doanh thu trên $10M/năm. Đó là lý do đầu tiên khiến nhiều team bắt đầu tìm giải pháp thay thế.

Ngoài vấn đề chi phí, Docker Desktop còn nổi tiếng về mức tiêu thụ tài nguyên. Trên MacBook M-series, Docker Desktop chạy một VM Linux ẩn bên dưới — và cái VM đó thường chiếm 2-4GB RAM ngay cả khi không có container nào đang chạy. Mình từng đo trên M1 Pro: Docker Desktop idle ngốn 3.2GB RAM. Với máy 16GB, đó là 20% tài nguyên cho cái nền.

So sánh các giải pháp thay thế Docker Desktop trên macOS

Hiện tại có vài lựa chọn phổ biến, mỗi cái có triết lý khác nhau:

  • Colima: Wrapper nhỏ gọn chạy Lima bên dưới, tập trung vào việc thay Docker Desktop nhanh nhất có thể. Cài xong là dùng ngay, không cần cấu hình nhiều.
  • Lima: Layer gốc mà Colima xây lên. Linh hoạt hơn nhiều — không chỉ Docker, bạn có thể chạy bất kỳ distro Linux nào, cấu hình VM chi tiết, dùng VZ Framework (Apple Virtualization) hoặc QEMU tùy mục đích.
  • OrbStack: UI đẹp, nhanh, nhưng closed-source và có bản free với giới hạn. Về bản chất vẫn là phần mềm thương mại.
  • Podman Desktop: Dùng Podman thay Docker engine, tương thích CLI nhưng một số tool sinh thái Docker chưa hoàn toàn support.

Phân tích ưu nhược điểm Lima so với các lựa chọn khác

Tiêu chí Lima Colima OrbStack Docker Desktop
Miễn phí hoàn toàn ✅ MIT ✅ Apache 2 ⚠️ Free có giới hạn ⚠️ Free cá nhân
Hiệu năng (Apple Silicon) ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
Tùy chỉnh VM ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐
Dễ setup ban đầu ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Hỗ trợ nhiều distro Chủ yếu Ubuntu/Fedora ❌ Ubuntu only

Lima phù hợp nhất nếu bạn muốn kiểm soát hoàn toàn môi trường, không phụ thuộc tool thương mại, và cần chạy nhiều VM với các distro khác nhau cho mục đích khác nhau.

Lima hoạt động thế nào: QEMU và VZ Framework

Lima (Linux Machines) hỗ trợ hai hypervisor backend:

  • QEMU: Emulation + KVM-style acceleration. Chạy được trên Intel Mac và Apple Silicon. Tương thích cao, stable, nhưng chậm hơn một chút.
  • VZ (Apple Virtualization Framework): API native của Apple, chỉ dùng được từ macOS 13+ trên Apple Silicon. Nhanh hơn đáng kể, overhead thấp hơn, nhưng ít linh hoạt hơn về emulation.

Với M-series Mac và macOS 13+, mình luôn khuyến nghị dùng VZ — tốc độ boot nhanh hơn gần 3 lần so với QEMU trên cùng hardware.

Lima cũng hỗ trợ 9p mount (QEMU) và virtiofs mount (VZ) để share thư mục từ macOS vào VM. virtiofs nhanh hơn 9p đáng kể, đặc biệt với workload I/O nhiều như build frontend.

Cài đặt Lima trên macOS

Yêu cầu

  • macOS 13 Ventura trở lên (để dùng VZ Framework)
  • Homebrew đã cài sẵn
  • Khoảng 2GB disk cho image VM

Cài Lima qua Homebrew

# Cài Lima
brew install lima

# Kiểm tra version
limactl --version
# lima version 1.x.x

Tạo VM đầu tiên — Ubuntu với VZ Framework

Lima dùng file YAML để định nghĩa VM. Có sẵn nhiều template, hoặc bạn tự viết cấu hình tùy ý:

# Xem danh sách template có sẵn
limactl start --list-templates

# Tạo VM Ubuntu mặc định (dùng QEMU)
limactl start

# Tạo VM Ubuntu dùng VZ Framework (nhanh hơn trên Apple Silicon)
limactl start --vm-type vz --mount-type virtiofs ubuntu

Lần đầu chạy Lima sẽ download image (~700MB cho Ubuntu), sau đó boot VM tự động. Quá trình này mất 2-5 phút tùy tốc độ mạng.

# Kiểm tra trạng thái VM
limactl list

# Kết quả mẫu:
# NAME      STATUS     SSH             VMTYPE    ARCH      CPUS    MEMORY    DISK
# default   Running    127.0.0.1:60022 vz        aarch64   4       4GiB      100GiB

# SSH vào VM
limactl shell default

# Hoặc dùng lệnh shell nhanh
lima

Tùy chỉnh VM với file YAML

Tạo file cấu hình riêng để kiểm soát CPU, RAM, mount points:

# ~/lima-dev.yaml
vmType: vz
os: Linux
arch: aarch64

# Phân bổ tài nguyên
cpus: 4
memory: 8GiB
disk: 60GiB

# VZ Framework options
rosetta:
  enabled: true   # Chạy x86_64 binary trên Apple Silicon qua Rosetta
  binfmt: true

# Mount thư mục từ macOS vào VM
mounts:
  - location: "~/projects"
    mountPoint: /projects
    writable: true
    9p:
      securityModel: mapped-xattr
  - location: "~/.ssh"
    mountPoint: /home/user.linux/.ssh
    writable: false

# Cổng forward tự động (Lima detect port listen trong VM)
portForwards:
  - guestPort: 3000
    hostPort: 3000
  - guestPort: 8080
    hostPort: 8080

# Cài package khi provision lần đầu
provision:
  - mode: system
    script: |
      #!/bin/bash
      apt-get update
      apt-get install -y git curl build-essential
  - mode: user
    script: |
      #!/bin/bash
      # Setup user environment
      echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
# Khởi động VM từ file config tùy chỉnh
limactl start ~/lima-dev.yaml

# Kết nối vào VM dev
limactl shell lima-dev

Tích hợp Docker với Lima — thay thế Docker Desktop hoàn toàn

Lima có template sẵn cho Docker, chạy Docker Engine bên trong VM Lima:

# Tạo VM Lima với Docker engine (template docker)
limactl start template://docker

# Hoặc với VZ Framework
limactl start --vm-type vz --mount-type virtiofs template://docker

Sau khi VM chạy, cấu hình Docker context trên macOS để trỏ vào Lima:

# Tạo Docker context trỏ vào Lima socket
docker context create lima-docker \
  --docker "host=unix:///Users/$USER/.lima/docker/sock/docker.sock"

# Switch sang context Lima
docker context use lima-docker

# Kiểm tra Docker đã hoạt động chưa
docker info
docker run --rm hello-world

Từ đây, mọi lệnh docker trên terminal macOS sẽ chạy qua Docker Engine bên trong Lima VM. Không cần Docker Desktop nữa.

Dùng Docker Compose với Lima

# Cài Docker Compose plugin trên macOS (không cần cài vào VM)
brew install docker-compose

# Chạy compose như bình thường
cd ~/projects/my-app
docker compose up -d

# Kiểm tra containers
docker compose ps

Quản lý nhiều VM Lima — workflow thực tế

Mình chạy homelab với Proxmox VE quản lý 12 VM và container — đó là môi trường test chính cho server-side. Còn trên MacBook dùng hàng ngày, Lima là công cụ đi kèm không thể thiếu để test nhanh môi trường Linux mà không cần SSH vào server. Mình thường có 2-3 VM Lima song song: một cái chạy Docker, một cái để test script Linux trước khi deploy lên Proxmox.

# Xem tất cả VM
limactl list

# Dừng VM (giải phóng RAM, VM vẫn tồn tại)
limactl stop default

# Xóa VM hoàn toàn
limactl delete my-test-vm

# Clone config VM
limactl edit default  # Mở YAML editor

# Start VM cụ thể
limactl start docker

# Chạy lệnh trong VM không cần SSH tương tác
limactl shell docker -- docker ps -a
limactl shell docker -- bash -c "cd /projects && ls -la"

Snapshot và backup VM

# Snapshot VM (chỉ hỗ trợ với VZ backend trên macOS 14+)
limactl snapshot save default my-snapshot-before-test

# List snapshots
limactl snapshot list default

# Restore snapshot
limactl snapshot restore default my-snapshot-before-test

# Xóa snapshot
limactl snapshot delete default my-snapshot-before-test

Troubleshooting thường gặp

VM không boot được

# Xem log chi tiết
limactl start --debug ubuntu 2>&1 | tail -50

# Kiểm tra log của VM đang chạy
cat ~/.lima/default/serial.log | tail -30

Mount thư mục không có quyền ghi

# Kiểm tra mount trong VM
limactl shell default -- mount | grep projects

# Đảm bảo YAML có writable: true
# Nếu dùng virtiofs, thêm vào ~/.lima/default/lima.yaml:
# mounts:
#   - location: ~/projects
#     writable: true

Docker socket không kết nối được

# Kiểm tra socket tồn tại không
ls -la ~/.lima/docker/sock/docker.sock

# Reset Docker context về default nếu cần
docker context use default

# Sau đó tạo lại context Lima
docker context create lima-docker \
  --docker "host=unix://$HOME/.lima/docker/sock/docker.sock"

Kết luận: Lima có thực sự thay được Docker Desktop không?

Sau vài tháng dùng Lima + Docker context trên MacBook M2, câu trả lời ngắn gọn là: có, hoàn toàn. Thời gian boot VM khoảng 5-8 giây với VZ Framework, RAM idle khoảng 400MB, và mọi lệnh docker hoạt động như bình thường.

Điểm trừ duy nhất là setup ban đầu cần vài bước thủ công hơn Docker Desktop. Nhưng làm một lần xong thì quên luôn — VM tự start cùng macOS nếu bạn cấu hình, và Docker context đã được set sẵn.

Nếu bạn cần đơn giản hơn và chỉ dùng Docker, Colima là lựa chọn tốt hơn — nó wrap Lima và giảm bớt bước cấu hình. Còn nếu muốn chạy nhiều distro khác nhau, test môi trường Linux đa dạng, hoặc cần control chi tiết hơn, Lima là công cụ bạn cần.

Share: