容器網路
Docker 預設的網路型態即為透過 Network Namespace創建隔離的容器網路,並透過 Veth Pair (Virtual Ethernet Pair) 打穿 Network Namespace 並與 bridge 相通,再由 bridge 與 host 網卡相互連接
Bridge to Host
其實負責連接容器的 bridge 也是由 host 虛擬產生,並不能直接與 host 中的網卡溝通,那麼又是透過何種方法達成的呢?
答案是 Iptables !
Iptables
Linux 中用於網路過濾的程式
根據指定規則,最 netfilter進行操作
可實現 port之間的映射,使 外部主機可以存取容器的連接埠
也是防火牆的角色
藉由 DNAT(Destination Network Address Translation,目標網路位址轉換)來進行連接埠轉發功能
* docker run -d -P/-p 80:80 nginx
透過啟動指令中的 -P -p 參數,容器內連接埠映射至主機時,docker會在 iptables 新增一筆 以容器網路連到容器 的DNAT,透過Iptables 指令可查看
* iptables -t nat -L -n
若要從 host 中找出其隨機分配給與容器連接的port
可尋找 /proc/sys/net/ipv4/ip_local_port_range檔案中找到
* more /proc/sys/net/ipv4/ip_local_port_range
// 會回傳 映射的連接埠
總結,所以構成 docker 網路的有四個部分
- Network Namespace
- Veth Pair
- Bridge
- Iptables
以上為 docker 預設的網路模式
而隨著 docker技術的發展,逐漸形成 容器網路模型,CNM(Container Network Model)
此模型規範 Docker 容器使用網路的方式,使許多開發者可根據網路模型定義的結構與介面,進而實現所需的網路驅動程式
模型中主要為三大部分:
Sandbox:
- 容器中隔離網路配置的虛擬環境,對照原本的網路實作,功能類似於原本的 Network Namespace
Endpoint:
- 用來傳遞網路資料的通道入口,依附於沙盒之上,功能類似於原本的 Veth Pair
- Network:
- 由一組端點構成的網路,端點之間可相互通訊,功能類似於院本的 Linux Bridge
而一般 docker 還是採用最初的網路設計
* docker network ls
// 此指令可以看到 bridge、host 等詳細資訊
而 bridge 在 host 的網路中對應到的為 docker0 網路
用 ifconfig看會發現它在 host 中所建立的 docker0
* docker network inspect bridge
// 此指令可以看到容器網路中的詳細資訊,例如使用此網路的容器有哪些之類的...
自訂網路
在docker中除了預設網路外,亦可將不同容器組成一個小型模組,使其存取同個網路
並隔絕其他網路的容器
步驟
- 先建立一個可供容器進行連接的網路
* docker network create --driver bridge isolated
// --driver 指令網路驅動程式,預設使用bridge
- 從網路清單中找出已建好的網路
docker network ls / docker network inspect isolated
從網路清單中檢查新建網路與預設網路 網段是否一樣
若不同則成功,此時 連到isolated 網路的容器與連到預設網路的容器彼此相互隔絕無法通訊
容器與外部通訊
若容器享想與外界正常通訊,則要確定Ip forward功能是否正常
啟動 Docker Daemon時,可加入 --ip-forward參數來d控制 docker是否使用IP forward
預設為開啟,但開啟後若仍然無法與外部連線,則必須檢查 host是否有禁用 IP forward
* sudo sysctl net.ipv4.conf.all.forwarding
// 若返回值為0,則代表 host 禁用 IP forward
* sudo systcl net.ipv4.conf.all.forwarding = 1
// 令值為1,則啟用
由於電腦目前出狀況,可能會晚點補上截圖~