群晖 DSM 7.2 使用 Container Manager 安装宝塔面板:独立内网 IP,不占用群晖端口
这篇教程记录一下在群晖 NAS 上通过 Container Manager 安装宝塔面板,并让宝塔容器使用独立内网 IP 的方法。
最终效果是:宝塔面板不和群晖 DSM 共用同一个 IP,也不占用群晖本机端口。
本文使用的是宝塔官方 NAS 镜像:
btpanel/baota:nas
网络模式使用:
macvlan
项目管理方式使用:
Container Manager 项目 / Compose
一、先说明一下最终效果
假设你的局域网是 192.168.xx.0/24,群晖和宝塔可以这样分配:
群晖 DSM IP:192.168.xx.xx
宝塔面板 IP:192.168.xx.xx
网关 IP:192.168.xx.xx
网段:192.168.xx.0/24
Docker 网络:macvlan
宝塔镜像:btpanel/baota:nas
访问地址:http://192.168.xx.xx:8888/btpanel
这里的 192.168.xx.xx 都需要替换成你自己的实际 IP。
比如:
群晖 DSM IP:你的群晖内网 IP
宝塔面板 IP:你准备分配给宝塔容器的独立 IP
网关 IP:你的路由器网关 IP
网段:你的局域网网段
网卡名:ovs_eth0 或 eth0,以实际查询结果为准
二、为什么不用 bridge 或 host
Container Manager 里常见的网络方式主要有两种:bridge 和 host。
1. bridge 模式
bridge 模式需要做端口映射,比如:
群晖IP:8888 -> 容器:8888
这种方式宝塔还是会占用群晖的端口。
如果群晖 DSM、反向代理、Web Station 或其他容器已经用了 80、443、8888 等端口,就容易冲突。
2. host 模式
host 模式会让容器直接使用群晖主机网络。
也就是说:
群晖:192.168.xx.xx
宝塔:192.168.xx.xx
宝塔和群晖共用同一个 IP,也会抢群晖的端口。
3. macvlan 模式
macvlan 可以让容器在局域网里拥有独立 IP。
最终效果类似这样:
群晖:192.168.xx.xx
宝塔:192.168.xx.xx
宝塔的端口都属于宝塔自己的 IP,比如:
192.168.xx.xx:80
192.168.xx.xx:443
192.168.xx.xx:8888
192.168.xx.xx:3306
不会占用群晖 DSM 的端口。
三、准备工作
需要准备:
群晖 DSM 7.x
Container Manager
FinalShell 或其他 SSH 工具
一个没有被占用的局域网 IP
本文示例中,所有 IP 都用占位格式表示:
群晖 IP:192.168.xx.xx
宝塔 IP:192.168.xx.xx
网关 IP:192.168.xx.xx
网段:192.168.xx.0/24
实际操作时一定要替换成你自己的网络参数。
四、FinalShell 连接群晖
用 FinalShell 通过 SSH 连接群晖,然后切换到 root:
sudo -i
查看 DSM 版本:
cat /etc.defaults/VERSION
查看网卡信息:
ip -br addr
查看网关:
ip route
查看 Docker 版本:
docker version
查看 Docker 网络:
docker network ls
也可以一次性执行:
echo "===== DSM VERSION ====="
cat /etc.defaults/VERSION
echo "===== NETWORK INTERFACES ====="
ip -br addr
echo "===== ROUTE / GATEWAY ====="
ip route
echo "===== DOCKER VERSION ====="
docker version
echo "===== DOCKER NETWORKS ====="
docker network ls
重点看这几个信息:
群晖当前 IP
默认网关
当前使用的网卡名
局域网网段
如果你的群晖启用了 Open vSwitch,网卡名很可能是:
ovs_eth0
如果没有启用 Open vSwitch,也可能是:
eth0
后面创建 macvlan 时,parent 参数要用这里查到的实际网卡名。
五、确认宝塔要使用的独立 IP
先找一个没有被占用的 IP 给宝塔使用。
例如准备给宝塔使用:
192.168.xx.xx
可以在局域网电脑上测试:
ping 192.168.xx.xx
如果没有设备响应,说明这个 IP 大概率可以使用。
建议在路由器 DHCP 设置里把这个 IP 做保留,或者放到 DHCP 地址池外,避免以后被其他设备占用。
六、创建 macvlan 网络
下面命令里的参数需要按你的实际网络修改。
需要修改的地方:
--subnet=192.168.xx.0/24 改成你的局域网网段
--gateway=192.168.xx.xx 改成你的网关 IP
--ip-range=192.168.xx.xx/32 改成宝塔容器 IP
-o parent=ovs_eth0 改成你的实际网卡名
创建 macvlan 网络:
docker network create -d macvlan \
--subnet=192.168.xx.0/24 \
--gateway=192.168.xx.xx \
--ip-range=192.168.xx.xx/32 \
-o parent=ovs_eth0 \
bt_macvlan
检查是否创建成功:
docker network ls
查看详细信息:
docker network inspect bt_macvlan
正常情况下可以看到:
bt_macvlan macvlan local
并且里面应该包含类似信息:
Subnet:192.168.xx.0/24
IPRange:192.168.xx.xx/32
Gateway:192.168.xx.xx
parent:ovs_eth0
如果你的网卡名不是 ovs_eth0,记得把命令里的 ovs_eth0 改成自己的实际网卡名。
七、拉取宝塔官方 NAS 镜像
拉取宝塔官方 NAS 镜像:
docker pull btpanel/baota:nas
查看镜像是否下载成功:
docker images | grep -i baota
正常可以看到类似:
btpanel/baota nas
可以再检查一下镜像信息:
docker image inspect btpanel/baota:nas --format '
Image={{.RepoTags}}
Architecture={{.Architecture}}
OS={{.Os}}
Created={{.Created}}
Volumes={{json .Config.Volumes}}
ExposedPorts={{json .Config.ExposedPorts}}
Entrypoint={{json .Config.Entrypoint}}
Cmd={{json .Config.Cmd}}
User={{json .Config.User}}
'
正常情况下,宝塔 NAS 镜像会暴露这些端口:
22
80
443
888
8888
3306
由于我们使用的是 macvlan 独立 IP,所以后面不需要做端口映射。
八、创建宝塔数据目录
在群晖上创建宝塔持久化目录:
mkdir -p /volume1/docker/baota/website_data
mkdir -p /volume1/docker/baota/mysql_data
mkdir -p /volume1/docker/baota/vhost
目录用途:
/volume1/docker/baota/website_data -> 网站目录
/volume1/docker/baota/mysql_data -> MySQL 数据
/volume1/docker/baota/vhost -> 站点配置
检查目录:
ls -ld /volume1/docker/baota
ls -ld /volume1/docker/baota/*
九、创建 compose.yaml
创建 Container Manager 项目使用的 compose 文件。
注意:下面的 ipv4_address 要改成你给宝塔准备的独立 IP。
cat > /volume1/docker/baota/compose.yaml <<'EOF'
version: "3.8"
services:
baota:
image: btpanel/baota:nas
container_name: baota
restart: unless-stopped
privileged: true
shm_size: "1g"
networks:
bt_macvlan:
ipv4_address: 192.168.xx.xx
volumes:
- /volume1/docker/baota/website_data:/www/wwwroot
- /volume1/docker/baota/mysql_data:/www/server/data
- /volume1/docker/baota/vhost:/www/server/panel/vhost
networks:
bt_macvlan:
external: true
name: bt_macvlan
EOF
查看 compose 文件:
cat /volume1/docker/baota/compose.yaml
完整内容应该类似这样:
version: "3.8"
services:
baota:
image: btpanel/baota:nas
container_name: baota
restart: unless-stopped
privileged: true
shm_size: "1g"
networks:
bt_macvlan:
ipv4_address: 192.168.xx.xx
volumes:
- /volume1/docker/baota/website_data:/www/wwwroot
- /volume1/docker/baota/mysql_data:/www/server/data
- /volume1/docker/baota/vhost:/www/server/panel/vhost
networks:
bt_macvlan:
external: true
name: bt_macvlan
十、在 Container Manager 创建项目
打开群晖 DSM,进入:
Container Manager -> 项目 -> 新增
填写:
项目名称:baota
路径:/volume1/docker/baota
Compose 文件:/volume1/docker/baota/compose.yaml
选择使用现有 compose 文件,然后启动项目。
如果 Container Manager 页面出现端口映射设置,不需要手动填写端口。
因为这里用的是 macvlan 独立 IP,宝塔的端口都直接属于宝塔自己的 IP,不需要映射到群晖 IP 上。
十一、检查容器状态
回到 FinalShell,执行:
docker ps -a --filter "name=baota"
正常状态类似:
CONTAINER ID IMAGE COMMAND STATUS NAMES
xxxxxxxxxxxx btpanel/baota:nas "/bin/sh -c /bt.sh" Up xx seconds (healthy) baota
查看日志:
docker logs --tail=80 baota
如果看到类似:
cat: /www/server/panel/data/o.pl: No such file or directory
/bt.sh: line 52: /sbin/crond: No such file or directory
先不要急着处理。
只要容器状态是:
Up ... (healthy)
一般就可以继续。
十二、确认容器是否拿到独立 IP
执行:
docker inspect baota --format '
Name={{.Name}}
Status={{.State.Status}}
Health={{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}
Networks={{json .NetworkSettings.Networks}}
'
重点确认:
Status=running
Health=healthy
IPAddress=192.168.xx.xx
Gateway=192.168.xx.xx
Network=bt_macvlan
如果 IPAddress 是你给宝塔设置的 IP,就说明 macvlan 生效了。
十三、获取宝塔登录信息
执行:
docker exec -it baota bt default
正常会输出类似:
==================================================================
BT-Panel default info!
==================================================================
外网ipv4面板地址: http://公网IP:8888/btpanel
内网面板地址: http://192.168.xx.xx:8888/btpanel
username: btpanel
password: xxxxxxxx
==================================================================
这里使用内网面板地址访问即可:
http://192.168.xx.xx:8888/btpanel
如果执行下面命令进入了宝塔菜单:
docker exec -it baota bt
看到:
请输入命令编号:
输入:
0
然后回车退出。
十四、访问宝塔面板
浏览器打开:
http://192.168.xx.xx:8888/btpanel
登录信息:
用户名:btpanel
密码:以 docker exec -it baota bt default 输出为准
首次登录后建议马上做以下操作:
修改面板密码
修改安全入口
关闭不需要的服务
不要直接把 8888、3306、22 等端口暴露到公网
如果必须公网访问,建议使用 VPN、反向代理、白名单或防火墙限制
十五、常用维护命令
查看容器状态:
docker ps -a --filter "name=baota"
查看日志:
docker logs --tail=100 baota
重启容器:
docker restart baota
进入宝塔命令菜单:
docker exec -it baota bt
查看默认登录信息:
docker exec -it baota bt default
进入容器 shell:
docker exec -it baota /bin/bash
如果没有 bash,就用:
docker exec -it baota /bin/sh
查看容器网络:
docker inspect baota --format '{{json .NetworkSettings.Networks}}'
查看 macvlan 网络:
docker network inspect bt_macvlan
十六、更新宝塔镜像
拉取新镜像:
docker pull btpanel/baota:nas
进入项目目录:
cd /volume1/docker/baota
重建容器:
docker compose down
docker compose up -d
检查状态:
docker ps -a --filter "name=baota"
docker logs --tail=80 baota
十七、删除旧镜像
如果之前测试过旧版镜像,比如:
pch18/baota:latest
新版稳定后可以删除:
docker rmi pch18/baota:latest
如果提示镜像被容器占用,先检查旧容器:
docker ps -a | grep pch18
确认不用后再删除对应容器和镜像。
十八、macvlan 注意事项
1. 群晖本机默认不能访问宝塔容器 IP
macvlan 模式下,群晖宿主机默认不能直接访问容器 IP。
所以不要在群晖 SSH 里用下面这种方式判断宝塔是否正常:
curl http://192.168.xx.xx:8888
应该在同一局域网的电脑浏览器里访问:
http://192.168.xx.xx:8888/btpanel
2. 不需要端口映射
compose 文件里没有写:
ports:
这是正常的。
因为宝塔已经有自己的独立 IP:
192.168.xx.xx
所以宝塔端口直接属于这个 IP:
192.168.xx.xx:80
192.168.xx.xx:443
192.168.xx.xx:888
192.168.xx.xx:8888
192.168.xx.xx:3306
192.168.xx.xx:22
3. 路由器里建议保留宝塔 IP
建议在路由器 DHCP 设置里保留宝塔 IP:
192.168.xx.xx
避免以后被其他设备拿走,造成 IP 冲突。
十九、如果网关写错了怎么办
如果 bt_macvlan 创建时网关写错了,不能直接修改,需要删除后重建。
先停止并删除宝塔容器:
docker stop baota
docker rm baota
删除旧网络:
docker network rm bt_macvlan
重新创建 macvlan 网络:
docker network create -d macvlan \
--subnet=192.168.xx.0/24 \
--gateway=192.168.xx.xx \
--ip-range=192.168.xx.xx/32 \
-o parent=ovs_eth0 \
bt_macvlan
然后回到 Container Manager,重新启动 baota 项目即可。
二十、最终效果
完成后效果如下:
宝塔不和群晖共用内网 IP
宝塔独立使用 192.168.xx.xx
宝塔端口不占用 DSM
使用宝塔官方 NAS 镜像 btpanel/baota:nas
通过 Container Manager 项目管理
容器状态 healthy
内网访问正常
最终访问地址:
http://192.168.xx.xx:8888/btpanel
这种方式比较适合在群晖 NAS 上部署宝塔面板,既方便 Container Manager 管理,也避免了和 DSM 端口冲突。









暂无评论内容