在容器間 ping 主機名稱

大家好;

我正在使用 TS-464 搭配 Container-Station。

我已經設置了多個容器(ha、grist、lldap、authelia 等),全部由一個 caddy 容器作為反向代理。這些容器都是直接在 CS 中以「容器」方式安裝的,並不是透過 compose 檔案。

一切運作正常,只是我必須將反向代理指向 10.0.3.x 的地址,因為主機名稱無法使用。這本來沒問題,直到我為了更新韌體重啟 NAS:所有容器的 IP 都變了,我只好重新設定 Caddy 的新 IP……

我原以為 docker 有一種「dns 解析器」,可以用同一網路下容器的主機名稱來尋址,因此我可以在 Caddy 裡用主機名稱來參考它們。是我漏掉什麼設定了嗎?

如果容器的 IP 每次重啟都會變,安裝內部 dns 伺服器也沒用。

另一個選項是為容器設定靜態 IP,但我找不到在哪裡設定(或許可以用 ssh 指令行來做……)

有人可以分享一些最佳實踐嗎?

敬上,
Xavier

預設情況下,容器會使用 DHCP。我剛剛查了一下,不確定是否有辦法為容器設定固定 IP 位址。在容器設定中是沒有這個選項的。也許必須在 Compose 中設定。

你可以將容器設為橋接模式(Bridge mode),這樣它們就會連接到特定的網路介面卡。然後你就可以為它們分配固定 IP。

對於標準容器的靜態 IP,你可以在網路設定中設置 IP,但它會是橋接模式。

我知道在應用程式中使用 Compose 時,只要容器都在同一個網路中,你可以透過應用程式名稱來引用。我在 nginx-proxy-manager(NPM)就是這樣做的。以下是一個 NPM 和另一個應用程式 dozzle 的範例 compose yaml。我記得我必須用 docker 指令建立 backendApps 這個網路,但細節我不太記得。順帶一提,npm 的設定並不完整,這裡只是展示如何使用兩個網路。我的其他應用程式都只在 backendApps 網路裡,而 NPM 則提供反向代理和 HTTPS。

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    stdin_open: true
    tty: true
    container_name: npm
    networks:
      qnet-static-eth0-custom:  # 用於外部 IP/MAC 定義
      backendApps: # 所有共享容器都應該有這個網路

networks:     
  qnet-static-eth0-custom:
    external: true
  backendApps:
    external: true
services:
  dozzle:
    image: amir20/dozzle:latest
    container_name: dozzle
    stdin_open: true
    tty: true
    networks:
      - backendApps
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 2080:8080

networks:     
  backendApps:
    external: true

如何在 NPM 中引用

我不打算講解 compose 檔案所有細節,但如果你知道怎麼用,這些應該會有幫助。

非常感謝;我會嘗試這些方法,並在這裡回饋結果。

最後一則回覆甚至讓我想到可以解決另一個問題:反向代理目前在容器的預設網路(lxcbr0)上,但“應用程式”裡的容器則在它們自己的網路上。也許如果我把 lxcbr0 網路加到我的應用程式上,就可以從 Caddy 反向代理到應用程式(目前即使用 IP 位址也無法互相 ping 通)。

我會隨時更新進度;感謝你的協助!
Xavier

我在這裡發表我承諾過的回饋。

我最終成功地手動將反向代理(Caddy)連接到為「應用程式」(也就是 compose 檔案)建立的網路:

docker network connect my_app_default caddy-1

這解決了連線問題,也解決了內部 DNS 問題:在我的 caddy 檔案中,我可以將反向代理指向「服務名稱」而不是容器 IP。

感謝你們兩位的協助;希望這對於在 Google 搜尋這個用例的人會有所幫助。

敬上,
Xavier

1個讚