概要
DockerコンテナにIPv6グローバルアドレスを割り当て、外部(インターネット)から直接アクセスできるようにしつつ、IPv4通信も維持する方法をまとめます。(例:WSL2 + Docker Desktop環境)
前提
- ホストOSにグローバルIPv6アドレスが割り当てられている
- Docker Desktop(またはLinux Docker環境)が利用可能
- docker-composeを利用
1. macvlanネットワークの作成
まず、macvlanネットワークを作成します。(eth0
はホストの物理NIC名に置き換えてください)
# ここにmacvlanネットワーク作成のコマンドを記述
# 例:
# docker network create -d macvlan \
# --subnet=xxxx:xxxx:xxxx:xxxx::/64 \
# --gateway=xxxx:xxxx:xxxx:xxxx::1 \
# -o parent=eth0 macvlanv6
2. docker-compose.ymlの編集
appサービスを両ネットワーク(通常のbridgeと作成したmacvlanv6)に接続し、macvlan側でIPv6グローバルアドレスを明示的に割り当てます。
services:
app:
image: your-app-image
networks:
bridge: {}
macvlanv6:
ipv6_address: xxxx:xxxx:xxxx:xxxx::yy
networks:
bridge:
driver: bridge
ipam:
driver: default
config:
- subnet: "xx.xx.0.0/16"
macvlanv6:
driver: macvlan
driver_opts:
parent: eth0 # ホストのNIC名に合わせる
enable_ipv6: true
ipam:
config:
- subnet: "xxxx:xxxx:xxxx:xxxx::/64"
3. コンテナの再起動
docker-compose down && docker-compose up -d
4. コンテナ内のネットワーク確認
コンテナに入り、IPアドレスが割り当てられていることを確認します。
docker-compose exec app bash
ip a
eth0
(macvlan側)に「xxxx:xxxx:xxxx:xxxx::yy」が割り当てられていることを確認eth1
(bridge側)でIPv4アドレスも取得できていることを確認
5. 疎通テスト
コンテナ内から各ネットワークへの疎通を確認します。
- IPv4:
ping -4 8.8.8.8
- IPv6:
ping -6 google.com
6. 外部からのアクセス
外部の別端末から、指定したIPv6アドレスでアクセスできることを確認します。
# 例:Webサーバーの場合
# curl http://[xxxx:xxxx:xxxx:xxxx::yy]
# pingの場合
# ping xxxx:xxxx:xxxx:xxxx::yy
注意点・補足
- macvlanネットワークは「ホストとの直接通信ができない」という特性があるため、パッケージインストールやビルドはbridge側で行い、イメージを作り直してからmacvlanで起動するのが現実的です。
- ルーターやファイアウォールで、該当コンテナのIPv6アドレス・ポートへの通信を許可する設定が別途必要です。
- WSL2+Docker Desktop環境でも、ネットワーク設定等の条件が揃えばmacvlan+IPv6グローバルアドレスが利用可能です。
まとめ
この手順により、DockerコンテナにIPv6グローバルアドレスを割り当て、外部から直接アクセスできる環境を構築できます。IPv4/IPv6両方の通信も維持できるため、現代的なネットワーク要件に柔軟に対応可能です。