IPvlan 網路驅動程式

IPvlan 驅動程式讓使用者可以完全控制 IPv4 和 IPv6 位址設定。VLAN 驅動程式在此基礎上,讓營運者能夠完全控制第二層 VLAN 標記,甚至是 IPvlan L3 路由,適合對底層網路整合感興趣的使用者。對於抽象化實體限制的疊加部署,請參閱 多主機疊加 驅動程式。

IPvlan 是對經過考驗且可靠的網路虛擬化技術的新變革。Linux 實作非常輕量級,因為它們不使用傳統的 Linux 橋接器進行隔離,而是與 Linux 乙太網路介面或子介面關聯,以強制網路之間的分離以及與實體網路的連線。

IPvlan 提供多項獨特功能,並為各種模式的進一步創新留下了充足空間。這些方法的兩個主要優點是:繞過 Linux 橋接器所帶來的正面效能影響,以及減少移動組件帶來的簡潔性。移除傳統上位於 Docker 主機網卡 (NIC) 和容器介面之間的橋接器,會留下一個簡單的設定,其中包含直接連接到 Docker 主機介面的容器介面。由於在這些情況下無需連接埠映射,外部服務很容易存取。

選項

下表描述了使用 ipvlan 驅動程式建立網路時,可以傳遞給 --opt 的驅動程式特定選項。

選項預設值描述
ipvlan_model2設定 IPvlan 操作模式。可為以下其中一項:l2, l3, l3s
ipvlan_flagbridge設定 IPvlan 模式旗標。可為以下其中一項:bridge, private, vepa
parent指定要使用的父介面。

範例

先決條件

  • 此頁面上的所有範例均為單一主機。
  • 所有範例都可以在運行 Docker 的單一主機上執行。任何使用子介面(例如 eth0.10)的範例都可以替換為 eth0 或 Docker 主機上的任何其他有效父介面。帶有 . 的子介面是即時建立的。-o parent 介面也可以完全省略不寫在 docker network create 命令中,驅動程式將建立一個 dummy 介面,以啟用本機主機連線來執行範例。
  • 核心要求
    • IPvlan Linux 核心 v4.2+ (對較早核心版本的支援存在,但存在錯誤)。若要檢查您目前的 kernel 版本,請使用 uname -r

IPvlan L2 模式使用範例

IPvlan L2 模式拓撲的範例顯示在下圖中。驅動程式使用 -d driver_name 選項指定。在此情況下為 -d ipvlan

Simple IPvlan L2 Mode Example

下一個範例中的父介面 -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 主機之間相同的第二層分段,適用於 IPvlan L2 模式。

Multiple IPvlan hosts

下列操作將建立與之前建立的 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 模式的幹線 (trunking) 在閘道和 L2 路徑隔離方面與 Macvlan 相同。有些細微之處對於 ToR 交換器中的 CAM 表壓力、每個埠一個 MAC 以及主機父網卡 (NIC) 上的 MAC 耗盡等方面可能是有利的。802.1Q 幹線情境看起來也是一樣的。這兩種模式都遵循標記標準,並與實體網路無縫整合,用於底層整合和硬體供應商外掛程式整合。

位於相同 VLAN 上的主機通常在相同的子網路上,並且幾乎總是根據其安全策略進行分組。在大多數情境中,多層應用程式會分層到不同的子網路中,因為每個行程的安全設定檔 (security profile) 都需要某種形式的隔離。例如,將您的信用卡處理託管在與前端網頁伺服器相同的虛擬網路中,將會是一個法規遵循問題,同時也規避了長期以來分層縱深防禦架構的最佳實踐。使用疊加驅動程式時,VLAN 或等效的 VNI (虛擬網路識別碼) 是隔離租戶流量的第一步。

Docker VLANs in-depth

帶有 VLAN 標記的 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 表示 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

一個關鍵的重點是,營運者能夠將其實體網路映射到其虛擬網路中,以便將容器整合到其環境中,而無需進行任何操作上的大修。網路營運 (NetOps) 將一個 802.1Q 幹線放入 Docker 主機。該虛擬連結就是網路建立中傳遞的 -o parent=。對於未標記 (非 VLAN) 的連結,只需 -o parent=eth0;對於帶有 VLAN ID 的 802.1Q 幹線,每個網路都會映射到網路中相應的 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 將如何融入容器網路的人,請參閱以下範例。

Docker IPvlan L2 mode

IPvlan L3 模式會丟棄所有廣播和多播流量。單憑這一點,IPvlan L3 模式就成為那些尋求大規模和可預測網路整合的首選。它是可預測的,進而會帶來更高的正常運行時間,因為它不涉及橋接。橋接迴圈是導致重大中斷的原因,根據故障域的大小,可能很難精確定位。這是由於 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 routeip -6 route 的 CLI 輸出。

模式 -o ipvlan_mode=l3 必須明確指定,因為 IPvlan 的預設模式是 l2

下一個範例未指定父介面。網路驅動程式將為使用者建立一個 dummy 類型連結,而不是拒絕網路建立並隔離容器,使其只能相互通訊。

# 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 主機乙太網路介面主機 IP 位址的路由。

雙堆疊 IPv4 IPv6 IPvlan L2 模式

  • Libnetwork 不僅讓您完全控制 IPv4 位址設定,還讓您完全控制 IPv6 位址設定,並實現這兩個位址系列之間的功能對等。

  • 下一個範例將從僅 IPv6 開始。在相同的 VLAN 139 上啟動兩個容器並相互 ping 通。由於未指定 IPv4 子網路,預設的 IPAM 將配置一個預設的 IPv4 子網路。除非上游網路在 VLAN 139 上明確路由該子網路,否則該子網路是隔離的。

# 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 請求。然而,只要 IPvlan L3 模式下的不同子網路共享相同的 -o parent 父連結,它就能路由它們之間的單播流量。

雙堆疊 IPv4 IPv6 IPvlan L3 模式

範例:IPvlan L3 模式雙堆疊 IPv4/IPv6,多子網路與 802.1Q VLAN 標籤:118

如所有範例所示,不一定要使用帶有標籤的 VLAN 介面。子介面可以替換為 eth0eth1bond0 或主機上除 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.

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 使用者提供最大的靈活性。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.