容器不能联网

使用docker默认的桥接模式(bridge)无法对外访问网络,主要是转发NAT FWD导致的

测试是否可以上网

docker run --rm alpine ping -c 3 www.baidu.com

2025-04-20T02:28:36.png

或者先重启防火墙 /etc/init.d/firewall restart

然后 docker run --rm alpine ping -c 3 www.baidu.com

linux

sysctl net.ipv4.ip_forward
查看转发情况,正常应该是 1

sysctl -w net.ipv4.ip_forward=1
sysctl -p

openwrt

单网口的这样配置,直接改 lan为dhcp客户端,关闭dhcp server

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'eth0'

config interface 'lan'
        option device 'br-lan'
        option proto 'dhcp'

2024-11-04T02:59:03.png

docker里面配置,在wan口允许访问:

2024-11-09T10:43:12.png

如果没有上述设置,那么改这里

2024-11-09T10:43:12.png

LEDE QWRT需配置防火墙

config nat 'docker_nat'
        option name 'DockerNAT'
        option proto 'all'
        option src 'lan'
        option target 'MASQUERADE'
        option extra '-i docker0'

config zone 'docker'
        option name 'docker'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'ACCEPT'
        option auto_helper '0'
        list device 'docker0'

config forwarding 'docker_to_wan'
        option src 'docker'
        option dest 'wan'

config forwarding 'docker_to_lan'
        option src 'docker'
        option dest 'lan'

config forwarding 'lan_to_docker'
        option src 'lan'
        option dest 'docker'
  • 增加NAT

2025-04-20T12:34:06.png
2025-04-20T12:34:10.png
+修改Docker区域
2025-04-20T12:34:15.png
2025-04-20T12:40:01.png

手动启动防火墙

很怪异的事情, 只需配好Docker的防火墙,然后手动启动防火墙 '/etc/init.d/firewall restart`

容器就可以正常使用外网了,猜测是因为防火墙先加了规则,当时docker还没有启动docker0等网络.
导致防火墙规则不起效.
2025-04-21T03:31:34.png
+解决方法

vi /ect/rc.local
加入一行延时重启防火墙 nohup bash -c "sleep 10; /etc/init.d/firewall restart" >/dev/null 2>&1 &

或者修改 /etc/init.d/dockerd 启动docker复位后,重启防火墙

grep -q "/etc/init.d/firewall restart" /etc/init.d/dockerd || sed -i '/procd_close_instance/a /etc/init.d/firewall restart' /etc/init.d/dockerd

猫哥最后一招

iptables -t nat -A POSTROUTING -s 172.17.0.0/255.255.255.0 -o eth0.2 -j MASQUERADE

其中 eth0.2是wan口

2025-04-20T02:29:16.png

还搞不定?

佳佳asr3000: 为啥要桥模式, 直接用主机网络 --net=host