在使用 Docker 建立多個服務容器時,常常會遇到一個問題:
「不同容器之間能不能用容器名稱互相連線?」
答案是 —— 可以的!
但前提是:它們必須在同一個自訂的 Docker network 裡。
一、為什麼預設 network 不行?
Docker 預設會建立一個名為 bridge 的網路(也就是 docker0)。
這個預設網路不提供容器名的 DNS 解析,因此容器之間只能用 IP 位址互相連線。
這樣做在測試階段還可以,但在實際環境中,容器 IP 經常變動,維護起來相當麻煩。
二、建立自訂 network
要讓容器之間能用「容器名稱」互相連線,最簡單的方法就是建立一個自訂的 network。
docker network create mynet
建立好之後,所有加入這個 network 的容器,就能彼此透過名稱解析進行通訊。
三、讓容器加入同一個 network
啟動容器時指定 network 參數:
docker run -d --name web --network mynet nginx
docker run -d --name app --network mynet alpine sleep infinity
此時,web 與 app 這兩個容器都在 mynet 網路裡。
四、容器之間用名稱連線
進入其中一個容器(例如 app):
docker exec -it app sh
測試連線:
ping web
nc -zv web 80
Docker 的內建 DNS 會自動解析 web → web 容器的 IP。
因此你不需要知道 IP 位址,只要知道容器名稱即可。
五、使用 network alias
有時候容器名稱太長或需要多個別名,也可以設定 network alias:
docker run -d --name db --network mynet --network-alias mysql mysql:8
這樣同網路下的其他容器就可以用 mysql 這個名稱連線。
✅ 結論
| 條件 | 說明 |
|---|---|
| 同一個自訂 network | 才能透過 DNS 名稱解析 |
| 預設 bridge 不行 | 只能用 IP 互連 |
| 可使用 alias | 提供額外名稱解析 |
重點一句話:
在同一個自訂 network 中,Docker 會提供 DNS 名稱解析服務,讓容器之間可以用容器名或別名直接進行 TCP/UDP 連線。