背景
私用のPCはmac(macbook air 2013 mid 古すぎ!!)。Docker Desktop for Macでは動作が遅かったので、しばらくDockerの利用はあきらめていた。
ファイルシステムが違うとか、そんな理由らしい・・・
最近になって、Limaを使用すると快適に作業できるとかいう記事を見かけたので環境構築してみた。ほとんど参考記事そのまま。
参考記事
環境
- Intel Mac (Macbook Air 2013 mid)
- limactl 0.9.1
- Docker 20.10.14
- Docker Compose 2.4.1
Lima、Dockerのインストール
これだけ。
brew install lima docker
Limaの設定ファイル
LimaはmacOS上でLinux仮想マシンを提供するツールらしい。似たようなものにvagrantもある。ちょっと違いのかもしれないが、WindowsでいうところのWSLみたいなものか。仮想マシンに対する設定ファイルをlima.yml作成する必要がある。docker用のサンプルも用意されている。とりあえず上記参考記事をほぼコピペで以下のようになった。
arch: "default"
images:
- location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.img"
arch: "x86_64"
- location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-arm64.img"
arch: "aarch64"
#仮想マシンに振り分けるリソース、貧弱・・・
cpus: 1
memory: "1GiB"
disk: "10GiB"
mounts:
- location: "~"
# CAUTION: `writable` SHOULD be false for the home directory.
# Setting `writable` to true is possible, but untested and dangerous.
writable: false
# 作業ディレクトリを指定(ホスト側の作業場所)
- location: "~/Documents/workspaces"
writable: true
ssh:
localPort: 60006
loadDotSSHPubKeys: true
containerd:
# Enable system-wide (aka rootful) containerd and its dependencies (BuildKit, Stargz Snapshotter)
# Default: false
system: false
# Enable user-scoped (aka rootless) containerd and its dependencies
# Default: true
user: true
provision:
# `system` is executed with the root privilege
- mode: system
script: |
#!/bin/sh
sed -i 's/host.lima.internal.*/host.lima.internal host.docker.internal/' /etc/hosts
- mode: system
script: |
#!/bin/bash
set -eux -o pipefail
command -v docker >/dev/null 2>&1 && exit 0
export DEBIAN_FRONTEND=noninteractive
curl -fsSL https://get.docker.com | sh
# NOTE: you may remove the lines below, if you prefer to use rootful docker, not rootless
systemctl disable --now docker
apt-get install -y uidmap dbus-user-session
# `user` is executed without the root privilege
- mode: user
script: |
#!/bin/bash
set -eux -o pipefail
systemctl --user start dbus
dockerd-rootless-setuptool.sh install
docker context use rootless
probes:
- script: |
#!/bin/bash
set -eux -o pipefail
if ! timeout 30s bash -c "until command -v docker >/dev/null 2>&1; do sleep 3; done"; then
echo >&2 "docker is not installed yet"
exit 1
fi
if ! timeout 30s bash -c "until pgrep rootlesskit; do sleep 3; done"; then
echo >&2 "rootlesskit (used by rootless docker) is not running"
exit 1
fi
hint: See "/var/log/cloud-init-output.log". in the guest
portForwards:
- guestSocket: "/run/user/{{.UID}}/docker.sock"
hostSocket: "{{.Dir}}/sock/docker.sock"
message: |
To run `docker` on the host (assumes docker-cli is installed):
$ export DOCKER_HOST=unix://{{.Dir}}/sock/docker.sock
$ docker ...
Lima環境構築
仮想マシンの起動
Limaはlimactlとういコマンドで扱うらしい。lima.ymlがあるディレクトリで下記コマンドを実行する。
limactl start ./lima.yml
参考記事にもあるが、lima.ymlを変更した場合は仮想環境を再作成する必要がある。なお、仮想マシン名はymlファイル名となる。今回の場合、「lima」が仮想マシン名となる。
仮想マシンの停止
limactl stop lima
仮想マシンの削除
limactl rm lima
lima.yml編集後に再度、limactl start ./lima.yml
で環境設定ファイルが反映されようだ。
確認
limactl list
以下のような感じで起動している仮想マシンの状態がわかる。
NAME STATUS SSH ARCH CPUS MEMORY DISK DIR
lima Running 127.0.0.1:60006 x86_64 1 1GiB 10GiB /Users/***/.lima/lima
仮想環境に入る場合
nyaao@MBA ~ % limactl shell lima
nyaao@lima-lima:/Users/nyaao$
ホストマシンから仮想環境のdockerを使う
ホストマシンにはDockerをインストールしていますが、このままだとlima上のdockerデーモンではなく、ホストマシン上のdockerデーモンを使用することになります。
DOCKER_HOST
の環境変数を上書きすることで、limaのシェルに入ることなく、ターミナルなどからlima上のdockerデーモンを操作できるようになります。
.zshrc
に下記を追記しておけば良いようです。
export DOCKER_HOST=unix:///${HOME}/.lima/lima/sock/docker.sock
パソコン再起動時の対応
パソコンを再起動すると仮想環境はstop状態になるようです。.zshrc
に下記を追記しておくと再起動時に仮想環境が自動起動します。
limactl start lima
あとがき
まだ環境構築したばかりなので、快適に動作するかわかりませんが、とりあえずできました。
Macbook Airが古すぎるので効果は感じられないかも、M1 Macほしいな・・・
M1を購入して1ヶ月ほどlima環境でdockerを使用しています。
今のところ、全く問題ないです。
追記
以前にDocker Desktopを使用しているとdocker-composeでのpull時に以下のエラーが出るっぽい。
error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH,
こちらによるとrm -fr ~/.docker
をしておくと良いみたい。