Skip to content

Instantly share code, notes, and snippets.

@kawaz
Last active Oct 20, 2021
Embed
What would you like to do?
docker/docker-compose を nerdctl に置き換えるラッパースクリプト。Mac環境での lima のセットアップ補助も兼ねてる。

Introduction

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/ 内の設定を弄ったりすれば良いと思うが必要になったときにググればよい。

Setup

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

Usage

普通に 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-composedocker コマンドと同様にラッパーを経由して普通に使える。

$ 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)

一応ラッパーを経由して limanerdctl を使っている事を忘れないように stderr に実際に実行してるコマンドを表示するようにもしている。この表示は tty の割り当てが無ければ表示しないようにしてある(例えば標準入力に空文字を入れて実行するなど)。

#!/bin/bash
# Repository: https://gist.github.com/kawaz/118fd196e447e22257bc0061bf088598
set -eu
cmd=(nerdctl)
if type -P nerdctl >/dev/null 2>&1; then
:
elif type -P lima >/dev/null 2>&1; then
lima true || limactl start
cmd=(lima nerdctl)
else
echo "nerdctl not found" >&2
if [[ $OSTYPE == darwin* ]]; then
echo "lima not found" >&2
echo -e "please execute: \x1b[36mbrew install lima\x1b[0m" >&2
fi
exit 1
fi
if [[ $(basename -- "$0") == docker-compose ]]; then
cmd+=(compose)
fi
tty >/dev/null 2>&1 && {
echo -ne "redirect:\x1b[36m"
printf " %q" "${cmd[@]}" "$@"
echo -e "\x1b[0m"
} >&2
exec "${cmd[@]}" "$@"
@kawaz

This comment has been minimized.

Copy link
Owner Author

@kawaz kawaz commented Oct 20, 2021

Mac が起動したらコンテナも自動起動したい場合は crontab -e で以下を追加しておけばOK

@reboot /usr/local/bin/limactl start 2>&1 >/tmp/cron.limactl-start
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment