IPvlan 網路驅動程式
IPvlan 驅動程式讓使用者可以完全控制 IPv4 和 IPv6 位址。VLAN 驅動程式在此基礎上構建,讓操作員可以完全控制第 2 層 VLAN 標記,甚至可以控制對底層網路整合感興趣的使用者 IPvlan L3 路由。對於抽象化物理限制的覆蓋部署,請參閱多主機覆蓋驅動程式。
IPvlan 是經過驗證的網路虛擬化技術的新轉折。Linux 實作非常輕量級,因為它們不是使用傳統的 Linux 橋接器進行隔離,而是與 Linux 乙太網路介面或子介面關聯,以強制網路之間的分離和與實體網路的連線。
IPvlan 提供許多獨特的功能,並為各種模式的進一步創新提供了充足的空間。這些方法的兩個高階優點是繞過 Linux 橋接器的正面效能含義以及減少活動部件的簡潔性。移除傳統上位於 Docker 主機 NIC 和容器介面之間的橋接器,留下一個由容器介面組成的簡單設定,直接連接到 Docker 主機介面。由於在這些情況下不需要埠映射,因此外部服務可以輕鬆存取此結果。
選項
下表說明了使用 ipvlan
驅動程式建立網路時,您可以傳遞給 --option
的驅動程式特定選項。
選項 | 預設值 | 說明 |
---|---|---|
ipvlan_mode | l2 | 設定 IPvlan 作業模式。可以是下列其中一項:l2 、l3 、l3s |
ipvlan_flag | bridge | 設定 IPvlan 模式旗標。可以是下列其中一項:bridge 、private 、vepa |
parent | 指定要使用的父介面。 |
範例
先決條件
- 此頁面上的範例都是單一主機。
- 所有範例都可以在執行 Docker 的單一主機上執行。任何使用子介面(如
eth0.10
)的範例都可以替換為 Docker 主機上的eth0
或任何其他有效的父介面。帶有.
的子介面是動態建立的。-o parent
介面也可以完全排除在docker network create
之外,驅動程式將會建立一個dummy
介面,以啟用本機主機連線來執行範例。 - 核心需求
- IPvlan Linux 核心 v4.2+(支援較早的核心,但存在錯誤)。要檢查您目前的內核版本,請使用
uname -r
- IPvlan Linux 核心 v4.2+(支援較早的核心,但存在錯誤)。要檢查您目前的內核版本,請使用
IPvlan L2 模式範例用法
下圖顯示了 IPvlan L2
模式拓撲的範例。驅動程式使用 -d driver_name
選項指定。在本例中為 -d ipvlan
。


下一個範例 -o parent=eth0
中的父介面設定如下
$ ip addr show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0
使用主機介面的網路作為 docker network create
中的 --subnet
。容器將連接到與主機介面相同的網路,如透過 -o parent=
選項設定。
建立 IPvlan 網路並執行連接到它的容器
# IPvlan (-o ipvlan_mode= Defaults to L2 mode if not specified)
$ docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o ipvlan_mode=l2 \
-o parent=eth0 db_net
# Start a container on the db_net network
$ docker run --net=db_net -it --rm alpine /bin/sh
# NOTE: the containers can NOT ping the underlying host interfaces as
# they are intentionally filtered by Linux for additional isolation.
IPvlan 的預設模式是 l2
。如果未指定 -o ipvlan_mode=
,則會使用預設模式。同樣,如果 --gateway
保持空白,則網路上的第一個可用地址將被設定為閘道器。例如,如果網路建立中提供的子網路是 --subnet=192.168.1.0/24
,則容器接收的閘道器是 192.168.1.1
。
為了幫助理解此模式如何與其他主機互動,下圖顯示了適用於 IPvlan L2 模式的兩個 Docker 主機之間的相同第 2 層區段。


以下將建立與先前建立的網路 db_net
完全相同的網路,並使用驅動程式預設值 --gateway=192.168.1.1
和 -o ipvlan_mode=l2
。
# IPvlan (-o ipvlan_mode= Defaults to L2 mode if not specified)
$ docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
-o parent=eth0 db_net_ipv
# Start a container with an explicit name in daemon mode
$ docker run --net=db_net_ipv --name=ipv1 -itd alpine /bin/sh
# Start a second container and ping using the container name
# to see the docker included name resolution functionality
$ docker run --net=db_net_ipv --name=ipv2 -it --rm alpine /bin/sh
$ ping -c 4 ipv1
# NOTE: the containers can NOT ping the underlying host interfaces as
# they are intentionally filtered by Linux for additional isolation.
驅動程式也支援 --internal
旗標,該旗標將完全隔離網路上的容器與該網路外部的任何通訊。由於網路隔離與網路的父介面緊密耦合,因此將 -o parent=
選項保留在 docker network create
之外的結果與 --internal
選項完全相同。如果未指定父介面或使用了 --internal
旗標,則會為使用者建立 netlink 類型 dummy
父介面,並將其用作有效隔離網路的父介面。
以下兩個 docker network create
範例產生您可以連接容器的相同網路
# Empty '-o parent=' creates an isolated network
$ docker network create -d ipvlan \
--subnet=192.168.10.0/24 isolated1
# Explicit '--internal' flag is the same:
$ docker network create -d ipvlan \
--subnet=192.168.11.0/24 --internal isolated2
# Even the '--subnet=' can be left empty and the default
# IPAM subnet of 172.18.0.0/16 will be assigned
$ docker network create -d ipvlan isolated3
$ docker run --net=isolated1 --name=cid1 -it --rm alpine /bin/sh
$ docker run --net=isolated2 --name=cid2 -it --rm alpine /bin/sh
$ docker run --net=isolated3 --name=cid3 -it --rm alpine /bin/sh
# To attach to any use `docker exec` and start a shell
$ docker exec -it cid1 /bin/sh
$ docker exec -it cid2 /bin/sh
$ docker exec -it cid3 /bin/sh
IPvlan 802.1Q 中繼 L2 模式範例用法
在架構上,IPvlan L2 模式中繼與 Macvlan 在閘道器和 L2 路徑隔離方面相同。在 ToR 交換器中的 CAM 表壓力、每個埠一個 MAC 和主機父 NIC 上的 MAC 耗盡等方面存在一些細微的差異,這些差異可能是有利的。802.1Q 中繼場景看起來相同。兩種模式都遵守標記標準,並與實體網路無縫整合,以實現底層整合和硬體供應商外掛程式整合。
同一 VLAN 上的主機通常位於同一子網路中,並且幾乎總是根據其安全策略分組在一起。在大多數情況下,多層應用程式會分層到不同的子網路中,因為每個程序的安全設定檔都需要某種形式的隔離。例如,將您的信用卡處理託管在與前端網路伺服器相同的虛擬網路上將會是一個法規遵循問題,同時也會規避縱深防禦架構中長期存在的最佳實務。VLAN 或使用覆蓋驅動程式時的等效 VNI(虛擬網路識別碼)是隔離租戶流量的第一步。


當您呼叫 docker network create
時,標記有 VLAN 的 Linux 子介面可能已存在,或將會被建立。docker network rm
將會刪除子介面。父介面,例如 eth0
,不會被刪除,只有 netlink 父索引 > 0 的子介面會被刪除。
為了讓驅動程式新增/刪除 VLAN 子介面,格式需要為 interface_name.vlan_tag
。其他子介面命名可以用作指定的父介面,但在呼叫 docker network rm
時,連結將不會自動刪除。
使用現有父 VLAN 子介面或讓 Docker 管理它們的選項,讓使用者可以完全管理 Linux 介面和網路,或讓 Docker 建立和刪除 VLAN 父子介面 (netlink ip link
),而使用者無需費力。
例如:使用 eth0.10
表示 eth0
的子介面,標記有 VLAN ID 10
。等效的 ip link
命令為 ip link add link eth0 name eth0.10 type vlan id 10
。
此範例建立了 VLAN 標記的網路,然後啟動兩個容器以測試容器之間的連線能力。沒有路由器在兩個網路之間路由,不同的 VLAN 無法互相 ping 通。根據 IPvlan 設計,預設命名空間無法訪問,以便將容器命名空間與底層主機隔離。
VLAN ID 20
在第一個由 Docker 主機標記和隔離的網路中,eth0.20
是標記有 VLAN ID 20
的父介面,使用 -o parent=eth0.20
指定。可以使用其他命名格式,但需要使用 ip link
或 Linux 設定檔手動新增和刪除連結。只要存在 -o parent
,任何符合 Linux netlink 的內容都可以使用。
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged
$ docker network create -d ipvlan \
--subnet=192.168.20.0/24 \
--gateway=192.168.20.1 \
-o parent=eth0.20 ipvlan20
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan20 -it --name ivlan_test1 --rm alpine /bin/sh
$ docker run --net=ipvlan20 -it --name ivlan_test2 --rm alpine /bin/sh
VLAN ID 30
在第二個由 Docker 主機標記和隔離的網路中,eth0.30
是標記有 VLAN ID 30
的父介面,使用 -o parent=eth0.30
指定。ipvlan_mode=
預設為 l2 模式 ipvlan_mode=l2
。也可以明確設定它,結果與下一個範例所示相同。
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged.
$ docker network create -d ipvlan \
--subnet=192.168.30.0/24 \
--gateway=192.168.30.1 \
-o parent=eth0.30 \
-o ipvlan_mode=l2 ipvlan30
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan30 -it --name ivlan_test3 --rm alpine /bin/sh
$ docker run --net=ipvlan30 -it --name ivlan_test4 --rm alpine /bin/sh
閘道器設定在容器內作為預設閘道器。該閘道器通常是網路上的外部路由器。
$$ ip route
default via 192.168.30.1 dev eth0
192.168.30.0/24 dev eth0 src 192.168.30.2
範例:多子網路 IPvlan L2 模式,在同一個子網路上啟動兩個容器並互相 ping 通。為了讓 192.168.114.0/24
到達 192.168.116.0/24
,在 L2 模式下需要一個外部路由器。L3 模式可以在共享共同 -o parent=
的子網路之間路由。
網路路由器上的輔助位址很常見,因為當位址空間耗盡時,會向 L3 VLAN 介面或通常稱為「交換式虛擬介面」(SVI) 新增另一個輔助位址。
$ docker network create -d ipvlan \
--subnet=192.168.114.0/24 --subnet=192.168.116.0/24 \
--gateway=192.168.114.254 --gateway=192.168.116.254 \
-o parent=eth0.114 \
-o ipvlan_mode=l2 ipvlan114
$ docker run --net=ipvlan114 --ip=192.168.114.10 -it --rm alpine /bin/sh
$ docker run --net=ipvlan114 --ip=192.168.114.11 -it --rm alpine /bin/sh
一個重要的結論是,營運者能夠將其物理網路映射到其虛擬網路,以便將容器整合到其環境中,而無需進行任何營運上的徹底改造。網路營運團隊將 802.1Q 中繼線放入 Docker 主機。該虛擬連結將是在網路建立中傳入的 -o parent=
。對於未標記(非 VLAN)連結,只需使用 -o parent=eth0
,對於具有 VLAN ID 的 802.1Q 中繼線,每個網路都會從網路映射到相應的 VLAN/子網路。
例如,網路營運團隊提供 VLAN ID 和相關聯的子網路,用於通過乙太網路連結傳遞到 Docker 主機伺服器的 VLAN。在配置 Docker 網路時,這些值會插入到 docker network create
命令中。這些是每次 Docker 引擎啟動時都會套用的持續性配置,這避免了管理通常很複雜的設定檔。網路介面也可以通過預先建立來手動管理,Docker 網路永遠不會修改它們,而是將它們用作父介面。從網路營運團隊到 Docker 網路命令的範例映射如下:
- VLAN:10,子網路:172.16.80.0/24,閘道器:172.16.80.1
--subnet=172.16.80.0/24 --gateway=172.16.80.1 -o parent=eth0.10
- VLAN:20,IP 子網路:172.16.50.0/22,閘道器:172.16.50.1
--subnet=172.16.50.0/22 --gateway=172.16.50.1 -o parent=eth0.20
- VLAN:30,子網路:10.1.100.0/16,閘道器:10.1.100.1
--subnet=10.1.100.0/16 --gateway=10.1.100.1 -o parent=eth0.30
IPvlan L3 模式範例
IPvlan 需要將路由分發到每個端點。該驅動程式僅構建 IPvlan L3 模式埠并将容器连接到该接口。在整個叢集中分發路由超出了此單主機範圍驅動程式的初始實作。在 L3 模式下,Docker 主機非常類似於在容器中啟動新網路的路由器。它們位於上游網路在沒有路由分發的情況下不知道的網路上。對於那些好奇 IPvlan L3 將如何適應容器網路的人,請參閱以下範例。


IPvlan L3 模式會丟棄所有廣播和多播流量。僅此原因就使 IPvlan L3 模式成為尋求大規模和可預測網路整合者的主要候選者。它是可預測的,反過來會導致更長的正常運行時間,因為它不涉及橋接。橋接迴圈導致了一些備受關注的故障,這些故障可能難以查明,具體取決於故障域的大小。這是由於 BPDU(橋接埠數據單元)的級聯性質,BPDU 在整個廣播域 (VLAN) 中泛濫,以查找和阻止拓撲迴圈。消除橋接域,或者至少將它們隔離到一對 ToR(機架頂部交換機),將減少難以排除故障的橋接不穩定性。IPvlan L2 模式非常適用於僅中繼到一對 ToR 的隔離 VLAN,這些 ToR 可以提供無迴圈的非阻塞結構。下一步是通過 IPvlan L3 模式在邊緣路由,這將故障域縮小到僅限本地主機。
- L3 模式需要位於與預設命名空間不同的子網上,因為它需要預設命名空間中指向 IPvlan 父介面的 netlink 路由。
- 此範例中使用的父介面是
eth0
,它位於子網路192.168.1.0/24
上。請注意,docker network
與eth0
不在同一個子網上。 - 與 IPvlan l2 模式不同,只要不同的子網路/網路共享相同的父介面
-o parent=
,它們就可以互相 ping 通。
$$ ip a show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:50:56:39:45:2e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0
- 傳統閘道器對於 L3 模式 IPvlan 介面沒有多大意義,因為不允許廣播流量。因此,容器預設閘道器指向容器的
eth0
設備。有關詳細資訊,請參閱 L3 容器內ip route
或ip -6 route
的 CLI 輸出。
必須明確指定模式 -o ipvlan_mode=l3
,因為預設 IPvlan 模式為 l2
。
以下範例未指定父介面。網路驅動程式將為使用者建立一個虛擬類型連結,而不是拒絕網路建立并将容器隔離,使其只能互相通信。
# Create the IPvlan L3 network
$ docker network create -d ipvlan \
--subnet=192.168.214.0/24 \
--subnet=10.1.214.0/24 \
-o ipvlan_mode=l3 ipnet210
# Test 192.168.214.0/24 connectivity
$ docker run --net=ipnet210 --ip=192.168.214.10 -itd alpine /bin/sh
$ docker run --net=ipnet210 --ip=10.1.214.10 -itd alpine /bin/sh
# Test L3 connectivity from 10.1.214.0/24 to 192.168.214.0/24
$ docker run --net=ipnet210 --ip=192.168.214.9 -it --rm alpine ping -c 2 10.1.214.10
# Test L3 connectivity from 192.168.214.0/24 to 10.1.214.0/24
$ docker run --net=ipnet210 --ip=10.1.214.9 -it --rm alpine ping -c 2 192.168.214.10
**注意**
請注意,網路建立中沒有
--gateway=
選項。如果指定了l3
模式,則會忽略該欄位。查看容器內部的容器路由表# Inside an L3 mode container $$ ip route default dev eth0 192.168.214.0/24 dev eth0 src 192.168.214.10
為了從遠端 Docker 主機 ping 容器或容器能夠 ping 遠端主機,遠端主機或其間的實體網路需要具有指向容器 Docker 主機 eth 介面主機 IP 位址的路由。
雙堆疊 IPv4 IPv6 IPvlan L2 模式
Libnetwork 不僅可以讓您完全控制 IPv4 位址,還可以讓您完全控制 IPv6 位址,以及兩個位址系列之間的功能奇偶校驗。
下一個範例將僅以 IPv6 開始。在同一個 VLAN
139
上啟動兩個容器並互相 ping 通。由於未指定 IPv4 子網路,預設 IPAM 將配置預設 IPv4 子網路。除非上游網路在 VLAN139
上明確路由它,否則該子網路是隔離的。
# Create a v6 network
$ docker network create -d ipvlan \
--ipv6 --subnet=2001:db8:abc2::/64 --gateway=2001:db8:abc2::22 \
-o parent=eth0.139 v6ipvlan139
# Start a container on the network
$ docker run --net=v6ipvlan139 -it --rm alpine /bin/sh
查看容器 eth0 介面和 v6 路由表
# Inside the IPv6 container
$$ ip a show eth0
75: eth0@if55: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link
valid_lft forever preferred_lft forever
inet6 2001:db8:abc2::1/64 scope link nodad
valid_lft forever preferred_lft forever
$$ ip -6 route
2001:db8:abc4::/64 dev eth0 proto kernel metric 256
2001:db8:abc2::/64 dev eth0 proto kernel metric 256
default via 2001:db8:abc2::22 dev eth0 metric 1024
啟動第二個容器並 ping 第一個容器的 v6 位址。
# Test L2 connectivity over IPv6
$ docker run --net=v6ipvlan139 -it --rm alpine /bin/sh
# Inside the second IPv6 container
$$ ip a show eth0
75: eth0@if55: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
inet6 2001:db8:abc2::2/64 scope link nodad
valid_lft forever preferred_lft forever
$$ ping6 2001:db8:abc2::1
PING 2001:db8:abc2::1 (2001:db8:abc2::1): 56 data bytes
64 bytes from 2001:db8:abc2::1%eth0: icmp_seq=0 ttl=64 time=0.044 ms
64 bytes from 2001:db8:abc2::1%eth0: icmp_seq=1 ttl=64 time=0.058 ms
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.044/0.051/0.058/0.000 ms
下一個範例將設定一個具有範例 VLAN ID 140
的雙棧 IPv4/IPv6 網路。
接下來建立一個具有兩個 IPv4 子網路和一個 IPv6 子網路的網路,所有這些子網路都具有明確的閘道器
$ docker network create -d ipvlan \
--subnet=192.168.140.0/24 --subnet=192.168.142.0/24 \
--gateway=192.168.140.1 --gateway=192.168.142.1 \
--subnet=2001:db8:abc9::/64 --gateway=2001:db8:abc9::22 \
-o parent=eth0.140 \
-o ipvlan_mode=l2 ipvlan140
啟動一個容器並查看 eth0 以及 v4 和 v6 路由表
$ docker run --net=ipvlan140 --ip6=2001:db8:abc2::51 -it --rm alpine /bin/sh
$ ip a show eth0
78: eth0@if77: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 192.168.140.2/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link
valid_lft forever preferred_lft forever
inet6 2001:db8:abc9::1/64 scope link nodad
valid_lft forever preferred_lft forever
$$ ip route
default via 192.168.140.1 dev eth0
192.168.140.0/24 dev eth0 proto kernel scope link src 192.168.140.2
$$ ip -6 route
2001:db8:abc4::/64 dev eth0 proto kernel metric 256
2001:db8:abc9::/64 dev eth0 proto kernel metric 256
default via 2001:db8:abc9::22 dev eth0 metric 1024
使用指定的 --ip4
位址啟動第二個容器,並使用 IPv4 資料包 ping 第一個主機
$ docker run --net=ipvlan140 --ip=192.168.140.10 -it --rm alpine /bin/sh
**注意**
IPvlan
L2
模式下同一父介面上不同的子網路無法互相 ping 通。這需要路由器使用輔助子網路代理 arp 請求。但是,只要不同的子網路共享相同的-o parent
父連結,IPvlanL3
就會在它們之間路由單播流量。
雙堆疊 IPv4 IPv6 IPvlan L3 模式
範例:IPvlan L3 模式雙棧 IPv4/IPv6,多子網路,帶有 802.1Q VLAN 標籤:118
與所有範例一樣,不必使用標記的 VLAN 介面。子介面可以用 eth0
、eth1
、bond0
或主機上除 lo
迴環以外的任何其他有效介面交換。
您將看到的主要區別是 L3 模式不會建立具有下一跳的預設路由,而是僅設定指向 dev eth
的預設路由,因為根據設計,Linux 會過濾 ARP/廣播/多播。由於父介面本質上充當路由器,因此父介面 IP 和子網路需要與容器網路不同。這與橋接和 L2 模式相反,橋接和 L2 模式需要位於同一個子網路(廣播域)上才能轉發廣播和多播資料包。
# Create an IPv6+IPv4 Dual Stack IPvlan L3 network
# Gateways for both v4 and v6 are set to a dev e.g. 'default dev eth0'
$ docker network create -d ipvlan \
--subnet=192.168.110.0/24 \
--subnet=192.168.112.0/24 \
--subnet=2001:db8:abc6::/64 \
-o parent=eth0 \
-o ipvlan_mode=l3 ipnet110
# Start a few of containers on the network (ipnet110)
# in separate terminals and check connectivity
$ docker run --net=ipnet110 -it --rm alpine /bin/sh
# Start a second container specifying the v6 address
$ docker run --net=ipnet110 --ip6=2001:db8:abc6::10 -it --rm alpine /bin/sh
# Start a third specifying the IPv4 address
$ docker run --net=ipnet110 --ip=192.168.112.30 -it --rm alpine /bin/sh
# Start a 4th specifying both the IPv4 and IPv6 addresses
$ docker run --net=ipnet110 --ip6=2001:db8:abc6::50 --ip=192.168.112.50 -it --rm alpine /bin/sh
介面和路由表輸出如下
$$ ip a show eth0
63: eth0@if59: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
link/ether 00:50:56:2b:29:40 brd ff:ff:ff:ff:ff:ff
inet 192.168.112.2/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 2001:db8:abc4::250:56ff:fe2b:2940/64 scope link
valid_lft forever preferred_lft forever
inet6 2001:db8:abc6::10/64 scope link nodad
valid_lft forever preferred_lft forever
# Note the default route is the eth device because ARPs are filtered.
$$ ip route
default dev eth0 scope link
192.168.112.0/24 dev eth0 proto kernel scope link src 192.168.112.2
$$ ip -6 route
2001:db8:abc4::/64 dev eth0 proto kernel metric 256
2001:db8:abc6::/64 dev eth0 proto kernel metric 256
default dev eth0 metric 1024
**注意**
當您刪除具有指定 v6 位址的容器,然後使用相同的 v6 位址啟動新容器時,指定
--ip6=
位址時可能存在錯誤,它會拋出以下錯誤,就像位址未正確釋放到 v6 池一樣。它將無法卸載容器並使其處於失效狀態。
docker: Error response from daemon: Address already in use.
手動建立 802.1Q 連結
VLAN ID 40
如果使用者不希望驅動程式建立 VLAN 子介面,則它需要在運行 docker network create
之前存在。如果您使用的子介面命名不是 interface.vlan_id
,只要介面存在且已啟動,-o parent=
選項中就會再次使用它。
手動建立連結時,只要它們在建立網路時存在,就可以任意命名。使用 docker network rm
刪除網路時,無論名稱如何,手動建立的連結都不會被刪除。
# create a new sub-interface tied to dot1q vlan 40
$ ip link add link eth0 name eth0.40 type vlan id 40
# enable the new sub-interface
$ ip link set eth0.40 up
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged
$ docker network create -d ipvlan \
--subnet=192.168.40.0/24 \
--gateway=192.168.40.1 \
-o parent=eth0.40 ipvlan40
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan40 -it --name ivlan_test5 --rm alpine /bin/sh
$ docker run --net=ipvlan40 -it --name ivlan_test6 --rm alpine /bin/sh
範例:使用任意名稱手動建立的 VLAN 子介面
# create a new sub interface tied to dot1q vlan 40
$ ip link add link eth0 name foo type vlan id 40
# enable the new sub-interface
$ ip link set foo up
# now add networks and hosts as you would normally by attaching to the master (sub)interface that is tagged
$ docker network create -d ipvlan \
--subnet=192.168.40.0/24 --gateway=192.168.40.1 \
-o parent=foo ipvlan40
# in two separate terminals, start a Docker container and the containers can now ping one another.
$ docker run --net=ipvlan40 -it --name ivlan_test5 --rm alpine /bin/sh
$ docker run --net=ipvlan40 -it --name ivlan_test6 --rm alpine /bin/sh
可以使用以下命令清理手動建立的連結
$ ip link del foo
與所有 Libnetwork 驅動程式一樣,它們可以混合搭配,甚至可以與協力廠商生態系統驅動程式並行運行,為 Docker 使用者提供最大的靈活性。