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
)的示例都可以替換為eth0
或 Docker 主機上的任何其他有效父介面。帶點 (.
) 的子介面將動態建立。-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
。
為了幫助理解這種模式如何與其他主機互動,下圖顯示了兩個 Docker 主機之間的同一個第 2 層段,該段適用於 IPvlan L2 模式。


以下將建立與之前建立的網路 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
標記,該標記將完全隔離網路上的容器,使其無法與該網路外部的任何通訊進行通訊。由於網路隔離與網路的父介面緊密耦合,因此在 docker network create
中省略 -o parent=
選項的結果與 --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 在閘道器和第 2 層路徑隔離方面相同。有一些細微差別對 ToR 交換機的 CAM 表壓力有利,例如每個埠一個 MAC 和主機父 NIC 上的 MAC 耗盡。802.1Q 中繼場景看起來相同。這兩種模式都符合標記標準,並與物理網路無縫整合,以實現底層整合和硬體供應商外掛整合。
位於同一個 VLAN 上的主機通常位於同一個子網,並且幾乎總是根據其安全策略進行分組。在大多數情況下,多層應用程式被分層到不同的子網,因為每個程序的安全配置檔案都需要某種形式的隔離。例如,將信用卡處理與前端 Web 伺服器託管在同一個虛擬網路上將構成法規遵從問題,並且會繞過長期的最佳實踐,即深度防禦分層架構。VLAN 或使用覆蓋驅動程式時的等效 VNI(虛擬網路識別符號)是隔離租戶流量的第一步。


標記並隔離的 Linux 子介面可以使使用者在呼叫 docker network create
時已經存在或將被建立。docker network rm
將刪除子介面。eth0
等父介面不會被刪除,只有 netlink 父索引 > 0 的子介面會被刪除。
為了使驅動程式能夠新增/刪除 VLAN 子介面,格式需要為 interface_name.vlan_tag
。可以使用其他子介面命名作為指定的父級,但連結不會在呼叫 docker network rm
時自動刪除。
能夠使用現有的父 VLAN 子介面或讓 Docker 管理這些子介面,使使用者能夠完全管理 Linux 介面和網路,或者讓 Docker 建立和刪除 VLAN 父子介面(netlink ip link
),而無需使用者進行任何操作。
例如:使用 eth0.10
來表示標記為 VLAN ID 10
的 eth0
的子介面。等效的 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
一個關鍵的要點是,運營商能夠將他們的物理網路對映到他們的虛擬網路,從而將容器整合到他們的環境中,而無需任何操作上的改造。NetOps 將一個 802.1Q trunk 放入 Docker 主機。該虛擬連結將是網路建立時傳遞的 -o parent=
。對於未標記(非 VLAN)連結,它與 -o parent=eth0
一樣簡單,或者對於帶有 VLAN ID 的 802.1Q trunk,每個網路都對映到網路中相應的 VLAN/子網。
例如,NetOps 提供 VLAN ID 和與之關聯的子網,這些子網是在乙太網連結上傳遞到 Docker 主機伺服器上的 VLAN。在配置 Docker 網路時,這些值將被插入 docker network create
命令中。這些是持久配置,每次 Docker 引擎啟動時都會應用,從而避免了管理通常很複雜的配置檔案的麻煩。網路介面也可以透過預先建立進行手動管理,Docker 網路不會修改它們,並使用它們作為父介面。從 NetOps 到 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 模式成為那些尋求大規模和可預測網路整合的首選。它具有可預測性,反過來將導致更高的正常執行時間,因為沒有涉及橋接。橋接迴圈導致了高知名度的中斷,這些中斷很難定位,具體取決於故障域的大小。這是由於 BPDUs(橋接埠資料單元)的級聯性質,它們會泛洪整個廣播域(VLAN)以查詢並阻止拓撲迴圈。消除橋接域,或者至少將它們隔離到一對 ToR(機架頂端交換機)將減少難以解決的橋接不穩定性。IPvlan L2 模式非常適合隔離的 VLAN,這些 VLAN 僅被 trunk 化到一對 ToR 中,這些 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
的預設路由,因為根據設計,ARP/廣播/組播都被 Linux 過濾。由於父介面本質上充當路由器,因此父介面的 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 使用者提供最大的靈活性。