lima-vmやRancher Desktopでvm起動時にdaemon.jsonを作る
これは何?
lima-vm、Rancher Desktopでもデフォルトのdocker networkの採番をクラスCにしたい!という記事です。
可能な限り命令的でなく、宣言的に管理することを目指しています。
背景
忙しい方は読み飛ばしていただいて構いません。
Docker Desktop有料化に伴いlima-vmやRancher Desktopに移行された方は多いのではないでしょうか。
私自身ももともとプライベートではlima-vmを使っていましたが、先日会社の方針として脱Docker Desktopが行われました。
ほぼ全社員が一斉に(主にRancher Desktopへ)移行したわけですが、一部で"Rancher Desktopを使っているとサーバにアクセスできなくなる"という報告が上がってきました。
これまでDocker Desktopで設定していたdocker networkの自動採番の設定項目がRancher Desktopにないため、サーバのプライベートIP経由でアクセスしようとしてローカルのコンテナに接続しているという事象が発生していました。
Docker Desktopを利用しているときはdefault-address-poolsを利用していないクラスCのIPレンジに設定するよう共有していました。
特にdocker composeを利用している場合、利用者が意識せずにdocker networkが作成されてしまうため気づきにくいです。
回避方法としてはcompose.yaml内で明示的にnetworkを作成し、IPレンジを指定する方法もありますが、この方法は複数のリポジトリにまたがってそれぞれが重複しないよう指定しなければ複数のプロジェクトでcompose upしたとき問題が発生するため、現実的ではありません。
ですので作成されたlima-vm上に/etc/docker/daemon.jsonを作成する必要があり、調べたところlima-vmの定義ファイルを編集して作成する方法があまり紹介されていなかったため記事を作成することにしました。
つまり、これをすることでvmを作り直してもdaemon.jsonが自動作成されるわけです。
環境
すべてMシリーズSoC搭載のMacで検証を行っています。
Intel版、LinuxやWindowsは未検証となります。
lima-vm(rootful)
テンプレートは以下にあるので、これを編集します。 起動時にも編集できますが、その場合はlima.yamlをバックアップすると良いでしょう。
provision配下の一番最初に以下を追加します。(適宜自分の環境に合わせてください)
- mode: system
script: |
#!/bin/sh
mkdir -p /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"default-address-pools":[
{
"base":"192.168.0.0/16",
"size":24
}
]
}
EOF
これを適当に保存し、起動時に指定します。
limactl start ~/Downloads/test.yaml
vmに入るとdaemon.jsonの存在を確認できます。
limactl shell test cat /etc/docker/daemon.json
{
"default-address-pools":[
{
"base":"192.168.0.0/16",
"size":24
}
]
}
docker networkが指定したIPレンジで作成されることを確認できます。
docker network ls
NETWORK ID NAME DRIVER SCOPE
2ff4b7ff668c bridge bridge local
52488d1aa2a5 host host local
831e97300fae none null local
docker network create test
d75cbfc963a3817e0a056e3634608f70f3d5c27b469a9d5819082b64150dd9dc
docker network inspect test
[
{
"Name": "test",
"Id": "d75cbfc963a3817e0a056e3634608f70f3d5c27b469a9d5819082b64150dd9dc",
"Created": "2025-01-25T17:15:02.572954313+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
lima-vm(rootless)
また、コマンドはuserモードで実行します。
- mode: user
script: |
#!/bin/sh
mkdir -p ~/.config/docker
cat <<EOF > ~/.config/docker/daemon.json
{
"default-address-pools":[
{
"base":"192.168.0.0/16",
"size":24
}
]
}
EOF
vmに入るとdaemon.jsonの存在を確認できます。
limactl shell test-rootless cat /home/`whoami`.linux/.config/docker/daemon.json
{
"default-address-pools":[
{
"base":"192.168.0.0/16",
"size":24
}
]
}
docker networkが指定したIPレンジで作成されることを確認できます。
docker network ls
NETWORK ID NAME DRIVER SCOPE
80b80f930b85 bridge bridge local
ae7b24980744 host host local
a3cf6fad225e none null local
docker network create test
4ab75f24000b8ca4e62a22a1f43ed581cc841e8b7feeaf5eeab8f14dcb3f52c3
docker network inspect test
[
{
"Name": "test",
"Id": "4ab75f24000b8ca4e62a22a1f43ed581cc841e8b7feeaf5eeab8f14dcb3f52c3",
"Created": "2025-01-25T18:38:12.757715677+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Rancher Desktop(Mac/Linux)
ドキュメントは以下です。
パスを変更している場合は自身で変更したパスに読み替えて以下を実行し、override.yamlを作成します。
Linuxの場合は~/.local/share/rancher-desktop/lima/_config/override.yaml
です
cat <<EOF > ~/Library/Application\ Support/rancher-desktop/lima/_config/override.yaml
provision:
- mode: system
script: |
#!/bin/sh
mkdir -p /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"default-address-pools":[
{
"base":"192.168.0.0/16",
"size":24
}
]
}
EOF
EOF
Rancher Desktopを再起動します。
docker networkが指定したIPレンジで作成されることを確認できます。
docker network ls
NETWORK ID NAME DRIVER SCOPE
b757c3376ae1 bridge bridge local
e5460307357c host host local
69b4af356af7 none null local
docker network create test
2f60004035da670203e548d3900a5635a6563e1f87fcbf23c16c0b6ab35bf3ba
docker network inspect test
[
{
"Name": "test",
"Id": "2f60004035da670203e548d3900a5635a6563e1f87fcbf23c16c0b6ab35bf3ba",
"Created": "2025-01-25T18:52:58.498816486+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
Rancher Desktop(windows)
windowsについては未検証ですが、ドキュメントから以下のように設定できそうです。
%LOCALAPPDATA%\rancher-desktop\provisioning
配下に.startファイルを作成します(daemonjson.startなど)。
#!/bin/sh
mkdir -p /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"default-address-pools":[
{
"base":"192.168.0.0/16",
"size":24
}
]
}
EOF
Rancher Desktopを再起動します。
Discussion