使用 network=host 的容器主機名稱解析

使用 network=host 的容器主機名稱解析

我有兩個碼頭貨櫃。一個是“後端”,另一個是“連接器”。

連接器需要將其網路類型設定為「主機」(要接收 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 以避免衝突。

相關內容