GCE虚拟机Docker容器部分域名连接异常及代理地址查询求助
问题排查与解决方案
一、查找GCE虚拟机的代理配置
- 查看系统级代理环境变量:
在GCE宿主机执行以下命令,直接检查是否存在代理设置:
若输出包含printenv | grep -i proxyHTTP_PROXY或HTTPS_PROXY,对应值即为当前系统使用的代理地址。 - 检查Docker守护进程的代理配置:
查看Docker daemon的配置文件:
如果文件内有cat /etc/docker/daemon.jsonproxies字段,其中的内容就是Docker全局使用的代理配置。 - 检查GCE实例元数据中的代理设置:
通过元数据服务器查询实例的自定义代理配置:
若存在curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/ -H "Metadata-Flavor: Google"http-proxy或https-proxy类的键,对应的值就是代理地址。也可以直接在GCE控制台的实例详情页,切换到「元数据」标签页查看。
二、解决容器内无法连接getcomposer.org的SSL错误
你使用的php:5.6-apache镜像基于Debian Jessie,系统组件版本较旧,大概率是OpenSSL版本不兼容getcomposer.org当前使用的TLS协议套件导致的,按以下步骤排查:
验证TLS协议兼容性
在容器内执行指定TLS版本的curl命令测试:curl -I https://getcomposer.org --tlsv1.2如果该命令能正常返回响应,说明容器默认的TLS协议版本过低,需要强制使用高版本协议。
更新容器内的SSL组件
修改你的Dockerfile,添加更新OpenSSL和证书的步骤:FROM php:5.6-apache # 更新系统并安装最新的OpenSSL和证书 RUN apt-get update && \ apt-get install -y --no-install-recommends openssl ca-certificates && \ apt-get clean && \ rm -rf /var/lib/apt/lists/*重新构建镜像后再运行容器测试。
检查容器DNS配置
容器内执行cat /etc/resolv.conf,对比宿主机的/etc/resolv.conf,如果DNS服务器不一致,可能导致域名解析异常。运行容器时可以指定GCE推荐的DNS服务器:docker run --dns 8.8.8.8 --dns 8.8.4.4 [你的镜像名]临时排查iptables限制
在GCE宿主机执行以下命令临时允许所有转发流量:iptables -P FORWARD ACCEPT然后测试容器内的连接,如果恢复正常,说明是Docker的iptables规则导致的,需要调整Docker的
iptables配置(在/etc/docker/daemon.json中添加"iptables": false后重启Docker,或者调整自定义iptables规则)。
内容的提问来源于stack exchange,提问作者Saddam Hossain
相关产品推荐
相关产品推荐

