Docker端口映射报错:driver failed programming external connectivity求助
解决Ubuntu 20.04下Docker端口映射失败及docker-proxy高CPU问题
问题分析
执行带-p端口映射参数的Docker命令时出现Error starting userland proxy错误,同时伴随docker-proxy进程高CPU占用,通常是Docker用户态代理与系统网络规则冲突、iptables规则混乱或IP转发未启用导致。
解决方案
1. 切换至iptables模式禁用userland代理
Docker默认使用用户态代理(userland-proxy)处理端口转发,该模式易引发冲突且资源占用高,改用iptables模式可解决此问题:
- 创建/编辑Docker配置文件:
sudo nano /etc/docker/daemon.json - 添加以下配置内容:
{ "userland-proxy": false } - 重启Docker服务生效:
sudo systemctl daemon-reload && sudo systemctl restart docker
2. 清理并重建Docker iptables规则
Docker自动生成的iptables规则可能因异常操作变得混乱,清理后重建可修复端口映射问题:
- 停止Docker服务:
sudo systemctl stop docker - 清理Docker相关的iptables规则:
sudo iptables -t nat -F DOCKER sudo iptables -t filter -F DOCKER sudo iptables -t nat -F DOCKER-USER sudo iptables -t filter -F DOCKER-USER - 重启Docker服务:
sudo systemctl start docker
3. 启用系统IP转发功能
IP转发是Docker端口映射正常工作的必要条件,确保系统已开启该功能:
- 临时启用:
sudo sysctl -w net.ipv4.ip_forward=1 - 永久启用(重启后生效):
确保sudo nano /etc/sysctl.confnet.ipv4.ip_forward=1这一行未被注释,保存后执行:sudo sysctl -p
4. 清理异常残留的docker-proxy进程
若之前的docker-proxy进程异常残留,会占用资源导致映射失败:
- 停止Docker服务:
sudo systemctl stop docker - 强制杀掉所有
docker-proxy进程:sudo pkill -f docker-proxy - 重启Docker服务:
sudo systemctl start docker
关键测试提示
注意:hello-world镜像仅用于验证Docker运行状态,不会启动任何网络服务,因此即使添加-p参数也无法实现有效端口映射。测试端口映射应使用实际提供网络服务的镜像,例如:
docker container run -d -p 8123:80 nginx
执行后可通过sudo ss -tulpn | grep 8123检查端口监听状态,或访问http://localhost:8123验证服务是否正常响应。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

