2025/05/18 Updated by 
Docker Network
[Up]

ステップ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