前置き
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