目錄
- 一、利用宿主機 IP + 外部端口實現容器互訪
- 1.思路
- 2.示例操作
- 3.訪問測試
- 4.工作原理
- 5.總結
- 二、Docker 容器之間的網絡通信(docker0 與自定義橋接網絡)
- 1. docker0 簡介
- 2. 通過容器 IP 訪問
- 3. 自定義橋接網絡(推薦方式)
- 創建自定義網絡
- 啟動容器并加入網絡
- 容器間通過名字訪問
- 4. 總結
一、利用宿主機 IP + 外部端口實現容器互訪
借助 宿主機 IP + 端口映射 的方式,讓不同容器之間互相訪問。這種方法相對簡單直觀,但中間多了一次“繞行”宿主機的過程。
1.思路
- 啟動容器時,將容器的服務端口映射到宿主機的某個端口。
- 其他容器通過 宿主機 IP + 映射端口 的形式訪問目標容器的服務。
2.示例操作
假設我們創建兩個容器:
app1
→ 宿主機端口 88 對應容器端口 80app2
→ 宿主機端口 99 對應容器端口 80
啟動命令如下:
# 啟動 app1
docker run -d -p 88:80 --name app1 nginx:stable-perl# 啟動 app2
docker run -d -p 99:80 --name app2 nginx:stable-perl
3.訪問測試
在宿主機或容器內部均可使用 curl
進行訪問:
# 訪問 app1
curl http://192.168.121.140:88# 訪問 app2
curl http://192.168.121.140:99
其中 192.168.121.140
是宿主機的 IP 地址。
4.工作原理
當執行:
curl http://192.168.121.140:99
時,實際過程如下:
- 請求先到達宿主機 IP
192.168.121.140
的端口99
; - Docker 端口映射規則將請求轉發到
app2
容器內部的80
端口; - 容器返回響應,再由宿主機轉發給請求方。
?? 這種方式相比容器直接通信會多經過一次宿主機轉發,因此性能上略有開銷。
5.總結
- 優點:簡單直觀,不需要配置額外的 Docker 網絡。
- 缺點:容器間通信要繞過宿主機,效率較低,不如自定義網絡靈活。
二、Docker 容器之間的網絡通信(docker0 與自定義橋接網絡)
在使用 Docker 的過程中,容器之間往往需要進行網絡通信。Docker 默認會在宿主機上創建一個名為 docker0 的虛擬網橋,它在容器網絡中扮演著重要角色。
1. docker0 簡介
當你在宿主機上安裝 Docker 后,系統會自動生成一個虛擬網卡:
ifconfig
你會看到類似 docker0
的網橋接口:
它的作用是:
- 容器與宿主機通信:每個容器都會通過 veth pair 接入
docker0
,因此容器可以直接與宿主機通信。 - 容器與容器通信:在同一
bridge
網絡下,容器之間可以通過 IP 地址互通。
2. 通過容器 IP 訪問
我們可以使用 docker container inspect
命令來查看容器的分配 IP 地址:
docker container inspect app1
然后在另一容器中,通過 curl
就能訪問這個容器的服務:
curl http://容器IP:端口
不過這種方式存在一個問題:容器 IP 可能會變化(例如容器重啟后)。因此,直接使用 IP 不是一個可靠的解決方案。
3. 自定義橋接網絡(推薦方式)
Docker 默認的 bridge
網絡不支持容器名解析(即不能直接通過容器名訪問另一個容器),我們可以通過創建自定義網絡來解決這一問題。
創建自定義網絡
docker network create mynet
啟動容器并加入網絡
docker run -d -p 88:80 --name app1 --network mynet nginx:stable-perl
docker run -d -p 99:80 --name app2 --network mynet nginx:stable-perl
容器間通過名字訪問
此時,在 mynet
網絡下,容器之間不僅可以通過 IP 互通,還可以通過 容器名 來訪問:
curl http://app2:80
相比直接使用 IP,這種方式更穩定,不會受到容器 IP 變化的影響。
4. 總結
docker0
是 Docker 默認創建的虛擬網橋,用于實現容器與宿主機、容器與容器之間的通信。- 直接使用容器 IP 雖然可行,但不夠穩定。
- 推薦使用自定義橋接網絡,這樣容器可以通過 容器名 互相訪問,更加直觀與可靠。