Docker基本命令與使用 —— Docker容器網路深入篇(五)
阿新 • • 發佈:2022-05-09
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.1001.2 Network Namespace Network Namespace是實現網路虛擬化的重要功能,它能建立多個隔離的網路空間,它們有獨自的網路棧資訊.不管是虛擬機器還是容器,執行的時候彷彿自己就在獨立的網路中. Network Namespace 實戰.120的ip資訊 ip addr delete 192.168.100.120/24 dev eth0 # 刪除新增的IP
# 新增一個namespace ip netns add ns1 # 檢視當前具有的namespace ip netns list # 刪除namespace ip netns delete ns1 # 進入net的名稱空間 ip netns exec ns1 ip ans1的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 #等同於
- 兩個namespace互聯
# 建立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 -ydocker 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 tomcat011.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標準