DockerコンテナにIPv6グローバルアドレスを割り当てて外部公開する手順(IPv4/IPv6両対応)

概要

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両方の通信も維持できるため、現代的なネットワーク要件に柔軟に対応可能です。

新着記事の通知をしてもいいですか? OK 断る