场景:
微信小程序 获取 用户 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"
原因有两个:
- api.weixin.qq.com 的 IP 地址会变动
- 需要增加 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 的映射关系