如何在 QNAP Container Station 透過 Qnet 讓容器取得區域網路獨立 IP

在 QNAP Container Station 中,容器預設通常會使用 Docker 的虛擬網路,並透過 Port Mapping 將 NAS 的連接埠轉發至容器。

一般的服務使用 Docker 的預設網路並沒有太大問題,但如果我們想要架設 Nginx、Nginx Proxy Manager 等反向代理服務,就可能遇到 80 與 443 Port 已經被 NAS 使用的問題,導致容器無法直接使用這兩個 Port。

例如 QNAP 系統通訊埠預設使用 8080 與 443 Port

啟用網站伺服器時,則會使用 80 Port。

當我們需要對外提供 HTTPS,或透過 Let’s Encrypt 的 HTTP-01 驗證方式申請 SSL 憑證時,80 與 443 Port 的使用方式就變得相當重要。

這時可以利用 QNAP 提供的 Qnet 網路,讓容器直接取得一組與 NAS 位於相同區域網路的獨立 IP。

NAS 與容器就能各自使用自己的 80 與 443 Port,路由器也能直接將對外的 80 與 443 Port 轉發至反向代理容器。

容器設定

建立容器的時候,在進階設定的網路,網路模式選擇自訂 Bridge。勾選使用靜態 IP 位址,套用即可。

容器運行時便可輕鬆取得區域網路獨立 IP,這部分倒是沒太大問題。

點選上方的檢驗,查看容器的 NetworkSettings。

可以看到這個 Container 連接到一個名稱為 qnet-static-eth0–0fa2ce 的 Docker Network。

在 QNAP Container Station 中,這個 Network 是由 Qnet 機制建立與管理,用來讓 Container 連接到 NAS 的實體區域網路。

稍後我們將使用 qnet-static-eth0–0fa2ce 這個 Docker Network

應用程式設定

當我們建立應用程式時,會發現在進階設定中並沒有提供網路選項可供選擇。

先用下列 YAML 來建立 WordPress 應用程式

version: '3'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8000:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

應用程式所建立的容器預設會使用 DDAP 這個 Docker Network,IP 範圍為 172.29.0.0/16。

可以在偏好設定找到 DDAP 的相關設定

如果我們想要應用程式建立的容器也取得區域網路獨立 IP,可以使用下列 YAML 來建立應用程式。

將下面的 ipv4_address 取代為您的區域網路 IP 位址

version: '3'

services:

  wordpress:
    image: wordpress
    restart: always
    networks:
      qnet:
        ipv4_address: 192.168.0.101
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:8.0
    restart: always
    networks:
      qnet:
        ipv4_address: 192.168.0.102
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:

networks:
  qnet:
    external: true
    name: qnet-static-eth0-0fa2ce

應用程式所建立的容器也可以取得區域網路獨立 IP 了

服務也是正常地運行

到網路與虛擬交換器的總覽,可以看到完整的拓樸。

不論是透過 WordPress 管理後台,或使用 Nginx Proxy Manager 反向代理服務,申請與安裝 Let’s Encrypt 免費 SSL 憑證都會方便許多。

今天的分享就到這邊,感謝收看。