Docker 容器網路是容器化應用程式佈署的關鍵環節。理解 Docker 網路模型對於構建穩定的容器化應用至關重要。本文首先介紹如何確認容器執行狀態、查詢容器 IP,以及橋接網路的運作方式。接著,我們會探討 Docker 網路與 Linux 網路技術的底層關聯,並深入解析橋接、覆疊和 MACVLAN 等自訂網路驅動程式。這些驅動程式提供更精細的網路控制,例如 IP 地址管理、跨主機容器通訊和直接連線物理網路等。文章中會提供具體的命令操作示範和組態說明,幫助讀者理解如何在不同場景下選擇合適的網路驅動程式。最後,我們會討論在實務應用中,選擇自訂網路驅動程式時需要考慮的安全性、效能和可擴充套件性等因素,並提供一些最佳實務建議。
Docker 容器網路基礎
確認容器執行狀態與登入
首先,我們需要確認 Docker 容器是否正常執行,並且成功登入。以下是使用 CentOS 容器的步驟:
docker ps
docker exec -it kickass_minsky /bin/bash
在終端機中執行上述命令後,我們可以看到容器的執行狀態及其相關資訊。以下是一個範例輸出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fa5e216d856 centos "/bin/bash" 50 seconds ago Up 49 seconds kickass_minsky
登入容器後,我們可以進一步檢查容器的網路設定。
檢查容器 IP 地址
接下來,我們需要找出 CentOS 容器的 IP 地址。可以使用 ifconfig 命令並過濾 inet 資訊來實作:
ifconfig | grep inet
根據輸出結果,我們可以看到容器的 IP 地址為 10.88.30.156。以下是範例輸出:
inet 10.88.30.156 netmask 255.255.255.128 broadcast 10.88.30.255
inet6 2001:420:1402:2033:2ld:9ff:fe6d:5aea prefixlen 64 scopeid 0x0<global>
inet6 fe80::21d:9ff:fe6d:5aea prefixlen 64 scopeid 0x20<link>
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:bcff:fe24:ee1b prefixlen 64 scopeid 0x20<link>
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0xl0<host>
檢查主機 IP 地址
現在,我們開啟另一個終端機並檢查主機的 IP 地址。這裡也使用 ifconfig 命令並過濾 inet 資訊:
ifconfig | grep inet
根據輸出結果,我們發現容器和主機的 IP 地址相同,都是 10.88.30.156。
橋接網路(Bridge Networking)
橋接(Bridge)網路是 Docker 的預設網路模式,當我們沒有指定任何網路引數時會自動使用此模式。橋接網路會建立一個內部私有網路,讓容器之間能夠互相通訊。這些 IP 地址僅在宿主機內部可見,如果需要外部存取,必須暴露特定的埠號。
檢查橋接網路
我們可以使用以下命令檢查橋接網路的詳細資訊:
docker network inspect bridge
這個命令會顯示橋接網路的組態細節,包括子網、閘道等資訊。
啟動容器並檢查橋接網路
接下來,我們啟動兩個容器,一個指定橋接網路引數,另一個使用預設設定:
docker run -d --network=bridge mysql
docker run -d --network=default tomcat
啟動後,再次執行 docker network inspect bridge 命令,我們可以看到兩個容器已經透過橋接網路連線並在同一子網中通訊。
檢查容器內部網路
我們可以進入每個容器並檢查其內部的網路設定。例如:
docker exec -it <container_id> /bin/bash
ifconfig
這樣可以看到每個容器的網路介面和 IP 地址。
自訂網路(Custom Networks)
除了預設的橋接、無(none)和主機(host)模式外,Docker 支援自訂網路。使用自訂網路可以更靈活地控制容器之間的通訊和安全性。
建立自訂網路
我們可以使用以下命令建立一個自訂的橋接網路:
docker network create my_custom_network
啟動容器並連線自訂網路
建立自訂網路後,我們可以在啟動容器時指定這個自訂網路:
docker run -d --network=my_custom_network mysql
docker run -d --network=my_custom_network tomcat
這樣兩個容器就會連線到同一個自訂橋接網路中。
網路隔離與安全性
自訂網路上的隔離功能可以顯著提升安全性。例如,當多個服務需要共用相同資源但不應互相通訊時,自訂網路上的隔離功能便顯得尤為重要。
隱藏應用程式詳細資訊
在專業環境中通常不希望暴露應用程式細節於多服務共用同一宿主機情況下;這時可以透過 Docker 的自訂網路上來限制內部服務通訊範圍。
######## 各種情境下可適切選擇最合適的 Docker 網路模式使得佈署更加穩定且高效。
自訂網路下連線測試
若要測試連線狀況可透過 ping 命令來驗證兩個不同服務之間的連線狀況;例如 ping MySQL 檢視是否可正常通訊:
ping mysql_container_ip_address_from_tomcat_container # 測試 Tomcat 與 MySQL 是否可通訊。
Docker 與 Linux 網路基礎原理
Docker 的橋接(Bridge)模式其實利用了 Linux 的基本橋接技術將所有連結至 bridge 的容器串聯至同一子網內。 為了實作之目的 Docker 在背後進行許多組態操作以達到此目標;例如組態 iptables、修改 /etc/hosts 檔案等操作以確保該子網內部所有裝置能夠互相通訊:
- iptables:Docker 自動組態 iptables 則程式碼以確保彼此之間都能互相通訊。
- /etc/hosts:Docker 在 host 上建立 /etc/hosts 檔案條目以支援 DNS 查詢需求。 透過上述方式 Docket 不僅簡化了開發人員對於複雜多樣應用環境中的各種維護工作, 同時也提升了跨不同系統之間資源分享效率與安全性。
下篇預告:探討 Docker 的其他高階技術、如 overlay 網路、Macvlan 網路等。
提供具體實作案例及詳細解說未來開發情境中可能遇到各種問題之解決方案。
自訂網路驅動程式:橋接、覆疊與MACVLAN
在 Docker 的容器網路中,自訂網路驅動程式提供了更多的靈活性和功能,這些驅動程式包括橋接網路驅動程式、覆疊網路驅動程式以及MACVLAN網路驅動程式。以下玄貓將探討這三種常用的自訂網路驅動程式,並提供具體的實務案例和技術解析。
橋接網路驅動程式
橋接網路驅動程式類別似於 Docker 的預設橋接網路(docker0),但提供了更多的功能,例如IP地址管理(IPAM)和服務發現。這種網路驅動程式在單一主機上建立虛擬橋接,允許容器之間進行通訊。
建立橋接網路
要建立一個橋接網路,可以使用以下命令:
docker network create --driver bridge pkNetwork
這個命令會建立一個名為 pkNetwork 的橋接網路。如果沒有指定 IP 地址和子網,Docker 會自動分配下一個可用的私有 IP 地址範圍。
驗證橋接網路
建立完成後,可以使用以下命令來檢查網路:
docker network ls
這將列出所有的 Docker 網路,包括剛剛建立的 pkNetwork。
NETWORK ID NAME DRIVER SCOPE
fe3118460998 bridge bridge local
133b7c28f2be docker_gwbridge bridge local
d163ca8f2882 dockerservices_default bridge local
4a8e216f9a47 host host local
vf5dr217stoa ingress overlay swarm
1bb6d94233c0 none null local
33edf6b8d0de pkNetwork bridge local
檢視橋接網路詳細資訊
使用以下命令可以檢視 pkNetwork 的詳細資訊:
docker network inspect pkNetwork
這將顯示 pkNetwork 的組態細節,包括 IPAM 組態和子網資訊。
[
{
"Name": "pkNetwork",
"Id": "33edf6b8d0de1493a2d7dfde6762c1664ce59ae8b38aa7cae0a5726552d8edd9",
"Created": "2017-07-08T21:59:15.821409856Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.20.0.0/16",
"Gateway": "172.20.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
...
}
]
內容解密:
- 名稱與ID:
Name和Id分別是網路的名稱和唯一識別碼。 - 作用範圍:
Scope為local,表示這是一個本地範圍的網路。 - 駕動程式:
Driver為bridge,表示使用的是橋接駕動程式。 - IPAM 組態:
IPAM包含子網和閘道的組態資訊,這些資訊由 Docker 自動生成或根據命令指定。 - 其他選項:如
EnableIPv6,Internal,Attachable, 和Ingress等,這些選項控制了網路的其他行為特性。
容器連線與通訊
在建立容器時,可以指定使用這個自訂橋接網路:
docker run -d --network pkNetwork --name tomcatPK tomcat
這樣,Tomcat 容器就會連線到 pkNetwork 網路中,並且可以與同一網路上的其他容器進行通訊。
測試外部連線
為了讓外部能夠存取到 Tomcat 容器,需要進行埠對映:
docker run -d --network pkNetwork -p 8000:80 --name tomcatPK tomcat
這樣外部就可以透過主機的 8000 埠存取到 Tomcat 容器。
內容解密:
- 埠對映:
-p 8000:80指定將容器內的 80 埠對映到主機的 8000 埠。 - Docker NAT:Docker 引擎會在 Linux 的 iptables 中新增 NAT(網路地址轉換)規則,將外部流量轉發到對應的容器。
覆疊網路驅動程式
覆疊網路驅動程式用於多主機之間的容器通訊。它透過在主機之間建立隧道來實作跨主機的容器連線。這使得多個主機上的容器可以像在同一個本地網路上執行一般進行通訊。
建立覆疊網路
建立覆疊網路類別似於建立橋接網路,但需要指定覆疊駕動程式:
docker network create --driver overlay pkOverlayNetwork
此圖示展示了覆疊網路中的隧道連線:
graph TD;
A[Host1] -->|VXLAN Tunnel| B[Host2];
B -->|VXLAN Tunnel| C[Host3];
subgraph Host1;
C1[Container1] -->|Eth0| A;
end;
subgraph Host2;
C2[Container2] -->|Eth1| B;
end;
subgraph Host3;
C3[Container3] -->|Eth2| C;
end;
內容解密:
- VXLAN隧道:VXLAN(Virtual Extensible LAN)技術用於在不同主機之間建立隧道,使得容器之間可以透過這些隧道進行通訊。
- 隧道連線: 在每個主機上執行容器並設定Linux橋和相關VXLAN介面以啟用連線。
- 跨主機通訊: Container在不同主機上執行但可以透過覆寫層傳輸方式互相溝通。
Docker Swarm 中的覆疊網路
在 Docker Swarm 中,覆疊網路用於多節點叢集中的服務管理和協調。當建立一個服務時,Docker Swarm 應用盡量不讓每個節點都存在所有覆寫層,只會在需要連線時才會啟用該節點所需的組態。
MACVLAN 網路驅動程式
MACVLAN 網路驅動程式允許每個容器擁有自己的 MAC 地址,使得它們能夠直接連線到物理交換機。這種方式適合需要高效率和低延遲的應用場景。
建立 MACVLAN 網路
建立 MACVLAN 網路上需要指定父介面及子介面模式:
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 pkMacvlanNetwork
內容解密:
- 父介面:
-o parent=eth0指定父介面為主機上的eth0。 - 子介面模式:MACVLAN 支援多種子介面模式(如 bridge、vepa、private),不同模式有不同的行為特性。
- 子網與閘道:
--subnet=192.168.1.0/24和--gateway=192.168.1.1指定子網和閘道地址。
支援傳輸層安全協定(TLS)
大多數情況下, 在跨多節點處理時會使用 TLS (Transport Layer Security) 作為資料傳輸保護, 不僅提供加密保護也能確保資料完整性及身分驗證.
整合流程與挑戰分析
在實務應用中, 採用自訂ネットワーク駕動器時必須考慮多方面因素包括安全性, 效能與可擴充套件性:
- 安全性:確保各種自訂網路之間互不幹擾,並且適當組態防火牆規則來阻止未授權存取.
- 效能:選擇合適的網路駕動來滿足應用需求,例如MACVLAN 對低延遲應用來說是一個更好的選擇.
- 可擴充套件性:對於大規模分散式系統來說, 跨多節點組態是頗具挑戰性,但透過 Docker Swarm 與 Kubernetes 的協調工具可大幅簡化相關操作.
透過以上分析與實作案例,玄貓期望大家能夠更深入瞭解 Docker 自訂網路駕動及其應用場景,從而提升應用系統設計與維運效率。
