Docker?Swarm?操作對(duì)容器端口影響記錄
一、背景闡述
在使用 Docker Swarm 構(gòu)建集群環(huán)境過(guò)程中,于 ts3
節(jié)點(diǎn)出現(xiàn)了原有的容器端口全部失效,手動(dòng)重啟后才恢復(fù)的情況。期間涉及 docker swarm init --advertise-addr=172.16.10.110
以及 docker swarm join --token <MANAGER-TOKEN> <MANAGER-IP>:<MANAGER-PORT>
等操作,下面深入探究為何會(huì)出現(xiàn)端口失效及恢復(fù)的現(xiàn)象。
角色 | IP | hostname |
---|---|---|
Manager1 | 172.16.10.110 | ts3 |
Manager2 | 172.16.10.111 | ts4 |
Worker1 | 172.16.10.120 | harbor |
手動(dòng)重啟容器后才恢復(fù)的情況
二、端口失效原因剖析
(一)網(wǎng)絡(luò)配置變更因素
- 覆蓋網(wǎng)絡(luò)創(chuàng)建影響
- 當(dāng)執(zhí)行
docker swarm init
或docker swarm join
操作時(shí),Docker 為保障 Swarm 集群內(nèi)部高效通信,會(huì)創(chuàng)建新的覆蓋網(wǎng)絡(luò)(overlay network)。此網(wǎng)絡(luò)構(gòu)建過(guò)程涉及復(fù)雜的網(wǎng)絡(luò)配置調(diào)整。 - 例如,新覆蓋網(wǎng)絡(luò)的創(chuàng)建需要分配新的網(wǎng)絡(luò)段、子網(wǎng)掩碼等參數(shù),這些參數(shù)的變更直接影響到節(jié)點(diǎn)的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)。原有的容器若依賴于之前的網(wǎng)絡(luò)配置,如靜態(tài) IP 地址綁定、基于舊網(wǎng)絡(luò)段的端口映射規(guī)則,在新覆蓋網(wǎng)絡(luò)生成后就會(huì)失效。
- 當(dāng)執(zhí)行
- iptables 規(guī)則動(dòng)態(tài)調(diào)整
- Docker 在 Swarm 操作期間會(huì)動(dòng)態(tài)修改 iptables 規(guī)則。iptables 作為 Linux 系統(tǒng)下強(qiáng)大的防火墻工具,管控著網(wǎng)絡(luò)流量的流入、流出以及端口轉(zhuǎn)發(fā)等操作。
- 比如,初始化 Swarm 時(shí),為實(shí)現(xiàn)集群內(nèi)服務(wù)間的負(fù)載均衡與通信隔離,Docker 會(huì)新增一系列允許或限制特定端口、IP 段流量的規(guī)則。這些新規(guī)則可能與原容器端口映射所依賴的 iptables 舊規(guī)則沖突,致使原容器端口無(wú)法正常對(duì)外提供服務(wù),出現(xiàn)端口失效現(xiàn)象。
(二)服務(wù)發(fā)現(xiàn)與 DNS 變更因素
- 服務(wù)發(fā)現(xiàn)機(jī)制更新
- Swarm 集群擁有自身一套完備的服務(wù)發(fā)現(xiàn)機(jī)制,旨在讓集群內(nèi)各個(gè)服務(wù)、容器能精準(zhǔn)定位彼此。當(dāng)節(jié)點(diǎn)執(zhí)行 Swarm 相關(guān)操作時(shí),這套服務(wù)發(fā)現(xiàn)機(jī)制會(huì)被重新配置。
- 例如,原本容器依靠基于節(jié)點(diǎn)主機(jī)名或自定義服務(wù)名的發(fā)現(xiàn)規(guī)則來(lái)建立網(wǎng)絡(luò)連接,在 Swarm 初始化或節(jié)點(diǎn)加入后,服務(wù)發(fā)現(xiàn)規(guī)則轉(zhuǎn)變?yōu)榛?Swarm 內(nèi)部生成的唯一服務(wù) ID 或虛擬 IP 地址。容器若未及時(shí)適應(yīng)這種變化,仍按舊規(guī)則尋找服務(wù)或端口,必然導(dǎo)致通信失敗,端口映射看似失效。
- DNS 配置重新加載
- 伴隨 Swarm 操作,DNS 配置同步更新。在集群環(huán)境下,DNS 用于解析服務(wù)名、容器名等標(biāo)識(shí)到對(duì)應(yīng)的 IP 地址,確保網(wǎng)絡(luò)通信順暢。
- 例如,新加入 Swarm 的節(jié)點(diǎn)可能會(huì)從管理節(jié)點(diǎn)獲取全新的 DNS 服務(wù)器地址與解析策略。容器啟動(dòng)時(shí)依據(jù)的是舊 DNS 配置,運(yùn)行過(guò)程中未能及時(shí)刷新 DNS 信息,那么在嘗試通過(guò)域名訪問(wèn)其他服務(wù)時(shí),就無(wú)法正確解析,使得依賴于域名解析的端口通信受阻,端口失效。
(三)資源重新分配因素
- IP 地址動(dòng)態(tài)調(diào)配
- 在 Swarm 集群搭建與節(jié)點(diǎn)加入過(guò)程中,IP 地址常常會(huì)被重新分配。這是為了滿足集群統(tǒng)一管理、資源優(yōu)化配置的需求。
- 例如,原容器綁定了特定的 IP 地址,在節(jié)點(diǎn)加入 Swarm 后,根據(jù)集群的 IP 管理策略,該 IP 地址可能被回收并重新分配給其他服務(wù)或容器。此時(shí),原容器基于舊 IP 地址的端口映射自然失效,若不重啟容器獲取新 IP 地址,端口將無(wú)法正常工作。
- 網(wǎng)絡(luò)命名空間更迭
- 每次 Swarm 操作都可能引發(fā)網(wǎng)絡(luò)命名空間的更迭。網(wǎng)絡(luò)命名空間是 Linux 系統(tǒng)中隔離網(wǎng)絡(luò)資源的一種機(jī)制,不同的網(wǎng)絡(luò)命名空間擁有獨(dú)立的網(wǎng)絡(luò)配置、路由表等。
- 比如,新加入 Swarm 的節(jié)點(diǎn)會(huì)被分配新的網(wǎng)絡(luò)命名空間,原容器所在的舊網(wǎng)絡(luò)命名空間被關(guān)閉或修改。容器依賴舊網(wǎng)絡(luò)命名空間內(nèi)的網(wǎng)絡(luò)連接與端口映射規(guī)則,在命名空間變更后,就如同進(jìn)入一個(gè)全新且陌生的網(wǎng)絡(luò)環(huán)境,端口失效在所難免。
三、總結(jié)
通過(guò)對(duì)上述各因素的詳細(xì)剖析可知,docker swarm init
與 docker swarm join
操作絕非孤立地改變節(jié)點(diǎn)的某一特性,而是從網(wǎng)絡(luò)配置、服務(wù)發(fā)現(xiàn)、DNS 以及資源分配等多維度重塑節(jié)點(diǎn)運(yùn)行環(huán)境。這些深層次變革在帶來(lái)集群強(qiáng)大功能與高效管理的同時(shí),也不可避免地對(duì)原有的容器端口映射造成沖擊,致使端口失效。唯有深入理解這些內(nèi)在原理,才能在遭遇問(wèn)題時(shí)精準(zhǔn)施策,保障 Docker Swarm 集群穩(wěn)定運(yùn)行。
到此這篇關(guān)于Docker Swarm 操作對(duì)容器端口影響記錄的文章就介紹到這了,更多相關(guān)Docker Swarm 容器端口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker部署verdaccio搭建npm私服的實(shí)現(xiàn)
本女王主要介紹了Docker部署verdaccio搭建npm私服的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02講解使用Docker搭建Java Web運(yùn)行環(huán)境
本篇文章詳細(xì)的介紹了使用Docker搭建Java Web運(yùn)行環(huán)境,想要學(xué)習(xí)docker的同學(xué)可以了解一下。2016-11-11Docker在Windows環(huán)境的搭建和使用詳解
這篇文章主要介紹了Docker在Windows環(huán)境的搭建和使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Docker啟動(dòng)容器報(bào)錯(cuò):Ports are not available的解決方案
這篇文章主要介紹了Docker啟動(dòng)容器報(bào)錯(cuò):Ports are not available的解決方案,Docker 將容器程序的端口號(hào)映射到宿主機(jī)的端口號(hào),是一個(gè) NAT 過(guò)程,這個(gè)過(guò)程可能會(huì)因?yàn)榕c Windows NAT 服務(wù)沖突而失效,文中有詳細(xì)的解決方案,需要的朋友可以參考下2024-03-03Docker安裝RabbitMQ后訪問(wèn)報(bào)錯(cuò)的最佳解決方案
這篇文章主要介紹了Docker安裝RabbitMQ后訪問(wèn)報(bào)錯(cuò)的最佳解決方案,錯(cuò)誤通常是由于RabbitMQ的安全配置導(dǎo)致的,RabbitMQ默認(rèn)配置允許的用戶僅能通過(guò)localhost訪問(wèn),文中通過(guò)圖文講解的非常詳細(xì),需要的朋友可以參考下2025-01-01Docker學(xué)習(xí)筆記之Weave實(shí)現(xiàn)跨主機(jī)容器互聯(lián)
這篇文章主要介紹了Docker學(xué)習(xí)筆記之Weave實(shí)現(xiàn)跨主機(jī)容器互聯(lián),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04