目錄
一、docker網絡概述
二. docker的三種原生網絡
1.bridge模式
2.host模式
3.none模式
三.docker自定義網絡
bridge
Macvlan
四、docker容器間的通信
1.使用名稱
2.container模式
3.link模式
4.docker容器通路外部網絡
5.外部網絡通路容器
五、跨主機的容器網絡
macvlan網絡方案的實作
一、docker網絡概述
Docker作為目前最火的輕量級容器技術,牛逼的功能,如Docker的鏡像管理,不足的地方網絡方面。
Docker自身的4種網絡工作方式,和一些自定義網絡模式
安裝Docker時,它會自動建立三個網絡,bridge(建立容器預設連接配接到此網絡)、 none 、host,可以使用以下指令檢視:
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
40cded417d85 bridge bridge local
77d8c7928820 host host local
d14907884859 none null local
二. docker的三種原生網絡
可以看到容器的主控端server1上面多了一個網橋接口,這個橋接接口供容器和外界通信
類似于實體機和虛拟機的關系,虛拟機要上網就得通過實體機才可以
1.bridge模式
docker預設網絡模式。此模式将容器連接配接到一個docker0虛拟網橋,通過docker0網橋以及Iptables nat表配置與主控端通信。開啟的容器會自動配置設定和IP在一個網段的ip位址,并且開啟的容器的ip以IP為基礎遞增關閉容器之後,ip會自動釋放。bridge模式隻有主控端才能與運作在其上面的容器進行通信。
運作一個容器
可以看到這個容器的ip與橋接接口在一個網段,并且ip位址以網橋ip為基礎遞增,以網橋ip為網關
開啟容器的時候主控端就能ping通容器
以上就是基本的bridge模式,一般開啟的容器預設使用的也是這種網絡模式
2.host模式
容器将不會虛拟出自己的網卡,配置自己的IP等,而是直接與主控端的共享P和端口。
以host模式運作一個容器vm1
[[email protected] ~]# docker run -it --name vm1 --network host busybox
/ # 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 52:54:00:dc:b7:52 brd ff:ff:ff:ff:ff:ff
inet 172.25.254.1/24 brd 172.25.254.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fedc:b752/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
link/ether 02:42:d6:9a:3b:e7 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:d6ff:fe9a:3be7/64 scope link
valid_lft forever preferred_lft forever
可以看到容器vm1的網絡與主控端一模一樣
但可以看到主控端和容器的運作環境不一樣,這就是容器共享主控端的網絡
接下來host模式運作一個nginx容器
[[email protected] ~]# docker run -d --name vm1 --network host nginx
a92b4b91a095077c37d9f98560df76c8d3f9d106fa9d1205b376349b02d5d962
[[email protected] ~]#
在真機上可以通路到主控端的ip,看到nginx服務的預設頁面,其實通路的是容器
因為容器的ip與主控端的ip一模一樣
不是bridge模式,是以橋接沒有
[[email protected] ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242d69a3be7 no
[[email protected] ~]#
3.none模式
該模式關閉了容器的網絡功能。
可以看到隻有回環接口,主控端禁止容器使用網絡
對于那種比較機密的服務所在的容器可以使用這種網絡模式
[[email protected] ~]# docker run -it --name vm2 --network none busybox
/ # 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
/ #
三.docker自定義網絡
docker提供了三種自定義網絡驅動:
- bridge
- overlay
- macvlan
bridge驅動類似與預設的bridge網絡模式,但是增加了一些新的功能,overlay和macvlan是用于建立跨主機網絡。
建議使用自定義的網橋來控制哪些容器可以互相通信,還可以自動DNS解析容器名稱到IP位址。Docker提供了建立這些網絡的預設網絡驅動程式,你可以建立一個新的Bridge網絡,Overlay或Macvlan網絡。你還可以建立一個網絡插件或遠端網絡進行完整的自定義和控制。
你可以根據需要建立任意數量的網絡,并且可以在任何給定時間将容器連接配接到這些網絡中的零個或多個網絡。此外,您可以連接配接并斷開網絡中的運作容器,而無需重新啟動容器。當容器連接配接到多個網絡時,其外部連接配接通過第一個非内部網絡以詞法順序提供。
接下來介紹Docker的内置網絡驅動程式。
bridge
一個bridge網絡是Docker中最常用的網絡類型。橋接網絡類似于預設bridge網絡,但添加一些新功能(例DNS)并删除一些舊的能力。以下示例建立一些橋接網絡,并對這些網絡上的容器執行一些實驗。
[[email protected] ~]# docker network create -d bridge mynet1
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
40cded417d85 bridge bridge local
77d8c7928820 host host local
30b2035de6a1 mynet1 bridge local #增加了這個網絡
d14907884859 none null local
建立網絡後,可以看到新增加了一個網橋(172.18.0.1)。
建立容器,并且ping容器的名稱:
[[email protected] ~]# docker run -it --name demo --network mynet1 busybox
/ # ping demo
PING demo (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.041 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.050 ms
可以ping通表示有DNS。
而使用預設的bridge就沒有DNS:
在建立網絡時我們也可以
自己指定 IP 網段
,隻需在建立網段時指定
--subnet
和
--gateway
參數:
[[email protected] ~]# docker network create --subnet 172.88.0.0/24 --gateway 172.88.0.1 mynet1
6d0d8f7a7d4675482a256cb8e226fa017d75dcaf2f65544e089a49f89b71851f
[[email protected] ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
40cded417d85 bridge bridge local
1e67566ee960 harbor_harbor bridge local
77d8c7928820 host host local
6d0d8f7a7d46 mynet1 bridge local
d14907884859 none null local
檢視網絡:
在這個自定義網絡下運作一個容器并檢視網絡可以發現自定義網段成功:
也可以在容器建立時指定容器的ip:
但是
--ip
選項隻有在指定了
subnet
以及
gateway
選項的情況下可以指定。
可以使用以下指令來
删除自定義網絡
,比如删除mynet2:
[[email protected] ~]# docker network create -d bridge mynet2
[[email protected] ~]# docker network rm mynet2
同時需要注意的是,同一個自定義的網絡下的兩個容器可以通信,而不同的自定義網絡下面的兩個容器不能通信。即橋接到同一網橋上的容器彼此可以通信,橋接到不同網橋上的容器,彼此不同能通信。
但是有時候我們确實需要兩個不同網橋的容器通信,我們可以給一個容器再添加一個網卡,原理如下:
示例:
我們有兩個容器分别橋接到兩個網橋上,
demo--mynet1
;
test--mynet2
:
此時兩個容器不可以通信,我們使用
docker network connect
為一個容器添加網卡:
[[email protected] ~]# docker network connect mynet1 test #為容器test添加一個可以連接配接mynet1的網卡
添加後的效果:
Macvlan
Macvlan是一個新的嘗試,是真正的網絡虛拟化技術的轉折點。Linux實作非常輕量級,因為與傳統的Linux Bridge隔離相比,它們隻是簡單地與一個Linux以太網接口或子接口相關聯,以實作網絡之間的分離和與實體網絡的連接配接。
Macvlan提供了許多獨特的功能,并有充足的空間進一步創新與各種模式。這些方法的兩個進階優點是繞過Linux網橋的正面性能以及移動部件少的簡單性。删除傳統上駐留在Docker主機NIC和容器接口之間的網橋留下了一個非常簡單的設定,包括容器接口,直接連接配接到Docker主機接口。由于在這些情況下沒有端口映射,是以可以輕松通路外部服務。
overlay和macvlan将在下文詳細介紹
四、docker容器間的通信
1.使用名稱
容器之間除了使用ip通信外,還可以使用容器名稱通信
- docker 1.10開始,内切了一個DNS server
- dns解析功能必須再自定義網絡中使用
- 啟動容器時使用–name參數指定容器名稱。
在上一部分的内容中已經介紹過,這裡不再贅述。
2.container模式
模式示意圖:
示例:
可以看出使用這種模式後demo1的網絡與demo完全相同。
使用這種模式可以實作在一個容器上通路localhost即可通路另一個容器:
3.link模式
--link
可以用來連接配接兩個容器
--link
的格式:
--link <name or id>:alias
#name 和 id 是源容器的name和id,alias是源容器在link下的别名。
使用–link連接配接兩個容器之後可以繼承變量:
注意,當上例中vm1當機再重新開機并且ip位址變了的情況下,在新的容器ip會同步更新但是變量不會同步更新。
4.docker容器通路外部網絡
5.外部網絡通路容器
還可以使用上文的host模型。
五、跨主機的容器網絡
macvlan網絡方案的實作
首先在兩個虛拟機上各添加一個網卡eth1,并且編輯網絡配置檔案:
[[email protected] network-scripts]# vim ifcfg-eth1
[[email protected] network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
[[email protected] network-scripts]# ifup eth1
[[email protected] ~]# ip link set eth1 promisc on #帶開混雜模式
server2也是相同的操作。
在兩台主機上各建立macvlan網絡:
server1:
[[email protected] ~]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth1 mynet1
b124690d2cb5ff06c1f9042fea13674a5369fa406b1d37db183491ae4d1ccde7
[[email protected] ~]# docker run -it --name vm1 --rm --network mynet1 --ip 172.20.0.100 busyboxplus
/ # ip addr
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
140: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:14:00:64 brd ff:ff:ff:ff:ff:ff
inet 172.20.0.100/24 brd 172.20.0.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
server2:
[[email protected] docker]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway 172.20.0.1 -o parent=eth1 mynet1
f8dd912398e8cfb44b5d51c6af7b767ab739f068405bc6d530387994fb5c6bbe
[[email protected] docker]# docker run -it --name vm2 --rm --network mynet1 --ip 172.20.0.200 busyboxplus
/ # ip addr
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
5: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:14:00:c8 brd ff:ff:ff:ff:ff:ff
inet 172.20.0.200/24 brd 172.20.0.255 scope global eth0
valid_lft forever preferred_lft forever
現在兩個容器就可以通信了:
網絡結構分析:
- 需要注意的是,macvlan會獨占主機網卡,但可以使用vlan子接口(即在一個網卡上建立多個ip)實作多macvlan網絡。
-
vlan可以将實體二層網絡劃分為4094個邏輯網絡,彼此隔離,vlan id 取值為1~4094。
示例:
[[email protected] ~]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1.1 mynet2
29553d70faa505fc5ce8d64d76aff6c573c5a081625a027d494aa56057fadfdf