Docker Compose 独立 IP 部署
镜像与架构
公开镜像为 darkver8/cmsingbox:latest,支持 linux/amd64、linux/arm64 和 linux/arm/v7。同一条 pull 命令会自动选择设备架构。镜像已带基础 sing-box 内核,首次启动即可生成配置;之后仍可在后台更换内核。
部署前准备
- 安装 Docker Engine 与 Compose v2 插件。
- 找出真实 LAN 网卡,例如
eth0;不要使用docker0。 - 在 DHCP 地址池之外选择空闲 IP,例如
192.168.1.20。 - 确认网关为
192.168.1.1,并用 ping 初步排除地址占用。
docker compose version
ip -4 route
ip -br link
ping -c 1 192.168.1.20方式一:一键部署
curl -fsSL https://raw.githubusercontent.com/qwernot/CM/main/deploy/install-docker.sh | sudo env CMSINGBOX_IP=192.168.1.20 sh脚本自动识别默认网卡和网段,网关默认写 192.168.1.1。多网卡或非默认网段请明确指定:
curl -fsSL https://raw.githubusercontent.com/qwernot/CM/main/deploy/install-docker.sh | sudo env CMSINGBOX_IP=192.168.1.20 CMSINGBOX_PARENT=eth0 CMSINGBOX_SUBNET=192.168.1.0/24 CMSINGBOX_GATEWAY=192.168.1.1 sh方式二:完整 Compose 文件
不需要提前执行 docker network create。新建一个空目录,将下面全部内容保存为 compose.yml。使用前只需修改代码中标注的四项:容器独立 IP、局域网网段、网关和宿主机 LAN 网卡。授权公钥已编译进镜像,无需在 Compose 中填写。
services:
cmsingbox:
image: darkver8/cmsingbox:latest
container_name: cmsingbox
restart: unless-stopped
privileged: true
environment:
TZ: Asia/Shanghai
volumes:
- ./data:/data
networks:
cmsingbox_lan:
ipv4_address: 192.168.1.20 # ① 改为准备给容器的空闲 IP
networks:
cmsingbox_lan:
driver: macvlan
driver_opts:
parent: eth0 # ④ 改为宿主机 LAN 网卡
ipam:
config:
- subnet: 192.168.1.0/24 # ② 改为局域网网段
gateway: 192.168.1.1 # ③ 改为局域网网关也可以直接下载同一份完整文件再编辑:
mkdir -p cmsingbox && cd cmsingbox
curl -fLo compose.yml https://raw.githubusercontent.com/qwernot/CM/main/deploy/docker-compose.yml
nano compose.yml保存后拉取并启动:
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 cmsingboxcmsingbox_lan 同时提供独立局域网 IP 和经 192.168.1.1 网关访问互联网的默认路由,避免额外 bridge 网络抢占默认出口,导致节点连接被重置。首次使用
- 打开
http://192.168.1.20:80,初始账号、密码均为admin。 - 修改密码,添加订阅并刷新节点。
- 保存并应用配置,启动 sing-box。
- 打开
http://192.168.1.20:9090/ui/;混合代理为192.168.1.20:2080。 - 独立 DNS 在新安装时默认开启;使用
192.168.1.20:53。
DNS 与端口
进入“设置 → DNS”,确认独立 DNS 已开启并监听 0.0.0.0:53,选择分流模式并保存、应用配置。再将路由器或终端 DNS 指向容器 IP。macvlan 让容器拥有独立 IP,因此不会与宿主机的 53 端口冲突。
更新、日志与备份
cd /opt/cmsingbox-docker
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f --tail=100一键脚本的数据在 /opt/cmsingbox-docker/data。升级前通过后台导出备份,也可停止容器后备份整个目录。不要执行 docker compose down -v。
macvlan 宿主机隔离
宿主机默认无法直接访问自己的 macvlan 容器,而同一局域网的手机、电脑和路由器通常可以访问。这是 Linux macvlan 的正常行为,不代表服务故障。需要从宿主机访问时,一键脚本会自动创建 shim;手动 Compose 部署完成后,在宿主机执行:sudo ip link add cmsingbox-shim link eth0 type macvlan mode bridge、sudo ip link set cmsingbox-shim up、sudo ip route replace 192.168.1.20/32 dev cmsingbox-shim(将 eth0 和 192.168.1.20 改为实际网卡和容器 IP)。随后本机即可访问 80、9090 和 53。卸载时执行 sudo ip route del 192.168.1.20/32 dev cmsingbox-shim、sudo ip link del cmsingbox-shim。
故障排查
| 现象 | 检查 |
|---|---|
Pool overlaps | 已有 Docker 网络占用相同网段;执行 docker network ls 和 docker network inspect <网络名>,确认无用途后改网段或删除,不能盲删正在使用的网络 |
| 容器启动后退出 | docker compose logs --tail=200 |
| 订阅或内核下载失败 | egress 网络、容器 DNS、系统时间和目标网址 |
| 局域网访问不到 | parent 网卡、IP 冲突、交换机多 MAC 限制 |
| 代理 HTTP 错误 | 节点可用性、最终出站、规则和 sing-box 日志 |
| DNS 端口没响应 | 独立 DNS 开关、保存应用、TCP/UDP 53 |