本文是自己的學習筆記
- 1、Linux中的namespace
- 1.1、創建namespace
- 1.2、兩個namespace互相通信
- 2、Docker中的namespace
- 2.1 容器中的默認Bridge
- 3、容器的三種網絡模式
1、Linux中的namespace
Docker
中使用了虛擬網絡技術,讓各個容器的網絡隔離。好像每個容器從網卡到端口都有自己獨立的一套網絡架構。
namespace
是實現網絡虛擬化的重要功能。
它原本是Linux
系統的提供的功能,Docker
借用這些namespace
實現容器間的隔離。比如PID
的namespace
可以實現進程間的隔離;User namespace
實現用戶和組的隔離;而NET namespace
實現網絡的隔離,這也是本篇文章的重點。
下面是用Linux
的NET namespace
實現網絡隔離的示例。
1.1、創建namespace
輸入ip a
查看所有網卡。圖中顯示有四個。注意第一個網卡lo
,接下來我會創建一個網絡namespace
。這個namespace
也會有一個同名的網卡,但是這兩個網卡是相互隔離的。
現在添加一個namespace
,命名為ns1
。
ip netns add ns1
。
之后進入這個命名空間執行指令,查看這個命名空間的網卡,ip netns exec ns1 ip a
。
里面也有一個lo
網卡,但這個網卡和主機的lo
是完全隔離的。
1.2、兩個namespace互相通信
在 Linux
網絡中,veth-peer (Virtual Ethernet Peer) 指的是 veth (Virtual Ethernet) 設備對中的另一端。veth
設備是一種特殊的虛擬以太網設備,它總是成對出現,可以把它想象成一根虛擬的網線。
我們在兩個namespace
之間創建veth-pair
來實現互相通信。
首先創建兩個namespace
,分別命名為ns1
和ns2
。
之后用下面的指令啟動他們的lo
網卡。
ip netns exec ns1 ifup lo
ip netns exec ns2 ifup lo
創建一個veth-pair
。
ip link add veth-ns1 type veth peer name veth-ns2
。
之后再查看網絡情況,第五和第六就是新建的一對veth
將veth-ns1
設置到ns1
,veth-ns2
設置到ns2
。
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
之后需要在ns1
和ns2
中為這對veth
分配地址。
ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
然后分別到ns1
和ns2
中啟動這對veth
。
ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up
這時候ns1
和ns2
就可以互相ping通。
ns1
和ns2
之間的關系如下圖。
2、Docker中的namespace
2.1 容器中的默認Bridge
在Docker
中,每個容器都有自己的一個namespace
,他們之間的網絡相對獨立。
在默認情況下,這些容器之間也是可以直接相互通信的,不需要特別花心思去建立veth-pair
。
這是因為它們通常連接到同一個虛擬網絡,并且Docker為這個虛擬網絡提供了必要的網絡基礎設施和發現機制。
Docker 默認的網絡模式就是 橋接網絡 (Bridge Network)。當創建一個容器時沒有指定特定網絡時,容器內除了lo
這個回路網卡,還會有一個類似于veth@if43
名字的網卡。下圖是一個tomcat
容器中的網絡情況,有一個veth@if24
的網卡。
這個veth@if43
就是Linux
中的虛擬網線veth
,它就會默認連接到這個 docker0
網橋。
當我們啟動任意一個容器時,查看宿主機的網絡也能看到docker0
會自動創建出來。下圖就是啟動一個tomcat
容器后,宿主機的網絡情況,有個docker0
的網卡。
下面啟動兩個tomcat
容器,然后互相ping
能看到網絡是互通的。
分別命名tomcat01
和tomcat02
兩個容器并啟動。之后執行下面指令查看兩個容器的網絡情況。
docker exec -it tomcat01 ip a
docker exec -it tomcat02 ip a
可以看到tomcat01
有一個網卡是eth0@if24
,地址是172.17.0.2/16
;而tomcat02
則是eth2@if26
,地址172.17.0.3/16
。
然后進入tomcat01
去pingtomcat02
的網卡。
docker exec -it tomcat01 ping 172.17.0.3
結果是網絡可達。
3、容器的三種網絡模式
Dcoker
給容器提供了三種網絡模式。
host
:這個模式下容器將與Docker
主機共享一套網絡架構。none
:這個模式下容器無法與外界甚至主機進行網絡交流。bridge
:容器的默認網絡模式。在這個模式下,容器擁有自己一套獨立的虛擬網絡架構。同時容器中會自動創建一對指向docker0
的veth-pair
。docker0
作為中轉站使所有容器網絡互通,同時容器也必須通過docker0
才能和外界網絡溝通。
我們可以在容器啟動時指定網絡模式。
docker run -d --name my-tomcat-none --network none tomcat-ip:1.0