Docker Compose 独立 IP 部署

约 10 分钟阅读 · 多架构镜像
容器同时连接出口 bridge 网络与 macvlan 局域网,为 CMSingBox 分配独立 IP。53、2080、9090、80 不占宿主机端口。

镜像与架构

公开镜像为 darkver8/cmsingbox:latest,支持 linux/amd64、linux/arm64 和 linux/arm/v7。同一条 pull 命令会自动选择设备架构。镜像已带基础 sing-box 内核,首次启动即可生成配置;之后仍可在后台更换内核。

部署前准备

  1. 安装 Docker Engine 与 Compose v2 插件。
  2. 找出真实 LAN 网卡,例如 eth0;不要使用 docker0。
  3. 在 DHCP 地址池之外选择空闲 IP,例如 192.168.1.20。
  4. 确认网关为 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 cmsingbox
为什么只使用 macvlan 网络cmsingbox_lan 同时提供独立局域网 IP 和经 192.168.1.1 网关访问互联网的默认路由,避免额外 bridge 网络抢占默认出口,导致节点连接被重置。

首次使用

  1. 打开 http://192.168.1.20:80,初始账号、密码均为 admin。
  2. 修改密码,添加订阅并刷新节点。
  3. 保存并应用配置,启动 sing-box。
  4. 打开 http://192.168.1.20:9090/ui/;混合代理为 192.168.1.20:2080。
  5. 独立 DNS 在新安装时默认开启;使用 192.168.1.20:53。

DNS 与端口

进入“设置 → DNS”,确认独立 DNS 已开启并监听 0.0.0.0:53,选择分流模式并保存、应用配置。再将路由器或终端 DNS 指向容器 IP。macvlan 让容器拥有独立 IP,因此不会与宿主机的 53 端口冲突。

手机或电脑打不开独立 IP部分 Wi-Fi 网卡、云平台或交换机禁止一个物理端口出现多个 MAC 地址,这类环境不适合 macvlan,请改用原生部署。

更新、日志与备份

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