Docker實(shí)現(xiàn)容器之間通信的多種方式
一、Docker 容器間通信的本質(zhì)是什么?
容器之間通信依賴 Docker 網(wǎng)絡(luò)(Network),默認(rèn)有幾種網(wǎng)絡(luò)類型:
類型 | 描述 |
---|---|
bridge | 默認(rèn)網(wǎng)絡(luò),同一網(wǎng)橋內(nèi)容器可以通過容器名通信 |
host | 共享宿主機(jī)網(wǎng)絡(luò),無隔離(無端口映射) |
none | 容器無網(wǎng)絡(luò),僅用于極端隔離場(chǎng)景 |
overlay | 用于 Docker Swarm 集群通信 |
二、常用容器通信方式
1. **橋接網(wǎng)絡(luò)(默認(rèn))**下的通信
方法一:通過容器名稱訪問
默認(rèn)容器在 bridge 網(wǎng)絡(luò)中可以通過 名稱解析容器名 → IP 進(jìn)行通信:
docker network create mynet docker run -dit --name container-a --network mynet alpine sh docker run -dit --name container-b --network mynet alpine sh
然后進(jìn)入 container-b
,ping container-a
即可:
ping container-a
可用于微服務(wù)中服務(wù)間調(diào)用,如:
http://container-a:8080/api/...
方法二:共享同一網(wǎng)絡(luò)(如 docker-compose 自動(dòng)創(chuàng)建)
version: '3' services: web: image: nginx app: image: my-java-app depends_on: - web
web
的容器名稱就是web
app
中可通過web:80
與其通信,無需指定 IP
2. host 網(wǎng)絡(luò)模式下通信
容器共享宿主機(jī)網(wǎng)絡(luò),無端口映射限制,適合需要 UDP、低延遲通信:
docker run --network host my-app
注意:
- 所有容器共享端口空間,避免端口沖突
- 容器可以通過
localhost
訪問宿主其他服務(wù)
3. 端口 暴露 + 宿主機(jī) IP 通信(最通用但低效)
每個(gè)容器通過 -p
映射端口 暴露到宿主機(jī):
docker run -p 8080:8080 --name web my-web docker run -p 8081:8081 --name app my-app
此時(shí)容器間不能直接通信,只能通過宿主 IP 和端口:
curl http://host-ip:8080/
三、Docker 網(wǎng)絡(luò)命令速查
命令 | 說明 |
---|---|
docker network ls | 查看所有網(wǎng)絡(luò) |
docker network inspect mynet | 查看某網(wǎng)絡(luò)下容器信息(IP等) |
docker network create mynet | 創(chuàng)建自定義網(wǎng)絡(luò) |
docker network connect | 把容器加入到一個(gè)網(wǎng)絡(luò) |
docker network disconnect | 移除容器的網(wǎng)絡(luò)連接 |
四、docker-compose 中容器通信最佳實(shí)踐
version: '3' services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: 123456 app: image: my-java-app depends_on: - mysql environment: DB_HOST: mysql
- app 可以用
mysql:3306
與數(shù)據(jù)庫(kù)通信 - 不用寫 IP,容器名即服務(wù)名,Compose 默認(rèn)建立 bridge 網(wǎng)絡(luò)
五、最佳實(shí)踐小結(jié)
場(chǎng)景 | 推薦方案 |
---|---|
同機(jī)通信 | 自定義 bridge 網(wǎng)絡(luò),容器名互通 |
簡(jiǎn)化開發(fā) | 用 docker-compose 管理服務(wù) |
性能要求高 | 使用 --network host |
集群通信 | 使用 overlay 網(wǎng)絡(luò)(Docker Swarm) |
補(bǔ)充:容器 DNS 是怎么解析的?
Docker 默認(rèn)為每個(gè)網(wǎng)絡(luò)分配一個(gè) DNS 服務(wù),容器名在網(wǎng)絡(luò)中解析為容器 IP:
# 容器內(nèi) nslookup web
你會(huì)看到:web
自動(dòng)解析成 IP 地址。
總結(jié)
通信方式 | 說明與特點(diǎn) |
---|---|
通過容器名通信 | 推薦,自定義網(wǎng)絡(luò)或 docker-compose 默認(rèn)支持 |
宿主機(jī) IP + 映射端口 | 最通用但性能差 |
host 網(wǎng)絡(luò)通信 | 高性能但需管理端口沖突 |
overlay 網(wǎng)絡(luò)通信 | 多主機(jī)通信(Swarm/集群用) |
以上就是Docker實(shí)現(xiàn)容器之間通信的多種方式的詳細(xì)內(nèi)容,更多關(guān)于Docker容器間通信的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker?Windows最新版(4.17.x)修改鏡像存儲(chǔ)路徑的詳細(xì)步驟
這篇文章主要介紹了Docker?WIndows最新版(4.17.x)修改鏡像存儲(chǔ)路徑的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03Spring?Boot?分層打包?Docker?鏡像實(shí)踐及分析(推薦)
這篇文章主要介紹了Spring?Boot?分層打包?Docker?鏡像實(shí)踐及分析,本文通過圖文并茂的形式實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12Docker?部署?Minio?對(duì)象存儲(chǔ)服務(wù)器的過程詳解
Minio是一個(gè)輕量級(jí)的應(yīng)用程序,可以在各種環(huán)境中運(yùn)行,包括公共云、私有云和混合云,這篇文章主要介紹了Docker?部署?Minio?對(duì)象存儲(chǔ)服務(wù)器的過程詳解,需要的朋友可以參考下2024-07-07在Docker Compose中獲取最新鏡像的多種方法總結(jié)
Docker 鏡像是 Docker 容器的基礎(chǔ),鏡像包含了應(yīng)用程序所需的所有文件和依賴,Docker-Compose 默認(rèn)不會(huì)自動(dòng)拉取最新的鏡像版本,這可能會(huì)導(dǎo)致使用過時(shí)的鏡像,從而錯(cuò)過重要的更新,為了確保 Docker-Compose 始終使用最新的鏡像,我們可以采用多種方法,以下將詳細(xì)介紹這些方法2024-08-08docker compose安裝es+kibana 8.12.2的詳細(xì)過程
因云平臺(tái)需要改造,es7升級(jí)為es8,所以記錄一下,es8需要開啟ssl認(rèn)證,需要配置證書,全本帶你用docker安裝,便于后面es8的學(xué)習(xí),這篇文章主要介紹了docker compose安裝es+kibana 8.12.2的詳細(xì)過程,感興趣的朋友跟隨小編一起看看吧2024-05-05