Docker Desktop は有料化云々については元々リポジトリとして便利に使わせて貰ってて課金済みだったしどうでもよくて。それよりも Docker Desktop for Mac が重くて消費電力馬鹿食いするのに辟易したので、この機に lima を試してみることにした。
そしたら導入は簡単だし Docker Desktop に比べてかなり負荷も軽い(アイドル時にアクティブモニタで見るとCPU3%程度)し、面倒かなと思ってたポートフォワードについても lima が勝手に自動ポートフォワードしてくれるので QEMU 内で動いてるコンテナ内のサーバプロセスへのポート開けとかの作業は一切不要で普通に localhost でアクセス出来ちゃうし超便利だった。て事でまだ30分くらいしかさわってないけど気に入ったので Docker Desktop はサクサク消す事にした。
更に最初は nerdctl
って打つのに慣れない(明日には忘れてるはず)ので今まで通り docker
/docker-compose
のコマンドで lime nerdctl
がたたけるようにするラッパーコマンドを作っておいた。これは未来の自分が lima や nerdctl の導入や使い方について忘れたときの備忘録も兼ねている。
lima の細かい設定についてはここでは書いてない。というか何もしてない状態で今のところ特に不満は無い。ホストのリソースをどれくらい使って良いかとか変えたくなったら ~/.lima/
内の設定を弄ったりすれば良いと思うが必要になったときにググればよい。
dest=~/bin/_docker2nerdctl.sh; \
curl -o "$dest" -sL https://gist.github.com/kawaz/118fd196e447e22257bc0061bf088598/raw/_docker2nerdctl.sh &&
chmod 755 "$dest" &&
ln -sfn "$dest" "$(dirname -- "$dest")"/docker &&
ln -sfn "$dest" "$(dirname -- "$dest")"/docker-compose
普通に docker
または docker-compose
コマンドとして symlink 経由で使うだけ。
あと未来の自分は絶対 lima
についての細かい事を忘れてる筈という前提の下に、初回実行時は lima が起動していないので brew install lima
しろという案内を出すし、lima
が入ってても start されてなければ limactl start
は勝手に実行されるようにしてある。
$ docker ps
nerdctl not found
lima not found
please execute: brew install lima
lima を入れると qemu も無ければ勝手に入る。
$ brew install lima
brew install lima
==> Downloading https://ghcr.io/v2/homebrew/core/qemu/manifests/6.1.0_1
Already downloaded: /Users/kawaz/Library/Caches/Homebrew/downloads/322ae257c3148c3a6ae120be36715bd712c67baa6248b8f8f6eb4d56ce46f58c--qemu-6.1.0_1.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/qemu/blobs/sha256:5213e72d5dc5641593b415f5e37618cbd3d1e291d25c4e9478c86b5b8a9c8f08
Already downloaded: /Users/kawaz/Library/Caches/Homebrew/downloads/652e96ea1539e44d711cb191c772cee1ee99ae5975a76dc145d671f5a7e41742--qemu--6.1.0_1.big_sur.bottle.tar.gz
==> Downloading https://ghcr.io/v2/homebrew/core/lima/manifests/0.7.1
Already downloaded: /Users/kawaz/Library/Caches/Homebrew/downloads/9e032cd7030f95dcedca01e3a80d870123e481af7f769b081de57adaecf7e5b2--lima-0.7.1.bottle_manifest.json
==> Downloading https://ghcr.io/v2/homebrew/core/lima/blobs/sha256:3de7bb2f85dbbafbb5f6a5536eae0a6133b053b1d1a659288e0ea6b1a82d47e7
Already downloaded: /Users/kawaz/Library/Caches/Homebrew/downloads/dc01fa11525bb49872067a014ac59000c262692598aa8b62304135164aa9a753--lima--0.7.1.big_sur.bottle.tar.gz
==> Installing dependencies for lima: qemu
==> Installing lima dependency: qemu
==> Pouring qemu--6.1.0_1.big_sur.bottle.tar.gz
🍺 /usr/local/Cellar/qemu/6.1.0_1: 161 files, 552MB
==> Installing lima
==> Pouring lima--0.7.1.big_sur.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
==> Summary
🍺 /usr/local/Cellar/lima/0.7.1: 30 files, 25.6MB
==> Caveats
==> lima
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
本ラッパースクリプトを使う際に limactl start
されてなければ勝手に start してくれる。既に start 済みなら普通に docker コマンドとしてサクッと動く。
$ docker ps
FATA[0000] instance "default" does not exist, run `limactl start default` to create a new instance
? Creating an instance "default" Proceed with the default configuration
INFO[0005] Attempting to download the image from "~/Downloads/hirsute-server-cloudimg-amd64.img"
:
INFO[0182] READY. Run `lima` to open the shell.
redirect: lima nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ docker ps
redirect: lima nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
lima には自動ポートフォワード機能が付いてるので、QEMU 内で 8080 ポートを LISTEN するだけで Mac 側の 8080 ポートを経由してアクセスできちゃうのが超便利。
# docker run -d -p 8080:80 nginx:alpine
redirect: lima nerdctl run -d -p 8081:80 nginx:alpine
docker.io/library/nginx:alpine: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:686aac2769fd6e7bab67663fd38750c135b72d993d0bb0a942ab02ef647fc9c3: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:af466e4f12e3abe41fcfb59ca0573a3a5c640573b389d5287207a49d1324abd8: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:513f9a9d8748b25cdb0ec6f16b4523af7bba216a6bf0f43f70af75b4cf7cb780: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:61074acc7dd227cfbeaf719f9b5cdfb64711bc6b60b3865c7b886b7099c15d15: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:4dd4efe90939ab5711aaf5fcd9fd8feb34307bab48ba93030e8b845f8312ed8e: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:c1368e94e1ec563b31c3fb1fea02c9fbdc4c79a95e9ad0cac6df29c228ee2df3: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:3e72c40d0ff43c52c5cc37713b75053e8cb5baea8e137a784d480123814982a2: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:969825a5ca61c8320c63ff9ce0e8b24b83442503d79c5940ba4e2f0bd9e34df8: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 7.9 s total: 9.5 Mi (1.2 MiB/s)
64721fe62582d3d226781d89dce6466fb542cf1f6c1f7262ce1743ae24477922
$ curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
:
$ docker ps
redirect: lima nerdctl ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64721fe62582 docker.io/library/nginx:alpine "/docker-entrypoint.…" 4 minutes ago Up 0.0.0.0:8080->80/tcp
docker-compose
も docker
コマンドと同様にラッパーを経由して普通に使える。
$ docker-compose
redirect: lima nerdctl compose
NAME:
nerdctl compose - Compose
USAGE:
nerdctl compose command [command options] [arguments...]
COMMANDS:
up Create and start containers
logs View output from containers.
build Build or rebuild services
down Remove containers and associated resources
help, h Shows a list of commands or help for one command
OPTIONS:
--file value, -f value Specify an alternate compose file
--project-directory value Specify an alternate working directory
--project-name value, -p value Specify an alternate project name
--env-file value Specify an alternate environment file
--help, -h show help (default: false)
一応ラッパーを経由して lima
や nerdctl
を使っている事を忘れないように stderr に実際に実行してるコマンドを表示するようにもしている。この表示は tty の割り当てが無ければ表示しないようにしてある(例えば標準入力に空文字を入れて実行するなど)。
Mac が起動したらコンテナも自動起動したい場合は
crontab -e
で以下を追加しておけばOK