docker cURL error 6: Could not resolve host

场景:

微信小程序 获取 用户 openpid,在此之前,我需要先 "获取稳定版接口调用凭据",根据手册提示的,要先调用

https://api.weixin.qq.com/cgi-bin/stable_token

我这边就开始了请求,结果返回了:

cURL error 6: Could not resolve host: api.weixin.qq.com (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://api.weixin.qq.com/cgi-bin/stable_token

就很头疼,因为之前我是做过这块的,基本上没有问题,没遇到过这个。

好在,第一时间我就想到原因了,环境不同

以前是没有使用 docker 的,本次是使用的 docker 开发,然后我去查阅,很幸运网上都有针对这个问题的解答,并且也标注确实是因为 docker 才发生这个问题的!

先说明一下,发生的原因:

原因分析:
   Docker 容器无法解析局域网内的域名,就算本地主机的 hosts 配置了域名映射也是不行的
   Docker 环境不同于 wamp 或者 Xampp,对于局域网内的域名解析,Docker 需要到 docker 内部配置 hosts 文件
解决步骤:
   进入 docker 容器后,在 docker 文件中,配置域名解析;
   1. docker exec -it 容器ID /bin/bash
   2. vim /etc/hosts
   3. 添加域名解析规则

解决思路明白了,这里面还有一点是未知的,就是第三步,"域名解析"

我们可以先看一下 hosts 文件里面的内容:

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.26.0.2      264a7fee7843

可以看到其中的一个

127.0.0.1       localhost

而我们也需要添加我们需要的域名,但是 IP 地址是多少呢?

这时候我们就可以去 ping 一下

因为我们使用的域名是:https://api.weixin.qq.com/cgi-bin/stable_token

所以 ping 的话,就要这样:

这样就知道该域名的 IP 地址了!

现在!我们就可以按照上面的步骤进行添加域名解析了

1. 进入容器

winpty docker exec -it 容器ID bash

"容器ID" 换成自己的 容器ID,或者容器名称 就可以了

winpty,这条命令,是因为我是在 windows 环境里进入容器,所以需要用到

2.找到 hosts 文件

cd /etc

cat hosts

先进入到 etc 目录

打印 hosts 文件内容

3.添加域名解析

vim hosts

编辑 hosts 文件,然后将下面这条添加到最后一行即可

121.14.23.85    api.weixin.qq.com

扩展:如果没有安装 vi 或者 vim,无法使用编辑,则可以使用下面这样处理

echo '121.14.23.85    api.weixin.qq.com' >> hosts

再查看一下内容,只要包含就可以了

cat hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.26.0.2      264a7fee7843
121.14.23.85    api.weixin.qq.com

能看到,最后一行就加上去了

然后我们不需要重启容器,返回程序直接发起请求就可以了


2023年8月21日

新的一周,因为重启了容器,所以配置重置了,我按照上面的方式重新处理了一遍,结果发现还是会出现 "cURL error 6: Could not resolve host"

原因有两个:

  1. api.weixin.qq.com 的 IP 地址会变动
  2. 需要增加 DNS 地址

先说第一个,腾讯 那边还是很严谨厉害的, IP 是动态的,上周 ping 的时候是 121.14.23.85

今天我 ping 的时候却是:119.147.6.237,并且早上 两个小时前,我 ping 的地址还是另外一个~~

所以这样的方法,我们不能作为稳定使用,因为这意味着,变动一次 IP 我们就要去加入一次 IP地址,那太难受了,并且如此的话,我们发布后 线上也容易出现问题!

所以,我们就要使用第二个方案,增加 DNS 地址

nameserver 119.29.29.29
 
nameserver 8.8.8.8

我们可以在 "resolv.conf" 文件后面,追加这两行

119.29.29.29 代表是 腾讯 DNS 地址

8.8.8.8 代表是 Google DNS 地址

然后我们再来实验。

先看一下添加到文件内容后:

能看到文件内容,最后两行是有我们新加入的内容,那么我们再请求一下 "https://api.weixin.qq.com/cgi-bin/stable_token" 这个地址试试能不能成功!

好的 成功了!

以上是我这边请求接口(请求我自己写的程序)时,再请求 "https://api.weixin.qq.com/cgi-bin/stable_token" 成功后 输出的内容!

就是返回的 "稳定版接口调用凭据"

额外的知识点!!!

上面有说不能重启,是因为我们重启容器后,我们修改的 "/etc/hosts" 文件则又会重置,所以就等于 白改

为什么重启后修改内容不存在了

原因是:每次 docker 在启动容器的时候,通过重新构建新的 /etc/hosts 文件,这又是为什么呢?原因是:容器重启,IP 地址为改变,hosts 文件中原来的 IP 地址无效,因此理应修改 hosts 文件,否则会产生脏数据

有没有什么好的解决方法?

可以通过 docker run 命令的 –add-host 参数来为容器添加 host 与 ip 的映射关系

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值