死活監視ツールの動作確認をDockerで行っているとき、監視対象へのアクセスにIPv6を明示的に指定するとエラーになってしまうことに気付きました。IPv6を指定しなければ問題ありません。
ツールのエラー表示からはgetaddrinfoでエラーになっているようでした。そのためIPv6を使用できない状態なのかなと考え、まずは検索などしてIPv6まわりの状況を調べました。
さほど手間がかかることもなく分かってきたのは、私が使用しているColimaでDockerコンテナを動かす際のIPv6の扱いには少しクセがありそうなことです。
なお、使用したColimaとDockerのバージョンは以下の通りです。
$ colima version
colima version 0.10.3
git commit: 00f6c297e92a82c04a4ab507db0a61435650d7e8
runtime: docker
arch: aarch64
client: v29.8.0
server: v29.5.2
OSはmacOS Tahoe 26.6.2です。
ColimaとDockerでのIPv6事情
今回、実現したいのはコンテナ内からインターネットにIPv6でアクセスすることです。この場合、以下の要因が関係してくるようです。
- DockerコンテナでIPv6を有効にするための設定を行う
- Dockerコンテナが参照するDNSサーバからIPv6アドレス(AAAAレコード)を取得できるようにする
設定のこと
まず一点目、DockerコンテナのIPv6対応です。
これにはColima側とDocker側の両方で対応が必要です。
Colima側は設定のnetwork.addressを有効にします。(補足その1を参照)
設定ファイルを編集してもよいですが、Colimaの再起動が必要になるので、再起動時にコマンドラインで指定するのが簡単です。
$ colima stop
INFO[0000] stopping colima
INFO[0000] stopping ... context=docker
INFO[0000] stopping ... context=vm
INFO[0002] done
$ colima start --network-address
INFO[0000] starting colima
INFO[0000] runtime: docker
INFO[0000] starting ... context=vm
INFO[0020] provisioning ... context=docker
INFO[0021] starting ... context=docker
INFO[0022] done
Docker側はIPv6を有効にしたネットワークを作成し、それを使用します。
$ docker network create --ipv6 myv6net
e67370...
$ docker run --rm --network myv6net alpine ping -6 -c 1 2606:4700:4700::1111
PING 2606:4700:4700::1111 (2606:4700:4700::1111): 56 data bytes
64 bytes from 2606:4700:4700::1111: seq=0 ttl=54 time=7.813 ms
--- 2606:4700:4700::1111 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 7.813/7.813/7.813 ms
名前解決のこと
次に二点目、Dockerコンテナ内からホスト名でアクセスすることができるかどうか確認します。
$ docker run --rm --network myv6net alpine ping -6 -c 1 one.one.one.one
ping: bad address 'one.one.one.one'
エラーになってしまいました。念のため、IPv4でならアクセスできることを確認しておきます。
$ docker run -it --rm --network myv6net alpine
/ # ping -6 -c 1 one.one.one.one
ping: bad address 'one.one.one.one'
/ # ping -c 1 one.one.one.one
PING one.one.one.one (1.0.0.1): 56 data bytes
64 bytes from 1.0.0.1: seq=0 ttl=63 time=0.494 ms
--- one.one.one.one ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.494/0.494/0.494 ms
名前解決の状況をもう少し詳しく確認してみます。確認のためにhostコマンドを使えるようにします。
/ # apk update
...(省略)...
/ # apk add bind-tools
...(省略)...
/ # host one.one.one.one
one.one.one.one has address 1.0.0.1
one.one.one.one has address 1.1.1.1
Host one.one.one.one not found: 3(NXDOMAIN)
/ # host -t AAAA one.one.one.one
one.one.one.one has no AAAA record
AAAAレコードを取得できていないようです。
ちなみに素のmacOSではこうなります。
$ host one.one.one.one
one.one.one.one has address 1.0.0.1
one.one.one.one has address 1.1.1.1
one.one.one.one has IPv6 address 2606:4700:4700::1111
one.one.one.one has IPv6 address 2606:4700:4700::1001
ColimaでDockerコンテナを動作させるとき、コンテナでの名前解決は、通常はColimaのDNS機能を経由して行われます。ここまでの様子から分かるとおり、今回の環境ではColimaのDNS機能を経由する場合にはAAAAレコードを取得できないようです。
ですが、Colimaでは外部DNSサーバを使うよう設定することができます。
設定ファイルのnetwork.dnsに使用したいDNSサーバを列挙するか、次のように起動時にコマンドラインで指定します。
$ colima stop
...(省略)...
$ colima start --network-address --dns 1.1.1.1 --dns 8.8.8.8
...(省略)...
では、再度Dockerコンテナ内から名前解決できるか確認します。
$ docker run --rm --network myv6net alpine ping -6 -c 1 one.one.one.one
ping: bad address 'one.one.one.one'
……状況が変わりませんね。
つまずきの理由
ColimaのDNS機能は、ColimaのVM内で動作するdnsmasqを通じてDockerコンテナに提供されています。そこで、VM内で名前解決の状態を確認してみましょう。
Colima VMにはpingコマンドがありませんので、curlコマンドで代用します。Dockerコンテナでの状況と同じです。
$ colima ssh -- curl -6 -I 'https://one.one.one.one'
curl: (6) Could not resolve host: one.one.one.one
FATA[0000] exit status 6
ここでもIPv6アドレス指定なら問題ありません。
$ colima ssh -- curl -6 -I 'https://[2606:4700:4700::1111]'
HTTP/2 301
date: Tue, 15 Sep 2026 13:24:11 GMT
location: https://one.one.one.one/
server: cloudflare
cf-ray: a3b7f3425c1edeb3-NRT
VM内のDNS設定がどうなっているか確認してみます。
まずはresolv.confです。
$ colima ssh -- cat /etc/resolv.conf
# Generated by Colima
nameserver 192.168.5.1
通常はこのような内容になっているはずです。192.168.5.1はColima VM内のdnsmasqの待ち受けアドレスです。
続いてdnsmasqの設定を確認しましょう。
$ colima ssh -- cat /etc/dnsmasq.d/01-colima.conf
# Generated by Colima
# Do not edit this file manually
address=/host.docker.internal/192.168.5.2
address=/host.lima.internal/192.168.5.2
address=/colima.internal/192.168.5.1
server=192.168.5.2
interface=eth0
listen-address=192.168.5.1
bind-interfaces
ここでserver=にコマンドラインで指定したDNSサーバのアドレスが反映されていないことが分かります。
本来ならば設定ファイルやコマンドラインの指定に従って、このファイルに次のような内容が追加されるはずなのです。
server=1.1.1.1
server=8.8.8.8
原因と対処
Colima 0.10.3では、VM内にdnsmasqパッケージがインストールされているとき01-colima.confを作成しなおします。
dnsmasqパッケージがインストールされているかどうかの判断はapt list | grep 'dnsmasq\/' | grep '\[installed'によって行われます。[github]
VMが構築されてから、VM内のパッケージ情報が更新されることがなければこの判定はうまくいくようです。ところが、何かのタイミングでパッケージ情報が更新されると次のような状態になることがあります。
$ colima ssh -- apt list 2>/dev/null | grep 'dnsmasq/'
dnsmasq/noble-updates 2.91-0ubuntu0.24.04.1 all [upgradable from: 2.90-2ubuntu0.3]
この場合、grep '\[installed'の条件にマッチしません。dnsmasqパッケージはインストールされていないと判断され、01-colima.confが更新されないままとなります。
この状況を解消する単純な方法は01-colima.confを編集することですが、それでは設定ファイルとの間で不整合が生じます。
直接の要因はdnsmasqパッケージがupgradableであることでした。それならColima VM内でdnsmasqパッケージをアップグレードした上で、Colimaを再起動すればよいはずです。
$ colima ssh -- sudo apt-get update
...(省略)...
$ colima ssh -- sudo apt-get install -y --only-upgrade dnsmasq
...(省略)...
$ colima ssh -- apt list 2>/dev/null | grep 'dnsmasq/'
dnsmasq/noble-updates,now 2.91-0ubuntu0.24.04.1 all [installed]
これでdnsmasqパッケージのアップグレードが完了です。Colimaを再起動して、VM内で名前解決できることを確認しましょう。
$ colima stop
...(省略)...
$ colima start
...(省略)...
まず、DNSサーバの設定が反映されていることを確認します。
$ colima ssh -- cat /etc/dnsmasq.d/01-colima.conf | grep '^server='
server=1.1.1.1
server=8.8.8.8
問題ありません。次に、VM内で名前解決できることを確認します。
$ colima ssh -- curl -6 -I 'https://one.one.one.one'
HTTP/2 200
date: Tue, 15 Sep 2026 13:47:42 GMT
content-type: text/html; charset=utf-8
...(省略)...
最後にDockerコンテナ内から名前解決できることを確認します。
$ docker run --rm --network myv6net alpine ping -6 -c 1 one.one.one.one
PING one.one.one.one (2606:4700:4700::1111): 56 data bytes
64 bytes from 2606:4700:4700::1111: seq=0 ttl=54 time=7.456 ms
--- one.one.one.one ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 7.456/7.456/7.456 ms
IPv6での名前解決ができるようになりました!
補足
その1
Colima VMでIPv6を有効にするにはnetwork.addressのほかにvmTypeも関係します。vmTypeはvzがデフォルトで、今回もvzを使用しています。
network.address自体はIPv6のための設定というわけではなく、Colima VMにホスト側から到達可能なIPアドレスを割り当てるための設定です。
それなのにIPv6の有効化に関係してくるのは、vmTypeがvzの環境でnetwork.addressをtrueにするとVMNetが有効になり、そしてColimaの基盤のLimaでIPv6を使用するにはVMNetが必要となるためです。
実際に確認してみると、network.address=falseのとき、VMのネットワークインタフェースとルーティングは以下の通りです。
$ colima ssh -- ip -br address
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 192.168.5.1/24 metric 200 fe80::.../64
docker0 DOWN 172.17.0.1/16
br-5ed82298d4fa DOWN 172.19.0.1/16
br-e262d0bafc78 DOWN 172.20.0.1/16 fdf6:b4ec:7edd:1::1/64
br-e67370611420 DOWN 172.18.0.1/16 fdf6:b4ec:7edd::1/64
$ colima ssh -- ip -6 route
fdf6:b4ec:7edd::/64 dev br-e67370611420 proto kernel metric 256 linkdown pref medium
fdf6:b4ec:7edd:1::/64 dev br-e262d0bafc78 proto kernel metric 256 linkdown pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
network.address=trueのときは以下のようになります。
$ colima ssh -- ip -br address
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 192.168.5.1/24 metric 200 fe80::.../64
col0 UP 192.168.64.3/24 metric 300 fd8c:5308:6cc9:abfc:.../64 fe80::.../64
docker0 DOWN 172.17.0.1/16
br-5ed82298d4fa DOWN 172.19.0.1/16
br-e262d0bafc78 DOWN 172.20.0.1/16 fdf6:b4ec:7edd:1::1/64
br-e67370611420 DOWN 172.18.0.1/16 fdf6:b4ec:7edd::1/64
$ colima ssh -- ip -6 route
fd8c:5308:6cc9:abfc::/64 dev col0 proto ra metric 300 expires 2591994sec mtu 1500 hoplimit 64 pref medium
fdf6:b4ec:7edd::/64 dev br-e67370611420 proto kernel metric 256 linkdown pref medium
fdf6:b4ec:7edd:1::/64 dev br-e262d0bafc78 proto kernel metric 256 linkdown pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev col0 proto kernel metric 256 pref medium
default via fe80::20a5:cbff:febc:ed64 dev col0 proto ra metric 300 expires 8994sec mtu 1500 hoplimit 64 pref medium
インタフェースcol0が追加され、IPv6アドレスが割り当てられています。
ルーティングにはcol0経由でデフォルトゲートウェイが設定されています。これによりコンテナ内から外部に向けたIPv6経路が確立されます。
その2
ややad hocというか、今ならたまたまうまくいくというたぐいの話ですが、初回のVM起動からnetwork.addressをtrue、外部のDNSサーバを指定しておくと、上述の問題に引っかからずに済むようです。
以下はColimaのVMを削除して、初回の起動からやり直す例です。(既存のVMを削除しても問題ない場合に限ります)
$ colima stop
$ colima delete
$ colima start --network-address --dns 1.1.1.1 --dns 8.8.8.8