2025/05/18 Updated by

Docker Network


[Up] Japanese English
ステップ1: macvlan ネットワークの作成
以下の例では、ホストのネットワークが 192.168.1.0/24、ゲートウェイが 192.168.1.1、NIC が eth0 であると仮定します。parent には物理NIC名を指定します。

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 \
  macvlan_net
注意: eth0 はホストで使用中の物理インタフェース名に置き換えてください。ip link コマンドで確認可能。

ステップ2: macvlan ネットワークで Apache2 コンテナを起動
以下の例では IP アドレス 192.168.1.100 をコンテナに割り当てています:

docker run -d \
  --name apache_macvlan \
  --network macvlan_net \
  --ip 192.168.1.100 \
  httpd:2.4


(注意)ホストOSとコンテナ間の通信ができない
macvlan ネットワークはホストOS自身からは通信できません。解決するには以下の方法があります

解決策:veth 経由で中継用の bridge を作成
以下のように bridge と macvlan を組み合わせてホストから通信可能にできます(高度な設定が必要)。希望されれば詳しく説明します。



Ubuntu 24.04 LTS 上で、macvlan コンテナとホストOS間でも通信できるようにするには、vethペアとbridgeを使った中継ネットワーク構成が必要です。

通常、macvlan はホストとコンテナ間の直接通信を許可しないため、ホストからアクセス可能にするには以下のような構成を作ります。

[ホストOS]
     |
 [veth-host] <--> [veth-macvlan] --(macvlanネットワーク)--> [コンテナ]
     |
 [bridge-br0]
     |
 [eth0](物理NIC)


ステップバイステップ解説
(1) bbridge インターフェースの作成
sudo ip link add br0 type bridge
sudo ip link set br0 up

(2)veth ペア作成(仮想イーサネット)
sudo ip link add veth-host type veth peer name veth-macvlan

(3) veth-host を bridge に接続
sudo ip link set veth-host master br0
sudo ip link set veth-host up

(4) veth-macvlan に macvlan ネットワークと同じサブネットの IP を割り当て
sudo ip addr add 192.168.1.254/24 dev veth-macvlan
sudo ip link set veth-macvlan up

※ 192.168.1.254 は macvlan 範囲内で未使用のIPにしてください。


Docker 側の設定
(5) macvlan ネットワーク作成時、parent を br0 にする
docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=br0 \
  macvlan_net
通常の eth0 ではなく、作成した br0 ブリッジに接続します。


(6) コンテナを起動
docker run -d --name apache_macvlan \
  --network macvlan_net \
  --ip 192.168.1.100 \
  httpd:2.4


(7) ホストからアクセスする方法
この時点で、ホストが veth-macvlan (192.168.1.254) を通じて 192.168.1.100 のコンテナに通信できます:
curl http://192.168.1.100

永続化について
再起動後にもこの構成を維持したい場合は、次のいずれかが必要です:

systemd unit を作成

netplan/NetworkManager スクリプトで bridge と veth の設定

rc.local にスクリプトを記述
作成したネットワークの確認:

docker network ls
docker network inspect macvlan_net

削除:
docker network rm macvlan_net