M1 MacでLima + Dockerの環境構築

Docker Desktopが一定条件で有償化*1されるので、脱Docker Desktopしてみた。 意外とそんなにハマることもなく環境構築に成功して、Docker Desktopを使っていた時代とほぼ変わらない開発体験が得られました。

Limaを選んだ理由

  • lima コマンドを打つだけでデフォルトのVM(Ubuntu)のシェルに入れる(もしくはlimaの後ろに付加した文字列がそのままコマンドになる)
  • 標準設定でホストとネットワークを共有する(dockerでportをexportしたらlocalhost:1234でアクセスできる)
    • --net=host が使える
  • 標準設定でMacのホームディレクトリがVMにマウントされてる(嫌だったら設定変えられる, sshfsでマウントされてるだけ)

環境

  • M1 Mac Book Pro
    • Intelでもいけるはず

Lima側の構築

  • これがDocker Daemonを実行するVM(Ubuntu)
  • コマンドは全てMacのターミナルで入力
$ uname -a
Darwin my-m1-mac 21.2.0 Darwin Kernel Version 21.2.0: Sun Nov 28 20:28:41 PST 2021; root:xnu-8019.61.5~1/RELEASE_ARM64_T6000 arm64

$ brew install lima

$ limactl start
# ディスク容量やCPUなど、設定をカスタマイズしたい場合は好みで変える。特に何も変えなくてもOK

# 起動確認
# limaコマンドだけ打つとシェルログインできます
$ lima uname -a
Linux lima-default 5.13.0-22-generic #22-Ubuntu SMP Fri Nov 5 13:22:27 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

$ lima sh -c 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg'
$ lima sh -c 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null'

$ lima sudo apt-get update
$ lima sudo apt-get install docker-ce docker-ce-cli containerd.io

# 動作確認
$ lima sudo docker run hello-world

# Macと通信できるように設定
$ lima sudo sh -c 'echo "{\"hosts\": [\"tcp://127.0.0.1:2375\", \"unix:///var/run/docker.sock\"]}" > /etc/docker/daemon.json'
$ lima sudo mkdir -p /etc/systemd/system/docker.service.d/
$ lima sudo sh -c 'echo "[Service]\nExecStart=\nExecStart=/usr/bin/dockerd" > /etc/systemd/system/docker.service.d/override.conf'

$ lima sudo systemctl daemon-reload
$ lima sudo systemctl restart docker.service

Mac側の構築

  • dockerのクライアントをインストールする
  • コマンドは全てMacのターミナルで入力
$ cd ~
$ mkdir bin

# Intel Macの場合
$ curl -o docker.tgz https://download.docker.com/mac/static/stable/x86_64/docker-20.10.9.tgz

# M1 Macの場合
$ curl -o docker.tgz https://download.docker.com/mac/static/stable/aarch64/docker-20.10.9.tgz

$ tar xvf docker.tgz
$ mv docker/docker ~/bin/docker
$ rm docker.tgz
$ rm -rf docker/

# .bashrcや.zshrcのPATHに~/binを通す

# .bashrcや.zshrcで
# export DOCKER_HOST='tcp://127.0.0.1:2375'
# を追記する

$ docker version
Client:
 Version:           20.10.8
 API version:       1.41
 Go version:        go1.16.6
 Git commit:        3967b7d
 Built:             Fri Jul 30 19:55:20 2021
 OS/Arch:           darwin/arm64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.12
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.12
  Git commit:       459d0df
  Built:            Mon Dec 13 11:43:40 2021
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          v1.5.8
  GitCommit:        1e5ef943eb76627a6d3b6de8cd1ef6537f393a71
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba2
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# 動作確認
$ docker run hello-world

docker-composeも入れておく

# Intel Macの場合
$ curl -Lo docker-compose https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-darwin-x86_64

# M1 Macの場合
$ curl -Lo docker-compose https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-darwin-aarch64

$ chmod +x docker-compose
$ mv docker-compose ~/bin/

普段の使い方

VMを開始する時

$ limactl start

VMを停止する時

$ limactl stop

もっと使いこなすには