You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何判断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

火山引擎 最新活动