LXC容器内Docker无法访问网络,拉取镜像时出现TLS握手超时问题求助
看起来你遇到的问题挺典型的——在RHEL 8.6上的Ubuntu 20.04特权LXC容器里,明明curl能通过代理正常访问外网,但Docker拉镜像就是报TLS握手超时。结合你给出的syslog日志,我整理了几个针对性的排查和解决方向:
一、先确认Docker的代理配置是否真正生效
你已经在/etc/systemd/system/docker.service.d/http-proxy.conf里配置了代理,但有可能systemd没重载配置,导致Docker没读到这些环境变量。可以按下面的步骤验证并修复:
# 先重载systemd的配置文件 systemctl daemon-reload # 重启Docker服务 systemctl restart docker # 检查Docker进程的环境变量,看看代理参数是否已加载 ps aux | grep dockerd | grep -E "(HTTP_PROXY|HTTPS_PROXY)"
如果看不到代理相关的环境变量,说明这个配置方式没生效,你可以试试更稳妥的Docker daemon配置法:新建或编辑/etc/docker/daemon.json文件,添加代理配置:
{ "proxies": { "default": { "httpProxy": "<你的代理地址>", "httpsProxy": "<你的代理地址>" } } }
保存后重启Docker服务,再尝试拉取镜像。
二、解决宿主机内核模块缺失的问题
从syslog里的警告能明显看到,Docker加载bridge和br_netfilter模块失败了——这两个模块是Docker网络栈正常工作的核心,而LXC容器共享宿主机的内核,所以必须在RHEL 8.6宿主机上处理:
# 临时加载这两个模块 modprobe bridge modprobe br_netfilter # 设置开机自动加载,避免重启后失效 echo "bridge" >> /etc/modules-load.d/bridge.conf echo "br_netfilter" >> /etc/modules-load.d/bridge.conf
加载完成后,重启你的LXC容器和Docker服务,再检查syslog里的模块错误是否消失。
三、验证容器内的DNS解析是否正常
TLS握手超时有时候并不是网络不通,而是DNS解析失败导致Docker找不到镜像仓库地址。虽然curl能正常解析bbc.co.uk,但Docker可能用了不同的DNS配置,你可以手动验证:
# 在容器内解析Docker仓库地址 nslookup registry-1.docker.io
如果解析失败,可以临时修改/etc/resolv.conf添加可靠的DNS服务器(比如8.8.8.8),或者在启动LXC容器时通过--dns参数指定DNS服务器。
四、确认宿主机的IP转发功能已开启
Docker的网络转发依赖宿主机的IP转发功能,你可以在宿主机上检查:
sysctl net.ipv4.ip_forward
如果输出是net.ipv4.ip_forward = 0,说明功能未开启,需要开启它:
# 临时生效 sysctl -w net.ipv4.ip_forward=1 # 永久生效,编辑sysctl配置文件 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
备注:内容来源于stack exchange,提问作者PrestonDocks

