Press "Enter" to skip to content

群晖玩转 Docker Macvlan:给容器分配独立内网 IP,完美释放 80/443 端口!

痛点:群晖那霸道的端口占用

很多折腾群晖(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 的图形化)。

  1. 打开群晖的 File Station,在 docker 共享文件夹下新建一个目录,比如 nginx-macvlan
  2. 打开 Container Manager,点击左侧的 项目 -> 新增
  3. 项目名称 填写 my-nginx路径 选择刚才创建的文件夹,来源 选择 创建 docker-compose.yml
  4. 在下方的代码框中,填入以下配置:
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 里建好的网络
  1. 点击下一步直到完成。群晖会自动拉取 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 功能关掉,以保安全哦~

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注