Nacos(注冊(cè)中心)是通過 【 IP+PORT】 的形式調(diào)用其他服務(wù)。
問題:
Docker 容器使用虛擬 IP,當(dāng) Docker 中的服務(wù) A,向 Nacos 注冊(cè)的時(shí)候,Nacos 獲取到了 Docker 的內(nèi)部 IP,導(dǎo)致另外一個(gè)服務(wù) B,想通過注冊(cè)中心調(diào)用服務(wù) A,但由于服務(wù) B從 nacos 注冊(cè)中心獲取到的是服務(wù) A 的內(nèi)部 IP,這樣導(dǎo)致了兩個(gè)處于公網(wǎng)的微服務(wù)之間無法互相訪問。
version: "3"
services:
base:
build: base
container_name: base_1
network_mode: "host" # 與宿主機(jī)共有一個(gè)IP
ports:
- 8233:8233
volumes:
- ./logs:/logs
當(dāng)然,配置了上述網(wǎng)絡(luò)類型后,nacos 是可以拿到宿主機(jī)的 IP,但是此時(shí)拿到的是宿主機(jī)的內(nèi)網(wǎng) IP,解決辦法如下:
spring:
cloud:
inetutils:
ignored-interfaces: eth.* # 忽略網(wǎng)卡,eth.*,正則表達(dá)式
preferred-networks: ${discovery.server-ip} # 選擇符合前綴的IP作為服務(wù)注冊(cè)IP,discovery.server-ip就是你的公網(wǎng)IP
啟動(dòng) Docker 的時(shí)候,用 --network 參數(shù),可以指定網(wǎng)絡(luò)類型
--network host
host: 主機(jī)網(wǎng)絡(luò)使用 --network=host,此時(shí),Docker 容器的網(wǎng)絡(luò)會(huì)附屬在主機(jī)上,兩者是互通的。 例如,在容器中運(yùn)行一個(gè) Web 服務(wù),監(jiān)聽 8080 端口,則主機(jī)的 8080 端口就會(huì)自動(dòng)映射到容器中。