3. docker網(wǎng)絡(luò)模式

1 基本概念

網(wǎng)絡(luò)命名空間
Linux 網(wǎng)絡(luò)命名空間是內(nèi)核中隔離的網(wǎng)絡(luò)棧,具有自己的接口,路由和防火墻規(guī)則。它負責(zé)容器和 Linux 的安全方面,用于隔離容器。

在網(wǎng)絡(luò)術(shù)語中,它們類似于 VRF,它將主機內(nèi)的網(wǎng)絡(luò)控制和數(shù)據(jù)隔離。網(wǎng)絡(luò)命名空間確保同一主機上的兩個容器無法相互通信,甚至無法與主機本身通信,除非通過 Docker 網(wǎng)絡(luò)進行配置。通常,Docker網(wǎng)絡(luò)驅(qū)動程序為每個容器實現(xiàn)單獨的命名空間。但是,容器可以共享相同的網(wǎng)絡(luò)命名空間,甚至可以是主機網(wǎng)絡(luò)命名空間的一部分。主機網(wǎng)絡(luò)命名空間容納主機接口和主機路由表。此網(wǎng)絡(luò)命名空間稱為全局網(wǎng)絡(luò)命名空間。

虛擬以太網(wǎng)設(shè)備
虛擬以太網(wǎng)設(shè)備或簡稱 veth 是 Linux 網(wǎng)絡(luò)接口,充當兩個網(wǎng)絡(luò)命名空間之間的連接線。veth 是一個全雙工鏈接,每個命名空間中都有一個接口。一個接口中的流量被引導(dǎo)出另一個接口。Docker 網(wǎng)絡(luò)驅(qū)動程序利用 veth 在創(chuàng)建 Docker 網(wǎng)絡(luò)時提供名稱空間之間的顯式連接。當容器連接到 Docker 網(wǎng)絡(luò)時,veth 的一端放在容器內(nèi)(通常被視為 ethX 接口),而另一端連接到 Docker 網(wǎng)絡(luò)。

2 Bridge模式

當Docker進程啟動時,會在主機上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,默認主機上啟動的Docker容器會連接到這個虛擬網(wǎng)橋上,從docker0子網(wǎng)中分配一個 IP 給容器使用,并設(shè)置 docker0 的 IP 地址為容器的默認網(wǎng)關(guān)。在主機上創(chuàng)建一對虛擬網(wǎng)卡veth pair設(shè)備,Docker 將 veth pair設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0(容器的網(wǎng)卡),另一端放在主機中,以vethxxx這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入到 docker0 網(wǎng)橋中。可以通過brctl show命令查看。

bridge模式是 docker 的默認網(wǎng)絡(luò)模式,不寫--network參數(shù),就是bridge模式。使用docker run -p時,docker 實際是在iptables做了DNAT規(guī)則,實現(xiàn)端口轉(zhuǎn)發(fā)功能??梢允褂?code>iptables -t nat -vnL查看。

通過這種方式,主機可以跟容器通信,容器之間也可以相互通信。我們也可以創(chuàng)建自定義bridge以滿足個性化的網(wǎng)絡(luò)需求。

3 Host 模式

docker run ... --network host
如果啟動容器的時候使用host模式,那么這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬出自己的網(wǎng)卡,配置自己的 IP 等,而是使用宿主機的 IP 和端口,主機名也是使用宿主機的。但是,容器的其他方面,如文件系統(tǒng)、進程列表等還是和宿主機隔離的。

host 模式的容器可以訪問主機上的其他任一容器。

4 None模式

docker run ... --network none
使用none模式,Docker 容器擁有自己的 Network Namespace,但是,并不為Docker 容器進行任何網(wǎng)絡(luò)配置。也就是說,這個 Docker 容器沒有網(wǎng)卡、IP、路由等信息。需要我們自己為 Docker 容器添加網(wǎng)卡、配置 IP 等。

5 Container模式

docker run ... --network container:已運行的容器名稱|ID


在創(chuàng)建容器時通過參數(shù)--network container:已運行的容器名稱|ID指定,處于這個模式下的 Docker 容器會共享一個網(wǎng)絡(luò)棧,這樣兩個容器之間可以使用 localhost 高效快速通信。
Container 網(wǎng)絡(luò)模式即新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的 IP,而是和一個指定的容器共享 IP、端口范圍、主機名等。同樣兩個容器除了網(wǎng)絡(luò)方面相同之外,其他的如文件系統(tǒng)、進程列表等還是隔離的。

6 Overlay模式

overlay 使用 Swarm 分布式控制面板,在非常大規(guī)模的集群中提供集中化管理、穩(wěn)定性和安全性。
啟動docker swarm之后會在host上啟動了2個端口,docker_gwbridgeingress:

  • ingress是overlay網(wǎng)絡(luò), 用來與其他容器跨host通信.
  • docker_gwbridgebridge模式的網(wǎng)絡(luò),通過bridge方式提供容器與host的通信,以及與外部網(wǎng)絡(luò)通信
  1. 容器的網(wǎng)絡(luò)命名空間與overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間通過一對veth pair連接起來,當容器對外通信時,veth pair起到網(wǎng)線的作用,將流量發(fā)送到overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間中。
  2. 容器的veth pair對端veth2與vxlan設(shè)備通過br0這個Linux bridge橋接在一起,br0在同一宿主機上起到虛擬機交換機的作用,如果目標地址在同一宿主機上,則直接通信,如果不再則通過設(shè)置在vxlan1這個vxlan設(shè)備進行跨主機通信。
  3. vxlan1設(shè)備上會在創(chuàng)建時,由docker daemon為其分配vxlan隧道ID,起到網(wǎng)絡(luò)隔離的作用。
  4. docker主機集群通過key/value存儲共享數(shù)據(jù),在7946端口上,相互之間通過gossip協(xié)議學(xué)習(xí)各個宿主機上運行了哪些容器。守護進程根據(jù)這些數(shù)據(jù)來在vxlan1設(shè)備上生成靜態(tài)MAC轉(zhuǎn)發(fā)表。
  5. 根據(jù)靜態(tài)MAC轉(zhuǎn)發(fā)表的設(shè)置,通過UDP端口4789,將流量轉(zhuǎn)發(fā)到對端宿主機的網(wǎng)卡上。
  6. 根據(jù)流量包中的vxlan隧道ID,將流量轉(zhuǎn)發(fā)到對端宿主機的overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間中。
  7. 對端宿主機的overlay網(wǎng)絡(luò)的網(wǎng)絡(luò)命名空間中br0網(wǎng)橋,起到虛擬交換機的作用,將流量根據(jù)MAC地址轉(zhuǎn)發(fā)到對應(yīng)容器內(nèi)部。

7 Macvlan模式

docker run ... --network macvlan網(wǎng)絡(luò)名
macvlan 不使用 Linux 網(wǎng)橋進行隔離,而是簡單地與 Linux 以太網(wǎng)接口或子接口相關(guān)聯(lián),以強制實現(xiàn)網(wǎng)絡(luò)之間的分離以及與物理網(wǎng)絡(luò)的連接。
macvlan 驅(qū)動程序使用父接口的概念。此接口可以是物理接口,例如 eth0,用于 802.1q VLAN 標記的子接口,如 eth0.10(.10 表示 VLAN 10),或者甚至是bond接口。macvlan 子接口和原來的主接口是完全獨立的,可以單獨配置 MAC 地址和 IP 地址,而 VLAN 子接口和主接口共用相同的 MAC 地址。VLAN 用來劃分廣播域,而 macvlan 共享同一個廣播域
Docker只支持macvlan的bridge模式,這種模式下,模擬的是 Linux bridge 的功能,但比 bridge 要好的一點是每個接口的 MAC 地址是已知的,不用學(xué)習(xí)。所以,這種模式下,子接口之間就是直接可以通信的。

Macvlan 需要物理網(wǎng)口開啟混雜模式,這樣才能接受非網(wǎng)卡mac 地址的數(shù)據(jù)包。
臨時開啟:
ip link set [interface] promisc on
永久開啟:
vim /etc/sysconfig/network-scripts/ifcfg-eth1
PROMISC=yes

7.1 不同host主機,相同macvlan網(wǎng)絡(luò)的通信


兩個host創(chuàng)建相同的macvlan網(wǎng)絡(luò),將container加入進去

docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=eth0 mac1

7.2 不同host主機,不同macvlan網(wǎng)絡(luò)的通信


由于 macvlan 網(wǎng)絡(luò)會獨占物理網(wǎng)卡,也就是說一張物理網(wǎng)卡只能創(chuàng)建一個 macvlan 網(wǎng)絡(luò),如果我們想創(chuàng)建多個 macvlan 網(wǎng)絡(luò)就得用多張網(wǎng)卡,使用子接口解決這個問題。

將不同macvlan綁定到不同的子接口上,不同網(wǎng)段的互通借助外部3層IP網(wǎng)關(guān)解決

docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=eth0.10 mac10
docker network create -d macvlan --subnet=172.16.20.0/24 --gateway=172.16.20.1 -o parent=eth0.20 mac20

8 IPVlan模式

IPVlan 和 macvlan 類似,都是從一個主機接口虛擬出多個虛擬網(wǎng)絡(luò)接口。一個重要的區(qū)別就是所有的虛擬接口都有相同的 mac 地址,而擁有不同的 ip 地址。因為所有的虛擬接口要共享 mac 地址,所有有些需要注意的地方:

  • DHCP 協(xié)議分配 ip 的時候一般會用 mac 地址作為機器的標識。這個情況下,客戶端動態(tài)獲取 ip 的時候需要配置唯一的 ClientID 字段,并且 DHCP server 也要正確配置使用該字段作為機器標識,而不是使用 mac 地址

NOTE: containers不能ping通底層host接口,Linux會將他們隔離開來。

兩種模式
ipvlan 有兩種不同的模式:L2 和 L3。一個父接口只能選擇一種模式,依附于它的所有虛擬接口都運行在這個模式下,不能混用模式。
L2模式
ipvlan L2 模式和 macvlan bridge 模式工作原理很相似,父接口作為交換機來轉(zhuǎn)發(fā)子接口的數(shù)據(jù)。同一個網(wǎng)絡(luò)的子接口可以通過父接口來轉(zhuǎn)發(fā)數(shù)據(jù),而如果想發(fā)送到其他網(wǎng)絡(luò),報文則會通過父接口的路由轉(zhuǎn)發(fā)出去。
L3模式
L3 模式下,ipvlan 有點像路由器的功能,它在各個虛擬網(wǎng)絡(luò)和主機網(wǎng)絡(luò)之間進行不同網(wǎng)絡(luò)報文的路由轉(zhuǎn)發(fā)工作。只要父接口相同,即使虛擬機/容器不在同一個網(wǎng)絡(luò),也可以互相 ping 通對方,因為 ipvlan 會在中間做報文的轉(zhuǎn)發(fā)工作。

9 網(wǎng)絡(luò)配置

docker network COMMAND

Commands:
  connect     將container連接到一個network上
  create      創(chuàng)建一個network
  disconnect  將container與network解除連接
  inspect     顯示network的詳細信息
  ls          顯示當前已創(chuàng)建的所有network
  prune       刪除所有沒有被使用的network
  rm          刪除1個或多個network

9.1 docker network create

docker network create [OPTIONS] network名字 創(chuàng)建一個新的網(wǎng)絡(luò)

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver               網(wǎng)絡(luò)模式,默認是bridge,可選ipvlan、macvlan、overlay
      --gateway              IPv4 或 IPv6 網(wǎng)關(guān),不配置docker會指定subnet第1個地址X.X.X.1,如配置ip-range,指定ip-range第1個地址X.X.X.0
      --ingress              overlay模式,作為與其他容器跨host通信的網(wǎng)絡(luò)時配置
      --internal             限制外部訪問網(wǎng)絡(luò)
      --ip-range             執(zhí)行容器的IP范圍,格式同subnet參數(shù),容器不配置--ip參數(shù),默認從這段分配ip
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              設(shè)置特殊參數(shù),eg:macvlan/ipvlan模式設(shè)置主機接口,parent=eth0/br0...
      --scope                Control the network's scope
      --subnet               網(wǎng)絡(luò)地址范圍,eg:172.17.0.0/16

例子:
創(chuàng)建bridge模式的br0網(wǎng)絡(luò)

docker network create \
  --driver=bridge \
  --subnet=172.28.0.0/16 \
  --ip-range=172.28.5.0/24 \
  --gateway=172.28.5.254 \
  br0

創(chuàng)建macvlan模式的my-macvlan-net網(wǎng)絡(luò),host物理接口是eth0

docker network create -d macvlan \
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1 \
  -o parent=eth0 \
  my-macvlan-net

9.2 docker network connect

docker network connect [OPTIONS] NETWORK名字 CONTAINER名字 將容器連接到網(wǎng)絡(luò),可以按名稱或ID連接容器。連接后,容器可以與同一網(wǎng)絡(luò)中的其他容器通信。

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      網(wǎng)絡(luò)的驅(qū)動程序選項
      --ip string               指定IPv4地址
      --ip6 string              指定IPv6地址
      --link list               Add link to another container
      --link-local-ip strings   指定IPv6 link-local地址

例子:

docker network connect --ip 10.10.36.122 multi-host-network container2

9.3 docker network disconnect

docker network disconnect [OPTIONS] NETWORK名字 CONTAINER名字 斷開容器與網(wǎng)絡(luò)的連接

9.4 docker network inspect

docker network inspect [OPTIONS] NETWORK名字1 [NETWORK名字2...] 返回有關(guān)一個或多個網(wǎng)絡(luò)的信息。默認情況下,此命令將所有結(jié)果呈現(xiàn)在JSON對象中。

10 docker run --link

容器需要使用另外一些容器提供的服務(wù),使用--link建立兩個容器間通信。link是單向的,相當于在容器內(nèi)添加到目標容器name或alias的host解析,可以通過容器name或alias訪問目標容器。
--link=name-or-id[:alias]alias是可選項,是為目標容器起的別名

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容