💡

Rancher desktop for Macのコンテナでhost.docker.internalを使えないケースがある

2024/04/23に公開

TL;DR;

Rancher Desktopのコンテナーでhost.docker.internalが使えなかったら、コンテナを動かしてるホスト VM(not Mac)のhostsを rdctl shell cat /etc/hosts で取り出して、host.lima.internalとしてコンテナのhostsに追加してみてください。

192.168.2.1 の部分はそのRancher DesktopのVM構成時に変わります。
hostsにはlocalhostやlocaldomainの設定があると思います。その中から見つけてください。

$rdctl shell cat /etc/hosts
(前略)
192.168.2.1 host.lima.internal
$ docker run --add-host=host.docker.internal:192.168.2.1 -it -d debian

host-gatewayがMacを向いてないことがある

Rancher Desktopはコンテナからホストにアクセスするドメイン名を提供しています。
FAQ によるとhost.docker.internal を提供しているそうです。 実装上はhost.rancher-desktop.internal, host.lima.internal なども使えるとされています。

Rancher Desktop for Macはlimaをベースに構築しています。limaはcontainerd相当のツールをmacユーザに提供するためのコンテナーランタイムです。
docker cliとは独立しており、docker cliのオプションをそのまま使えます

host.docker.internalを実現するのに必要な要素は二つあります。--add-hostオプションとhost-gatewayパラメータです。
--add-host オプションは、コンテナのhostsに設定を追加するオプションです。
host-gatewayは dockerコマンドの --add-host オプションを使用するとき、ゲスト側のlocalhostを参照できるパラメータです。

以下のように使います。これで解決できることもあります。

docker run --add-host=host.docker.internal:host-gateway -it debian bash

Rancher DesktopはコンテナーのホストLinux VMを構築し、その上にコンテナを実行します。
そのため、コンテナが露出するネットワークデバイスはMacでは直接参照できません。

この時、host-gatewayはlimaが作るホストLinux VMを参照してることがあります。

また
host.docker.internal or host.lima.internalはホストLinux VMのhostsに作られていることがあります

そのため、ホストLinux VMからMacへのアクセスは構築されています。しかし、コンテナからMacへの経路が存在しないことあります。ただ、ホストLinux VMのネットワークへコンテナからのネットワークはルーティングが存在するようです。

結論として、ホストLinux VMのhostsに登録されたhost.(docker|lima).internalのIPアドレスをコンテナに渡すと、そのままMacのlocalhostにアクセスすることができます。
rdctl shell cat /etc/hosts はホストLinux VMからhostsの中身を取り出し、docker cliのadd-hostオプションでコンテナに設定しなおすことでhost.docker.internalを有効にできます。これは、永続的な設定ではないので毎回確認することをお勧めします

Discussion