docker的網路-單主機(三種原生網路)none、host、bridge

林奮鬥的成長之路發表於2021-02-12

docker的網路分為:單主機、跨主機

這篇先說:單主機

我們先說一下docker的原生網路模式

網路模式 簡介 優點  使用場景
none 空網路,沒有網路 此網路與外界隔離,安全度非常高 適合公司內部生產金鑰
host  容器與宿主機共享namespace 直接使用宿主機的網路,網路效能方面最好。  
bridge 此模式會為每一個容器分配、設定IP等,並將容器連線到一個docker0虛擬網橋,通過docker0網橋以及Iptables nat表配置與宿主機通訊。    

 

1、none

none翻譯過來就是沒有的意思,就是沒有網路,對於安全性完全與外界完全隔離。

建立none容器,只有一張lo網路卡!

建立引數 --network  none

1 [root@node1 harbor]# docker run -it --name  none --network  none  busybox:latest 
2 / # ip a
3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
4     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5     inet 127.0.0.1/8 scope host lo
6        valid_lft forever preferred_lft forever

 

2、host

host翻譯為主機,就是主機網路,大致意思就是和宿主機共用的網路;

容器使用host網路,不會去獲取新的network namespace,而是和主機共用一個network namespace。

直接使用宿主機的IP、埠號。所以我們在使用host網路釋出服務的時候,一定要注意埠衝突這個問題。

建立引數 --network host

[root@node1 harbor]# docker run -it --name host --network host busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:22:6c:1c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::5658:12c2:bb4f:b14e/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue qlen 1000
link/ether 52:54:00:d7:f2:59 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 qlen 1000
link/ether 52:54:00:d7:f2:59 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
link/ether 02:42:34:a2:7d:a6 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:34ff:fea2:7da6/64 scope link
valid_lft forever preferred_lft forever
8: br-ffb3d00df08f: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
link/ether 02:42:93:76:c6:32 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-ffb3d00df08f
valid_lft forever preferred_lft forever
inet6 fe80::42:93ff:fe76:c632/64 scope link
valid_lft forever preferred_lft forever

我的宿主機IP為192.168.1.1,上述的網路配置和主機一模一樣

使用場景:對網路傳輸有較高要求,不二選擇!

 

3、bridge

在說這個橋接模式之前,瞭解一個詞“網橋”

網橋:網橋又叫做橋接器,是連線兩個區域網的一種儲存/轉發裝置,它能將一個大的LAN分割為多個網段,或將兩個以上的LAN互聯為一個邏輯LAN,使LAN上的所有使用者都可以訪問伺服器。

簡單說一下:有點想交換機,但是有區別,具體瞭解自行查詢資料。

正式瞭解橋接:

當Docker程式啟動時,會在主機上建立一個名為docker0的虛擬網橋,此主機上啟動的Docker容器會連線到這個虛擬網橋上。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網路中。
從docker0子網中分配一個IP給容器使用,並設定docker0的IP地址為容器的預設閘道器。在主機上建立一對虛擬網路卡veth pair裝置,Docker將veth pair裝置的一端放在新建立的容器中,並命名為eth0(容器的網路卡),另一端放在主機中,以vethxxx這樣類似的名字命名,並將這個網路裝置加入到docker0網橋中。
圖片瞭解:

建立引數:--network bridge

 1 [root@node1 /]# docker run -it --name bridge --network bridge  busybox:latest 
 2 / # ip a
 3 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
 4     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 5     inet 127.0.0.1/8 scope host lo
 6        valid_lft forever preferred_lft forever
 7 27: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
 8     link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
 9     inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
10        valid_lft forever preferred_lft forever

瞭解:docker0預設的IP172.17.0.1,分配容器IP都是依此類推。

實操環節:

1、我們來自定義bridge網路

[root@node1 /]# docker network  create  -d bridge  net1    建立一個名為net1的bridge網路
44686c0ae4194a156c309a18d320d3497551900600b0ef28729152004d6cdf05
[root@node1 /]# docker network  ls  #檢視當前網路卡        
NETWORK ID     NAME            DRIVER    SCOPE
74f8ff66202b   bridge          bridge    local

建立基於net1的容器

[root@node1 /]# docker run -itd --name a1 --network net1 busybox:latest  
026ff92c05a54803333313fe9da077bb47adb5e3cdb0183e86b5a93e4e350da6
[root@node1 /]# docker run -itd --name a2 --network net1 busybox:latest  
cb77b215baff887714cd8a587b981d7e391c4237d95d45e97663d69bf958c2ce
[root@node1 /]# docker run -itd --name a3 --network net1 busybox:latest  
125f031364a66c1568297fb8bbac890abcb8826de15cbf053471974603c965d6
#對於自定義網路的優點可以通過主機名進行ping

測試訪問

[root@node1 /]# docker exec  -it a1 sh
/ # ping a2
PING a2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.065 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.170 ms
^C
--- a2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.065/0.117/0.170 ms
/ # ping a3
PING a3 (172.19.0.4): 56 data bytes
64 bytes from 172.19.0.4: seq=0 ttl=64 time=0.063 ms
64 bytes from 172.19.0.4: seq=1 ttl=64 time=0.058 ms
^C
--- a3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.058/0.060/0.063 ms

 

2、我們來自定義bridge網路,且自定義網段與閘道器

自定義bridge網路

[root@node1 /]# docker network create -d bridge --subnet 172.20.16.0/24 --gateway 172.20.16.254 net2
c517433db7e3230c7faea88cf485e320a10d1a66b8f31e3cd9f2c3e84d4208a4

建立基於bridge網路的容器,指定IP為172.20.16.10、172.20.16.20

[root@node1 /]# docker run -itd --name a4 --network net2 --ip 172.20.16.10 busybox:latest
415193c1a428782b6689881b58e66565e38ec3e699484032ef754c92efd00609
[root@node1 /]# docker run -itd --name a5 --network net2 --ip 172.20.16.20 busybox:latest
6b304a044d60de792188e6bbc2fd414b8c98919413a7bc19a6b58ee7a4b89a9a

測試訪問

[root@node1 /]# docker exec  -it a4 sh
/ # ping a5
PING a5 (172.20.16.20): 56 data bytes
64 bytes from 172.20.16.20: seq=0 ttl=64 time=0.079 ms
^C
--- a5 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.079/0.079/0.079 ms

 

相關文章