Buildroot系统RPi3上Docker运行容器端口绑定失败怎么解决?
RPi3 Buildroot系统Docker端口映射报错解决方案
问题背景
在RPi3(树莓派3)上搭建搭载Docker的Buildroot系统,系统启动正常,Docker也可正常运行,但在运行需要开放端口的容器时失败,报错信息如下:
docker: Error response from daemon: driver failed programming external connectivity on endpoint portainer (b6130d6ee0d30f867ff0e99349db1567389b18e9f42ca35718e0a5aefcb3976d): Error starting userland proxy: listen tcp [::]:9443: bind: address already in use.
排查确认:尝试任意端口均会报错,执行netstat | grep 9443无输出,不存在其他进程占用对应端口。
已验证测试信息
- 覆盖测试Buildroot 2021.02.5 LTS、2021.08-rc3、2021.08正式版
- 同时测试32位、64位树莓派3配置,仅开启docker-cli、docker-engine、openssh、ntp等必要服务,无多余自定义配置
- 新增dbus组件未解决问题
修复方案
按优先级依次尝试以下操作:
- 禁用Docker用户态代理
修改Docker daemon配置关闭用户态转发组件,新建/编辑/etc/docker/daemon.json添加如下内容:
{ "userland-proxy": false }
修改完成后执行systemctl restart docker重启Docker服务,重试容器启动即可。
该方案为Buildroot环境下同类问题的最高概率解法:Docker默认的docker-proxy用户态转发组件在轻量定制系统中适配性差,关闭后会直接调用内核netfilter模块完成端口转发,可规避用户态代理的异常绑定问题。
- 补全内核netfilter配置
如果方案1无效,执行make linux-menuconfig进入内核配置界面,确认开启以下网络模块:
- Networking support -> Networking options -> Network packet filtering framework (Netfilter) 下的全部IPv4/IPv6 filter、nat、mangle表支持
- 开启
CONFIG_NF_CONNTRACK、CONFIG_NF_NAT、CONFIG_IP_NF_FILTER、CONFIG_IP_NF_NAT配置项 - 开启
CONFIG_BRIDGE_NETFILTER桥接过滤相关配置
内核重新编译烧录后再测试端口映射功能。
- 禁用IPv6绑定
如果无需IPv6支持,可在daemon.json中新增配置让Docker仅绑定IPv4地址:
{ "userland-proxy": false, "ip": "0.0.0.0" }
也可在内核启动参数中添加ipv6.disable=1完全关闭IPv6功能,避免IPv6套接字绑定异常触发的报错。
- 重置iptables规则
执行iptables -t nat -L -n检查Docker自动生成的nat规则是否存在残留冲突,若有异常可执行以下命令重置:
iptables -t nat -F systemctl restart docker
内容的提问来源于stack exchange,提问作者Doubable
相关产品推荐
相关产品推荐

