docker cURL error 6: Could not resolve host

这篇具有很好参考价值的文章主要介绍了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 的话,就要这样:

docker cURL error 6: Could not resolve host,docker

这样就知道该域名的 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 地址

然后我们再来实验。

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

docker cURL error 6: Could not resolve host,docker

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

docker cURL error 6: Could not resolve host,docker

好的 成功了!

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

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

额外的知识点!!!

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

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

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

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

可以通过 docker run 命令的 –add-host 参数来为容器添加 host 与 ip 的映射关系文章来源地址https://www.toymoban.com/news/detail-756252.html

到了这里,关于docker cURL error 6: Could not resolve host的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包