在 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 憑證都會方便許多。
今天的分享就到這邊,感謝收看。


