让 macvlan 容器拿到 IPv6:endpoint sysctls + SLAAC

macvlan(ipvlan 同理)容器默认没有 IPv6:只有 link-local 地址,没有默认路由。原因不是网络不通,而是 Docker 在网络的 EnableIPv6 为 false 时,会主动把容器接口的 disable_ipv6 置 1。 下面是家庭宽带(前缀由运营商动态下发)场景下的正确配置。 先确认是这个问题 $ docker exec <容器> ip -6 addr show eth0 inet6 fe80::ef5:b3ae:a64e:e782/64 scope link # 只有 link-local $ docker exec <容器> cat /proc/sys/net/ipv6/conf/eth0/disable_ipv6 1 # 被管理性关闭 不要给 docker 网络声明 v6 子网 看着「正规」的写法是这样,但对家庭宽带是错的: networks: macvlan_net: enable_ipv6: true ipam: config: - subnet: 2408:xxxx:xxxx:xxx::/64 # ← 别这么写 这个 /64 是运营商通过 DHCPv6-PD 下发的,它会变。前缀一换,容器还抱着旧前缀里切出来的地址,而那个前缀已经不再路由到你家了——表现是 IPv6 静默失效,配置文件里却白纸黑字写着一个看起来没问题的地址。 ...

2026年8月26日 · 2 分钟 · Vinkey

用 Docker + macvlan 跑 mihomo 旁路由:宿主机互通与局域网接入

家里用一台 N95 迷你主机当 homelab host,Docker 里跑 mihomo,用 macvlan 给它分一个独立的局域网 IP(10.0.0.6),让它当局域网的旁路由——设备把网关指过去,流量就经过 mihomo 分流代理,不用动主路由的整体路由结构。 容器起来只是第一步,实际会撞上两件事:宿主机和自己衍生出的 macvlan 容器默认互相不通,以及局域网设备到底怎么切到这个网关。这篇把两个都记下来。 为什么用 macvlan docker-compose 配置: services: mihomo: image: metacubex/mihomo:latest container_name: mihomo cap_add: - NET_ADMIN devices: - /dev/net/tun:/dev/net/tun volumes: - ./data:/root/.config/mihomo networks: macvlan_net: ipv4_address: 10.0.0.6 # 需要 IPv6 就把下面带 # 的行全解开(含 sysctls 里那两行) # driver_opts: # com.docker.network.endpoint.sysctls: "net.ipv6.conf.IFNAME.disable_ipv6=0,net.ipv6.conf.IFNAME.accept_ra=2" sysctls: net.ipv4.ip_forward: 1 # net.ipv6.conf.all.disable_ipv6: 0 # net.ipv6.conf.all.forwarding: 1 networks: macvlan_net: driver: macvlan driver_opts: parent: enp1s0 ipam: config: - subnet: 10.0.0.0/24 gateway: 10.0.0.1 用 macvlan 而不是普通 bridge,是因为要给容器一个和局域网其他设备平级的真实 IP,这样它才能被其他设备当网关直接访问、转发流量。bridge 模式下容器藏在宿主机的 NAT 后面,别的设备根本没法把它当网关。 ...

2026年8月20日 · 更新于 2026年8月26日 · 2 分钟 · Vinkey

Docker 装完之后:免 sudo、配代理,以及每天都在敲的那些命令

apt install docker-ce 跑完并不等于能用了。每次装完新机器我都要重复同样三件事:把当前用户加进 docker 组、给守护进程配代理、然后把服务用 compose 起起来。这篇把这三件事和之后天天要敲的命令一起记下来,下次直接抄。 一、免 sudo 敲 docker 刚装完执行 docker ps 会报 permission denied ... /var/run/docker.sock。因为这个 socket 属于 docker 组,而你的用户不在组里。 # 1. 创建 docker 组(安装时通常已自动创建,执行一下无妨) sudo groupadd docker # 2. 将当前用户加入 docker 组 sudo usermod -aG docker $USER # 3. 激活组更改(或者直接退出并重新登录 SSH) newgrp docker newgrp 只对当前这个 shell 生效,新开的窗口仍然是旧的组信息。想彻底干净,还是退出重连 SSH 最省事。 验证: docker run --rm hello-world ⚠️ 需要知道的一件事:docker 组等价于 root 权限。进了这个组的用户,可以挂载宿主机根目录起一个容器,等于拿到全盘读写。个人服务器无所谓,多人共用的机器就要想清楚再加。 二、给守护进程配代理 在境内拉 docker.io 的镜像经常超时。注意这里要配的是 dockerd 这个守护进程的代理,不是你 shell 里的 http_proxy——因为真正去拉镜像的是后台的 dockerd,它读不到你终端里的环境变量。 ...

2026年8月18日 · 2 分钟 · Vinkey