この記事を見ると嬉しい人
下記を満たす人が見ると嬉しいであろう記事です。
どこかが欠ける人はヒントにはなるかもしれませんが、他により良い記事があるかもしれません。
- MacでDockerを使いたい
- Docker Desktop for Macを使っている
- 有料になるから回避したい
- Docker Hubは無くていい
- 構築済みイメージは一度消えても良い
- I/O含め速度至上主義とまでは考えていない
- Intel Macを使っている(M1で同じ手順が通じるかは確認していません)
- OSはMonterey 12.1(他のバージョンは未確認)
- ターミナルを触ることにアレルギーがない
やること
Docker Desktop for Macをアンインストールし、LimaでDocker Engineを起動します。
ホスト側(mac)からUNIXドメインソケットを使ってLima上のDocker Engineにアクセスします。
この方法であれば、Docker Desktopを使っていたときとほぼ同じ感覚でDockerを利用しつづけることができます。
ざっくり手順
- Docker Desktop for Macのアンインストール
- Lima、Docker CLIのインストール
- Docker Composeのインストール
- Lima用イメージの作成
- 動作確認
詳細手順
Docker Desktop for Macのアンインストール
- Docker メニューから Troubleshoot を選んで Uninstall を選択
- Docker Uninstall shellをローカルに保存し、rootで実行
Lima、Docker CLIのインストール
Homebrewでちゃちゃっとインストールします。
brew install lima docker
この時、
Error: python@3.9: the bottle needs the Apple Command Line Tools to be installed.
You can install them, if desired, with:
xcode-select --install
な感じでエラーになって止まってしまう場合は、書いてあるとおり
xcode-select --install
してxcode commandline toolsをインストールしてから再実行します。
よしこれで。。。と思ったところでさらに
Error: Permission denied @ apply2files -
みたいなエラーで止まってしまう場合は見たまま、権限のエラーなので解消してやります。
sudo chown -R $(whoami) $(brew --prefix)/*
これで今度こそインストール完了。
Docker Composeのインストール
せっかくなのでv2を使う。
公式ドキュメントを確認すると、どうやらmacはDocker Desktop使えばいいよと書いてます。
が、Docker Desktopはアンインストールしたんや。。。
ということで、その真下にあるLinuxの手順に則って手動インストールを行います。
Linux向けの手順としながらも、バイナリはちゃんとmac用も用意されているのでご安心を。
Intel macなのでx86_64のバイナリを使います。
バイナリのパスはこのままでも使えるとは思いますが、リリースページに添付されているものを参照してください。
mkdir ~/.docker/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-darwin-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
ダウンロードが完了したら実行権限の付与をしておきます。
ここで一旦、コマンド使えるか確認しておきましょう。
docker compose version
バージョンが表示されたら完了。
Lima用イメージの作成
[公式サンプル]をベースにというかほぼそのまま使います。
それっぽいディレクトリを作って定義ファイルをダウンロードします。
mkdir ~/Lima
curl https://github.com/lima-vm/lima/blob/master/examples/docker.yaml > ~/Lima/docker.yml
ダウンロードした定義ファイルをエディタで開き、マウントの設定を変更します。
ホームディレクトリ「~」がマウントされるようになっていますが、書き込みができないので書き込みをできるようにしておきます。
mounts:
- location: "~"
writable: true #これを足す
これでホームディレクトリがマウントされますが、シンボリックリンクは効かないのでLimaのインスタンスやDockerでアクセスするパスにシンボリックリンクが含まれる場合は、実パスを使うように気をつけましょう。
また、書き込み可能な状態でホームディレクトリをマウントするのはちょっと。。。という場合は影響範囲を絞ったディレクトリを作り、このディレクトリを追加でマウントするとよいです。
例えば
mkdir ~/Project
としてディレクトリを作っておき、
mounts:
- location: "~"
- location: "~/Project"
writable: true
とすれば、ホームディレクトリは読み取りのみで、追加で~/Project
が書込み可能な状態でマウントされます。
[公式サンプル]:https://github.com/lima-vm/lima/blob/master/examples/docker.yaml
設定が完了したのでLimaのインスタンスを立ち上げます。
cd ~/Lima
limactl start docker.yml
初回起動時はymlを指定してstartします。
起動シーケンスに入ると「設定どうする?」という感じの選択肢が提示されるので
Proceed with the default configuration
を選択します。
2回目以降はファイル名の拡張子除いた部分がインスタンス名になっているので
limactl start docker
で起動します。
停止の時などもこの名前を利用します。
起動したdocker
インスタンスのshellを利用するには
limactl shell docker
を叩きます。そんなに使うことがないにしても、若干面倒なのでlima
だけで使えるようにデフォルトインスタンスの設定をしておきます。
export LIMA_INSTANCE=docker
次に、ホスト側からLimaのDocker Engineにアクセスできるようにします。
export DOCKER_HOST=unix://$HOME/.lima/lima_docker/sock/docker.sock
ここまでの作業でDocker Desktopと同じ感覚でdockerが使えるようになりました。
使ってみる
とりあえずバージョンを見てみます。
docker version
無事バージョンが出力されました。
次に手元にある適当なdocker-compose.ymlを使って動かしてみます。
docker compose up -d
error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``
なんかエラーでました。
コンフィグのキーが変わっているようです。
参考:Docker Community Forum
ズバリ
Solution:
In ~/.docker/config.json change credsStore to credStore
と書かれているので、ファイルを開いてキーを書き換えます。
そして再びupしてみます。
Error response from daemon: pull access denied for **********, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
またエラーがでました。
docker login
で「ログインしておけよ」って言われています。
「適当な」docker-compose.ymlの中を確認すると、Docker Hubからイメージを取得していました。
この参照をやめてdocker-compose.ymlにはbuildコマンドを使ってDockerfileからイメージを作成するように記載しました。
今度こそupすると無事環境構築できていることが確認できました。
おまけ
Limaの操作
- 起動中のインスタンス一覧
limactl list
- 停止
limactl stop docker
- 削除
limactl delete docker
- VMのスペック調整
vi ~/Lima/docker.yml
cpus: 2
memory: "2GiB"
disk: "10GiB"
の感じで指定可能。
- ボリュームのマウントを変えたい:一旦Limaのイメージを削除してから作り直します。
limactl stop docker
limactl rm docker
vi ~/Lima/docker.yml
~設定変更~
limactl start ~/Lima/docker.yml
参考にさせてもらった記事