我有兩個碼頭貨櫃。一個是“後端”,另一個是“連接器”。
連接器需要將其網路類型設定為「主機」(要接收 udp 多播:ssdp/mdns 封包)。
但它還需要能夠使用 docker dns 系統,以便我可以將容器名稱解析為其 IP 位址。
我怎樣才能做到這一點?
docker-compose.yml
:
version: "3"
services:
database:
image: mongo
container_name: database
hostname: database
ports:
- "27017:27017"
backend:
image: "project/backend:latest"
container_name: backend
hostname: backend
environment:
- NODE_ENV=production
- DATABASE_HOST=database
ports:
- "8080:8080"
depends_on:
- database
tty: true
connector:
image: "project/connector:latest"
container_name: connector
hostname: connector
ports:
- "1900:1900/udp"
environment:
- NODE_ENV=production
- BACKEND_HOST=backend
depends_on:
- backend
network_mode: host
tty: true
當我使用 運行它時docker compose up
,我的連接器容器會拋出“EAI_AGAIN”錯誤:
connector | Error: getaddrinfo EAI_AGAIN backend
connector | at GetAddrInfoReqWrap.onlookup [as oncomplete] (node:dns:109:26) {
connector | errno: -3001,
connector | code: 'EAI_AGAIN',
connector | syscall: 'getaddrinfo',
connector | hostname: 'backend'
connector | }
這意味著 Node.js 應用程式無法解析主機名稱「後端」。這並不奇怪,因為網路設定為“主機”。
如何讓“連接器”容器將其網路設定為“主機”,但仍然能夠解析其他容器名稱?
答案1
Docker macvlan 在您選擇的主機網路介面上設定軟體交換器(橋接器)。這可以是與主機相同的接口,也可以是具有不同網路的不同接口或子接口。
將容器指派給此 macvlan docker 網路將為該容器建立一個唯一的第 2 層位址,並允許其使用在 macvlan 父介面上有路由的任何第 3 層 IP 位址。這也將為您的容器主機提供網路功能,即。 mdns 網路發現。
指派給 macvlan 網路的容器可以同時指派給 compose 檔案中的其他 docker 網絡,並與 docker 網路中的其他容器進行通訊。使用 macvlan 介面只不過是堆疊其餘部分正在消耗的任何資料的入口。
這樣做的缺點和注意事項:
Macvlan 配置需要指向實體命名介面。它還需要連接到您橋接的實際第 2 層網路。將 macvlan 引入您的 docker 環境會降低其可移植性。
macvlan 介面沒有參與 DHCP 的正確方法。可以給 Docker 一個範圍,自動將容器指派到 macvlan 網絡,也可以單獨為每個容器指派一個靜態 ip。請務必從 DHCP 範圍中刪除這些 IP 以避免衝突。