1. 程式人生 > 其它 >Docker基本命令與使用 —— Docker容器網路深入篇(五)

Docker基本命令與使用 —— Docker容器網路深入篇(五)

1.Docker網路介紹

Docker網路官網: https://docs.docker.com/network/ Docker是基於Linux Kernel的namespace, CGroups, UnionFileSystem等技術封裝成的一種自定義的容器格式,從而提供了一套虛擬執行環境。 namespace: 用來做隔離的,比如pid[程序]、net[網路]、mnt[掛載點] CGroups: Controller Groups 用來做資源限制,比如記憶體和CPU等 Union Filie Systems: 用來做Image和Container分層   1.1 Linux中網絡卡
# 檢視網路資訊 
ip a[ddr]
lo: 本地網絡卡,迴環的網路介面127.0.0.1 eth0: 網路通訊的,用來連線網路的 eth1: 本地網絡卡,虛擬機器配置的網段,與宿主機關聯 docker0: docker的網絡卡
# 簡化命令 
ip link show 
# 都是以檔案形式儲存 
ls /sys/class/net
修改網路配置:linux 網路.note [參考]
cd /etc/sysconfig/network-scripts/ 
vi ifcfg-eth0
 一個網絡卡可以繫結多個IP
ip addr add 192.168.100.120/24 dev eth0    # 給eth0網絡卡新增192.168.100
.120的ip資訊 ip addr delete 192.168.100.120/24 dev eth0 # 刪除新增的IP
  1.2 Network Namespace Network Namespace是實現網路虛擬化的重要功能,它能建立多個隔離的網路空間,它們有獨自的網路棧資訊.不管是虛擬機器還是容器,執行的時候彷彿自己就在獨立的網路中. Network Namespace 實戰
# 新增一個namespace
ip netns add ns1

# 檢視當前具有的namespace
ip netns list

# 刪除namespace
ip netns delete ns1

# 進入net的名稱空間
ip netns exec ns1 ip a
ns1的lo 與宿主機網路是隔離的 預設lo的state狀態時DOWN.
# 啟動 lo 網絡卡
ip netns exec ns1 ifup lo
ip netns exec ns1 ip link set lo up    #等同於

# 停掉 lo 網絡卡
ip netns exec ns1 ifdown lo
ip netns exec ns1 link set lo down    #等同於
 
  1. 兩個namespace互聯
veth pair:虛擬乙太網連線。必須是成對出現的。 思想:在宿主機上建立成對的veth網絡卡,分別分配給ns1和ns2,來實現ns1和ns2通訊的。
# 建立ns2,並啟用網絡卡
ip netns add ns2
ip netns exec ns2 ip link set lo up

# 建立veth peer
ip link add veth-ns1 type veth peer name veth-ns2
# 將veth-ns1交給ns1
ip link set veth-ns1 netns ns1
ip netns exec ns1 ip a        # 檢視
# 由於狀態時Dwon,現在將它啟用
ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns1 ip a    

此處雖然網絡卡啟動了,但是沒有ip,因為它也不知道。所以要設定一下。

ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns1 ip a 
同理,設定ns2的veth
ip link set veth-ns2 netns ns2
ip netns exec ns2 ip a 
ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
ip netns exec ns2 ip a 
ip netns exec ns2 ip link set veth-ns2 up
ip netns exec ns2 ip a 

兩邊都設定好,成對的網絡卡才能上線,網絡卡狀態都UP

現在狀態如圖
# 檢視連通性
ip netns exec ns1 ping 192.168.0.12
ip netns exec ns2 ping 192.168.0.11

1.3 docker網路通訊

先啟動兩個docker容器(需要帶有ip 命令) yum install initscripts -y
docker run -d --name tomcat01 -p 8081:8080 tomcat
docker run -d --name tomcat02 -p 8082:8080 tomcat
兩個容器可以互相連通:   [思考:它們分別屬於兩個不同的namespace,它們是如何ping通的?] 在宿主機執行 ip a 發行多了兩張網絡卡,分別是 if6 和 if8 , 對應到容器中的是 if7 和 if9 原理圖如下: 驗證:
yum install -y bridge-utils
brctl show
7和9實際是docker0 維護的兩塊網絡卡。每多一個容器,docker0 就會多一個維護的網絡卡,進行和容器內網路通訊。   1.4 深入分析Container 網路 - Bridge 1.4.1 docker預設bridge.
docker network ls
# 驗證檢視
docker network inspect bridge
  [思考:docker容器為什麼能訪問外網?] 容器本身只有lo 本地迴環網路,和與docker0通訊的eth0。並沒有連線外網的方式。 網路轉換,利用iptables相關技術。(需要很強的linux網路知識) iptables-save 1.4.2 docker自定義Network
# 建立新的網絡卡資訊
docker network create tomcat-net
docker network ls
docker network inspect tomcat-net    # 現在沒有什麼網絡卡資訊,containers為空
# 刪除網絡卡資訊
docker network rm tomcat-net
docker network ls
# 建立時指定ip段
docker network create --subnet=172.18.0.0/24 tomcat-net
# 指定容器使用新建立的網路(網絡卡)
docker run -d --name custom-net-tomcat --network tomcat-net tomcat

docker exec -it custom-net-tomcat ip a

檢視發行已經使用了新的18網段了

宿主機使用 ip a ,發現多了新建立的網橋,和 if19 [ 對應 上面容器內的 if20] 使用 brctl show ,發現多了一個網橋,對應的介面就是 if19 示意圖: 此兩個網路互相ping不通 172.17.0.2 〈-〉 172.18.0.2  如何使此兩個網段能互相訪問? 給tomcat01再分配新的IP,18網段使它們能夠相互通訊。
# 檢視原先tomcat-net網路資訊
docker network inspect tomcat-net

此處只有一個172.18.0.2的容器

# 讓tomcat-net網絡卡 連線tomcat01 容器
docker network connect tomcat-net tomcat01
# 再次檢視tomcat-net網路
docker network inspect tomcat-net

發現tomcat01已經分配了172.18.0.3 的IP

再次檢視tomcat01容器內的網絡卡資訊,發現增加了eth@if24網絡卡,IP為172.18.0.3 宿主機 ip a 發現也多了一個if23的網絡卡
# 測試發現 tomcat01 和 custom-net-tomcat 兩個容器已經能互相訪問
docker exec -it tomcat01 ping 172.18.02
docker exec -it custom-net-tomcat ping 172.18.0.3

通過inspect檢視 tomcat-net網路。發現它有一個容器name和ip的對應,實際它實現了類似dns的功能,刻意直接訪問容器名。

docker network inspect tomcat-net
# 測試發現 這樣也是能 ping 的通的
docker exec -it tomcat01 ping custom-net-tomcat
docker exec -it custom-net-tomcat ping tomcat01
1.5 深入分析Container 網路 -- Host和None Host:
# 建立一個host模式的容器
docker run -d --name my-tomcat-host --network host tomcat
# 發現此網路資訊就是宿主機的網路資訊
docker exec -it my-tomcat-host ip a
# 檢視host網路資訊
docker network inspect host

發現mac地址和ip都沒有分配,其實就是利用宿主機的配置

None:
# 建立一個host模式的容器
docker run -d --name my-tomcat-none --network none tomcat
# 檢視網路
docker exec -it my-tomcat-host ip a

發現只有本地的迴環網路,沒有其他的網路資訊。說明通過none模式建立的容器,對外部是不通的。

# 檢視none網路資訊
docker network inspect none

同樣的mac地址和ip都沒有。

  1.6 埠對映
docker run -d --name port-tomcat -p 8090:8080 tomcat

它對映到宿主的8090埠,外部機器也可以通過宿主機的ip:8090訪問到該服務。

1.7 多機通訊 Docker Swarm技術 docker swarm 用的是ingress overlay網路
docker service create --name my-tomcat -p 8088:8080 tomcat

雖然只是分配到node1節點,但叢集所有ip:8088均能訪問到這個服務 。

底層是通過overlay實現的。 overlay overlay在網路技術領域,指的是一種網路架構上疊加的虛擬化技術模式,其大體框架是對基礎網路不進行大規模修改的條件下,實現應用在網路上的承載,並能與其他網路業務分離,並且以基於IP的基礎網路技術為主 VXLAN(Virtual extensible LAN)技術是當前主流的Overlay標準