docker自定義網(wǎng)絡(luò)從入門到實踐
Docker 網(wǎng)絡(luò)模式?jīng)Q定了容器之間、容器與宿主機之間的通信方式。掌握網(wǎng)絡(luò)機制是理解容器互聯(lián)互通的關(guān)鍵。
一、Docker 網(wǎng)絡(luò)的核心模式
Docker 有三種核心網(wǎng)絡(luò)模式,決定了容器的通信方式:
橋接模式(默認 docker0 網(wǎng)絡(luò))
Docker 安裝后會自動創(chuàng)建 docker0 網(wǎng)橋,每個容器啟動時會被分配一個 docker0 網(wǎng)段內(nèi)的 IP(如 172.17.0.x)。 容器間可通過容器 IP + 端口通信,但存在缺陷:容器重啟后 IP 可能變化,且 docker0 不支持容器名直接解析為域名,導(dǎo)致依賴 IP 通信的方式不夠穩(wěn)定。
自定義網(wǎng)絡(luò)
用戶可通過 docker network create 命令創(chuàng)建自定義網(wǎng)絡(luò)(如示例中的 mynet)。 自定義網(wǎng)絡(luò)支持 “容器名 → 域名” 的穩(wěn)定解析,且容器 IP 分配更可控,是生產(chǎn)環(huán)境中容器通信的推薦方式。
宿主模式 / 其他模式(此處暫不展開,重點關(guān)注容器間通信的核心場景)
實驗
目的
我們需要啟動兩個 Nginx 容器(app1 和 app2),讓它們通過容器名互相訪問(而不是依賴 IP)
流程
1、創(chuàng)建自定義網(wǎng)絡(luò)
創(chuàng)建自定義網(wǎng)絡(luò)(默認是 bridge 類型,適合容器間通信)
docker network create mynet
可以通過以下命令查看網(wǎng)絡(luò)是否創(chuàng)建成功
docker network ls
若輸出中包含 mynet,說明創(chuàng)建成功。
2、啟動兩個 Nginx 容器并加入 mynet 網(wǎng)絡(luò)
docker run -d \ -p 80:80 \ --name app1 \ --network mynet \ nginx ? docker run -d \ -p 99:80 \ --name app2 \ --network mynet \ nginx ? -p 80:80:宿主機訪問 http://localhost:80 會轉(zhuǎn)發(fā)到 app1 的 80 端口(Nginx 默認端口)。 -p 99:80:宿主機訪問 http://localhost:99 會轉(zhuǎn)發(fā)到 app2 的 80 端口。 --network mynet:關(guān)鍵參數(shù),讓兩個容器加入同一個自定義網(wǎng)絡(luò),實現(xiàn)互通。
3、驗證容器間通過 “容器名” 通信
1、進入 app1 容器內(nèi)部:docker exec -it app1 bash
在容器內(nèi)用 curl 訪問 app2(Nginx 默認返回歡迎頁):curl http://app2:80
會看到 Nginx 的默認 HTML 頁面內(nèi)容(說明訪問成功)。
2、同理,進入 app2 容器內(nèi)部:docker exec -it app2 bash
訪問 app1:curl http://app1:80
同樣會返回 Nginx 歡迎頁,證明通信雙向有效。
補充
為什么自定義網(wǎng)絡(luò)能實現(xiàn) “容器名訪問”?
對比 Docker 默認的 bridge 網(wǎng)絡(luò)(docker0):默認網(wǎng)絡(luò)中,容器間只能通過 IP 訪問,容器名無法被解析(需要手動配置 --link,但該參數(shù)已被淘汰)。
自定義網(wǎng)絡(luò)內(nèi)置了 DNS 解析服務(wù):Docker 會在自定義網(wǎng)絡(luò)中維護一個 “容器名 → IP” 的映射表,當容器啟動、重啟或 IP 變化時,這個表會自動更新,因此無論容器 IP 如何變化,都能通過容器名穩(wěn)定訪問。
查看網(wǎng)絡(luò)詳情
如果想確認兩個容器的 IP 和網(wǎng)絡(luò)配置,可以通過 docker network inspect mynet 查看: docker network inspect mynet 在輸出的 Containers 部分,會看到 app1 和 app2 的 IP 地址(例如 172.18.0.2 和 172.18.0.3)
"Containers": {
"app1": {
"Name": "app1",
"IPv4Address": "172.18.0.2/16"
},
"app2": {
"Name": "app2",
"IPv4Address": "172.18.0.3/16"
}
}但在日常開發(fā)中,我們無需關(guān)心這些 IP,因為 容器名即可作為固定域名使用。
環(huán)境清理(實驗結(jié)束)
docker rm -f $(docker ps -aq)
若還想刪除自定義網(wǎng)絡(luò):
docker network rm mynet
總結(jié)
| 網(wǎng)絡(luò)類型 | 是否支持容器名訪問 | IP 是否固定 | 典型用途 |
|---|---|---|---|
| 默認橋接網(wǎng)絡(luò)(docker0) | ? | ? | 臨時測試 |
| 自定義網(wǎng)絡(luò)(bridge 類型) | ? | ?(動態(tài)可解析) | 推薦用于服務(wù)間通信 |
| host / none | 特殊用途 | 特殊用途 | 性能優(yōu)化或隔離 |
在實際項目中,無論是 MySQL + WordPress、Nginx + Redis 還是 前端 + 后端,
都推薦使用 自定義網(wǎng)絡(luò) 來實現(xiàn)容器間穩(wěn)定通信。
通過容器名互聯(lián),系統(tǒng)的可維護性與可移植性都顯著提升。
一句話總結(jié):
“自定義網(wǎng)絡(luò)讓容器之間的通信像微服務(wù)一樣靈活穩(wěn)定——名字不變,連接不斷。”
到此這篇關(guān)于docker自定義網(wǎng)絡(luò)的文章就介紹到這了,更多相關(guān)docker自定義網(wǎng)絡(luò)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- docker network 自定義網(wǎng)絡(luò)配置與管理指南詳細過程
- Docker網(wǎng)絡(luò)之自定義網(wǎng)絡(luò)方式
- Docker network自定義網(wǎng)絡(luò)方式
- Docker網(wǎng)絡(luò)配置與自定義IP容器通信
- Docker網(wǎng)絡(luò)配置(橋接網(wǎng)絡(luò)和自定義網(wǎng)絡(luò))自定義網(wǎng)絡(luò)設(shè)置ip方式
- Docker compose安裝部署創(chuàng)建自定義網(wǎng)絡(luò)使用舉例
- Docker自定義網(wǎng)絡(luò)詳解
- Docker自定義網(wǎng)絡(luò)詳細介紹
- docker 容器自定義 hosts 網(wǎng)絡(luò)訪問操作
相關(guān)文章
Docker創(chuàng)建運行多個mysql容器的方法示例
這篇文章主要介紹了Docker創(chuàng)建運行多個mysql容器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
阿里云docker容器固定應(yīng)用到到某一個節(jié)點記錄
這篇文章主要介紹了阿里云docker容器固定應(yīng)用到到某一個節(jié)點記錄,需要的朋友可以參考下2018-05-05
使用Docker進行node開發(fā)時實現(xiàn)熱加載功能
這篇文章主要介紹了使用docker進行vue、react或者node開發(fā)時實現(xiàn)熱加載功能,即宿主機文件修改之后實時刷新或者實時重啟服務(wù),文中通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-09-09

