痛点:群晖那霸道的端口占用
很多折腾群晖(Synology DSM)的玩家在用 Docker(Container Manager)部署 Nginx、博客或者反向代理时,都会遇到一个极其恼人的报错:端口 80 或 443 已被占用。
这是因为群晖系统底层深度绑定了这两个端口,用于提供 DSM 登录、Web Station 等服务。常规的解决办法要么是改用 8080 等非标准端口(强迫症不能忍),要么是冒着系统崩溃的风险去修改底层配置(系统一更新就白干)。
那么,有没有一种既安全优雅,又能让 Docker 容器独占 80/443 端口的方法呢?
答案就是:Docker Macvlan。
什么是 Macvlan?
简单来说,普通的 Docker 桥接网络(Bridge)是容器和宿主机(群晖)共享同一个局域网 IP,通过不同的端口来区分服务。
而使用 Macvlan 技术,相当于给你的 Docker 容器插上了一根虚拟网线,让容器在局域网中拥有一个和群晖完全平级的、独立的内网 IP 地址(比如群晖是 .18,容器是 .20)。
有了独立 IP,容器自然就拥有了属于自己的全套 1-65535 端口,再也不用看群晖的脸色了!
准备工作:获取网络信息
在开始之前,我们需要确认三个重要的网络信息。
打开群晖的 SSH 功能(控制面板 -> 终端机和 SNMP -> 启动 SSH 功能),使用终端工具连接上群晖,并执行以下命令查看网卡信息:
ip addr
# 或者 ifconfig
在这里我们需要找到当前群晖正在使用的主网卡名称。
💡 避坑指南:
很多教程直接让你填eth0,但在群晖上,如果你安装了 Virtual Machine Manager(虚拟机套件),你的主网卡会被 Open vSwitch 接管,名称会变成ovs_eth0。请务必核对哪个网卡绑定了你群晖当前的局域网 IP!
假设我的网络环境如下:
- 路由器网段:
10.255.90.0/24 - 路由器后台 IP (网关):
10.255.90.1 - 群晖真实网卡:
ovs_eth0
第一步:一键创建 Macvlan 网络 (SSH)
注:群晖的 Container Manager 隐藏了 Macvlan 的创建入口,所以我们需要用一行命令来建立它,建好之后就可以回到图形界面操作了。
在 SSH 中执行以下命令(请根据你家里的实际网络信息替换对应的中文注释部分):
sudo docker network create -d macvlan
--subnet=10.255.90.0/24 # 你的路由器网段
--gateway=10.255.90.1 # 你的路由器/网关 IP
-o parent=ovs_eth0 # 你的群晖主网卡名称
macnet # 这是我们给网络起的名字,就叫 macnet 吧
执行完毕后,如果没有报错,你的 Macvlan 网络就建好了!现在你可以关闭 SSH 了。
第二步:在群晖 Container Manager 中部署 Nginx
为了给容器指定一个固定的内网 IP,我们使用 Container Manager 里的 “项目 (Project)” 功能(即 Docker-compose 的图形化)。
- 打开群晖的 File Station,在
docker共享文件夹下新建一个目录,比如nginx-macvlan。 - 打开 Container Manager,点击左侧的 项目 -> 新增。
- 项目名称 填写
my-nginx,路径 选择刚才创建的文件夹,来源 选择 创建 docker-compose.yml。 - 在下方的代码框中,填入以下配置:
version: '3.8'
services:
nginx:
image: nginx:latest
container_name: my-nginx
restart: always
networks:
macnet:
# 核心设置:给 Nginx 指定一个路由器网段下没人用的独立 IP
ipv4_address: 10.255.90.20
# volumes:
# - ./conf:/etc/nginx/conf.d # 日后可以取消注释,用来挂载配置
# - ./html:/usr/share/nginx/html
networks:
macnet:
external: true # 告诉系统直接使用我们刚才在 SSH 里建好的网络
- 点击下一步直到完成。群晖会自动拉取 Nginx 镜像并启动。
第三步:见证奇迹
现在,掏出你的手机或者同局域网下的电脑,打开浏览器,直接访问刚才分配的独立 IP:
👉 http://10.255.90.20
如果你看到了 "Welcome to nginx!" 的页面,恭喜你,部署成功!
你现在拥有了一个独占 80 和 443 端口的纯净 Nginx,后续你可以随意在路由器上进行端口转发,或者部署你的网站。群晖和这个 Nginx 在网络层面上互不干扰,完美共存!
⚠️ 必看:Macvlan 的唯一“副作用”
Linux 系统出于底层的网络安全隔离机制,默认情况下,宿主机(群晖本身)是无法直接 ping 通它下面挂载的 Macvlan 容器的。
也就是说,局域网里的其他电脑、手机都能正常访问这个 10.255.90.20,唯独你的群晖自己访问不到。
对于 Nginx 来说,这通常没有任何影响(因为是给人访问的)。但如果你部署的容器需要与群晖内部的服务(比如局域网内的群晖数据库)进行通信,则需要额外配置 Linux 的路由表。不过对于绝大多数家庭玩家而言,享受独立 IP 带来的便利就足够了!
折腾愉快!别忘了在控制面板里把 SSH 功能关掉,以保安全哦~