limaを使ってDockerDesktopなしでmacのdocker環境構築。sshfsのエラー対処も実施。

前置き

Docker Desktopの有料化にあたり、別の手段でのDocker環境の構築をする必要に追われている方もいらっしゃるかもしれません。 and-engineer.com

いろんな代替手段があると思いますが、以下のサイトを参考にさせていただきlima利用でのDocker環境構築を行いました。 korosuke613.hatenablog.com その際に、自分の環境だとうまくいかない箇所があったのでその対処法を記録しておきたいと思います。

環境

発生したエラーについて

いつ

:前述のサイトの手順「仮想マシンの構築」のlimactl start実行時
Docker Desktop 無しで Docker を使う with lima on Mac - cangoxina

どんな

:sshfsのインストールが完了せず、仮想マシンがrunningの状態になりませんでした。

INFO[0003] [hostagent] Waiting for the essential requirement 1 of 5: "ssh" 
INFO[0013] [hostagent] Waiting for the essential requirement 1 of 5: "ssh" 
INFO[0042] [hostagent] Waiting for the essential requirement 1 of 5: "ssh" 
INFO[0043] [hostagent] The essential requirement 1 of 5 is satisfied 
INFO[0043] [hostagent] Waiting for the essential requirement 2 of 5: "user session is ready for ssh" 
INFO[0043] [hostagent] The essential requirement 2 of 5 is satisfied 
INFO[0043] [hostagent] Waiting for the essential requirement 3 of 5: "sshfs binary to be installed" 
(中略。同じ行が何度も出てきました。)
INFO[0523] [hostagent] Waiting for the essential requirement 3 of 5: "sshfs binary to be installed" 
INFO[0563] [hostagent] Waiting for the essential requirement 3 of 5: "sshfs binary to be installed" 
FATA[0602] did not receive an event with the "running" status 

ログファイルによると

※~/.lima/docker配下のserial.logを参照します。
以下のようにfailure resolving等のメッセージが出力されており、名前解決ができていないようです。

[   22.532871] cloud-init[1461]: + apt-get update
[   42.628075] cloud-init[1461]: Ign:1 http://archive.ubuntu.com/ubuntu impish I
nRelease
[   52.629718] cloud-init[1461]: Ign:2 http://security.ubuntu.com/ubuntu impish-
security InRelease
[   72.672838] cloud-init[1461]: Ign:3 http://archive.ubuntu.com/ubuntu impish-u
pdates InRelease
[   83.676650] cloud-init[1461]: Ign:2 http://security.ubuntu.com/ubuntu impish-
security InRelease
[  102.719015] cloud-init[1461]: Ign:4 http://archive.ubuntu.com/ubuntu impish-backports InRelease
[  115.730931] cloud-init[1461]: Ign:2 http://security.ubuntu.com/ubuntu impish-security InRelease
[  132.765184] cloud-init[1461]: Ign:1 http://archive.ubuntu.com/ubuntu impish InRelease
[  149.782665] cloud-init[1461]: Err:2 http://security.ubuntu.com/ubuntu impish-security InRelease
[  149.783151] cloud-init[1461]:   Temporary failure resolving 'security.ubuntu.com'
[  162.811690] cloud-init[1461]: Ign:3 http://archive.ubuntu.com/ubuntu impish-updates InRelease

その結果、

[  373.584434] cloud-init[1461]: E: Package 'sshfs' has no installation candidat
e

となりsshfsがインストールできていないため、仮想環境の起動が成功となっていないようでした。

docker環境構築手順について

通常のインストール手順

$ brew install lima
$ brew install docker
$ cd ~/Desktop
$ mkdir lima
$ cd lima
$ vi docker.yaml
※ <https://github.com/lima-vm/lima/blob/master/examples/docker.yaml>の内容をペーストします。     
※ 公式がdocker環境構築用のyamlファイルを用意してくださっています・・・!  

$ limactl start ./docker.yaml
※ ここでsshfsのインストール待ちのままfailureになるなら環境構築作業は以下に続きます。ならないなら多分成功です!以下のエラー対処1・2を飛ばして「エラーなく起動できた後」に進んでください。

エラー対処その1

DNSサーバーのアドレス設定を修正します。
なお、再度sshfsのインストール等必要なライブラリのインストールを行なってほしいので、DNS設定修正後はサービスの再起動ではなくlimaのインスタンス自体を再起動させています。

$ limactl shell docker
$ sudo vi /etc/systemd/resolved.conf
※ #DNS=となっている行を、DNS=8.8.8.8 8.8.4.4 に書き換えて保存します。(GoogleのPublicDNS以外を使用している人は適宜各自の環境におけるDNSのアドレスにしてください。例えば僕の家では192.168.10.1でした。(ちなみに、僕はmac自体のDNSサーバーのipアドレスは8.8.8.8にしていたのですが、スマホのwi-fi設定詳細から本来のDNSサーバーのアドレスがわかりました))

$ exit
$ limactl stop docker
$ limactl start docker
※ ここでまだ同様のエラーが出るなら以下に続く。ならないなら多分成功!

エラー対処その2

もともと/etc/resolv.conf/run/systemd/resolve/stub-resolv.conf へのシンボリックリンクになっていると思いますが、いったんそのリンクを解除して/run/systemd/resolve/resolv.conf へのリンクに変更します。
これにより、ローカルDNSゾルバには任せず外部のDNSゾルバを見に行かせるようにします。

$ limactl shell docker
$ ls -l /etc/resolv.conf
$ sudo rm -f /etc/resolv.conf
$ sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
※ sudo: unable to resolve host lima-docker: Temporary failure in name resolution と出るかもしれませんがここではスルーします。

$ exit
$ limactl stop docker
$ limactl start docker

スルーしたエラーは、limactl起動のエラーとはまた別のエラー(ホストネームの設定がきちんとできていない模様?)なのでいったんここではスルーしていますが、以下サイトを参考に対処を行えばこのエラーは発生しなくなると思います。

qiita.com

エラーなく起動できた後

起動が成功すれば以下のような感じの文言が出力されると思います。

  To run `docker` on the host (assumes docker-cli is installed), run the following commands:
  ------
  docker context create lima --docker "host=unix:///Users/【xxx】/.lima/docker/sock/docker.sock"
  docker context use lima
  docker run hello-world
  ------

出力されたコマンド通り実行しても良いのですが、docker contextをいちいち設定するのは手間なので別の方法を取ります。
(limactl startで指定したdocker.yamlの5、6行目にTo run 'docker' on the host で記載してある件です。)

出力されているhost=の内容(unix:///....の部分 )をコピーします。
ターミナルでzshを使っている場合は、~/.zshrc内にexport DOCKER_HOST='unix:///Users/【xxx】/.lima/docker/sock/docker.sock' という感じでコピーした値で行を追記します。
~/.zshrcの保存後、$source ~/.zshrcを実行します。
$docker run hello-world$ docker ps などが問題なく動かせることを確認します。

PCを再起動した後

再起動後はlimaのインスタンスは停止しているため、再起動前のようにdockerコマンドを使いたいという場合はdocker用のlimaのインスタンスを起動する必要があります。

$ limactl start docker

起動が確認できたら、$ docker psなどを実行して動作確認を行います。
なお、前述の.zshrcへのDOCKER_HOSTの設定は実施済みの前提です。(未実施の場合はdockerコマンド実行時に、Dockerのデーモンが動いていますか?といったエラーメッセージが出てくると思います。)

再起動後も常にdockerコマンドを使う場合

mac起動時に自動でlimaのdockerのインスタンスを起動させるコマンドを実行させると良いかと思います。
こちらのサイトの手順に従って設定を行います。
renoji.com

まずは、起動用のシェルスクリプトを用意します。
(僕は、limactl startで指定するdocker.yamlと同じフォルダに起動用のファイルを用意することにしました。)

$ cd ~/Desktop/lima
$ vi runLima.sh

runLima.shの中身は以下の通りにしました。

#!/bin/bash

limactl start docker

続いて、シェルスクリプトを起動するcommandファイルを作成します。

$ vi runLima.command

中身は、runLima.shのフルパスを記述した1行だけです。 以下の感じです。

/Users/【ユーザー名】/Desktop/lima/runLima.sh

続いて、実行権限エラーが出ないように権限設定をしておきます。
(自分がログインした時に実行させるものだからかchmod 700でも動作に問題はないのですが、macのサポートサイト https://support.apple.com/ja-jp/guide/terminal/apdd100908f-06b3-4e63-8a87-32e71241bab4/mac に755と書いてあるので755にしておきます)

$ chmod 755 runLima.command

いったんlimaのインスタンスを停止させ、起動用ファイルに問題がないか動作確認を行います。

$ limactl stop docker
$ ./runLima.command
※ limactl start dockerを実行した時と同じような出力になればOK

動作確認に問題がなければ、「システム環境設定」→「ユーザとグループ」→「ユーザを選択」→「ログイン項目」→「+」ボタンを押し、先ほど作成したrunLima.commandを指定します。
その後PCを再起動して動作確認を行います。
ターミナルが自動起動してスクリプトが実行され、「プロセスが完了しました」と出て来ればOKです。ターミナルを閉じてあげます。

以上で環境構築終了です。
以下は余談かな。

resolv.confについて

いろんなresolv.confが出てきて混乱しました・・・。仕組みがきちんと理解できていないです・・・。

/etc/resolv.conf

ただのリンクなので実態としては存在しない。

/run/systemd/resolve/resolv.conf

systemd-resolvedに管理されているファイルなので、直接編集しても再起動時にリセットされる。外部DNSゾルバ用の設定?

/run/systemd/resolve/stub-resolv.conf

systemd-resolvedに管理されているファイルなので、直接編集しても再起動時にリセットされる。内部DNSゾルバ用の設定?

/etc/systemd/resolved.conf

これを編集すればサービス再起動時、/run/systemd/resolve/resolv.confに反映されるっぽいです。

エラー対処及びresolv.confについての参考サイト

askubuntu.com

qiita.com

ararabo.com

hawksnowlog.blogspot.com

blog.jicoman.info