如何判断Docker userland-proxy启用/禁用状态及验证配置效果
刚好我之前在CentOS 7上折腾过Docker的userland-proxy配置,先给你补补基础认知,再一步步告诉你怎么验证配置切换后的差异:
先搞懂userland-proxy到底是什么
简单说,Docker的userland-proxy是用户空间的端口转发组件:当你把容器端口映射到主机时,如果开启它(userland-proxy: true),Docker会启动docker-proxy进程来接管端口转发;如果禁用(false),Docker会完全依赖内核态的iptables NAT规则来完成流量转发——后者性能更高,也是现在推荐的配置。
验证配置差异的几个方法
1. 用docker info直接确认配置状态
这是最直接的方式,执行命令:
docker info
在输出里找Userland Proxy这一行,开启状态会显示:
Userland Proxy: true
禁用状态则显示:
Userland Proxy: false
2. 查看docker-proxy进程的存在
当userland-proxy设为true时,每个带端口映射的容器都会对应一个独立的docker-proxy进程。执行以下命令查看:
ps aux | grep docker-proxy
- 开启状态:会看到多条
/usr/bin/docker-proxy开头的进程记录; - 禁用状态:只会看到grep本身的进程,没有
docker-proxy运行。
3. 对比iptables NAT规则的细节
不管开启还是禁用,Docker都会生成iptables规则,但逻辑有区别:
执行命令查看DOCKER链的NAT规则:
iptables -t nat -L DOCKER
- 开启状态:链的最前面会有一条
RETURN规则,把流量转交给userland-proxy处理,类似:RETURN all -- anywhere anywhere - 禁用状态:这条
RETURN规则消失,直接是DNAT规则把流量转发到容器的IP和端口,比如:DNAT tcp -- anywhere anywhere tcp dpt:8080 to:172.17.0.3:80
4. 实际端口监听与连通性测试
启动一个带端口映射的容器来测试,比如:
docker run -d -p 8080:80 nginx
然后执行端口监听查看命令:
netstat -tulpn | grep 8080
- 开启状态:会看到
docker-proxy进程在监听主机的8080端口; - 禁用状态:看不到
docker-proxy的监听记录,但你依然可以用curl localhost:8080访问到容器里的nginx——因为流量是通过iptables直接转发的,全程在内核态处理,没有用户态进程参与。
补充个小提示
现在主流的Linux内核(包括CentOS 7.4的内核)都完全支持iptables的直接转发,所以禁用userland-proxy是更优的选择,能减少用户态和内核态之间的切换开销,提升端口转发的性能。
内容的提问来源于stack exchange,提问作者Mendhak




