Docker容器无法连接到internet

Docker容器无法连接到internet,docker,dns,containers,digital-ocean,Docker,Dns,Containers,Digital Ocean,我有一个docker compose文件,可以启动几个容器,包括prometheus、alertmanager和grafana。这些容器无法连接到internet。我尝试了多种解决方案,但都没有效果。 我在一个小水滴上 我的docker撰写文件: 版本:“3” 服务: 普罗米修斯: 图片:prom/prometheus:v2.20.1 货柜名称:普罗米修斯 端口: - 9090:9090 卷数: -/data/prometheus:/prometheus -/普罗米修斯/:/etc/普罗米修斯/

我有一个docker compose文件,可以启动几个容器,包括prometheus、alertmanager和grafana。这些容器无法连接到internet。我尝试了多种解决方案,但都没有效果。 我在一个小水滴上

我的docker撰写文件:

版本:“3”
服务:
普罗米修斯:
图片:prom/prometheus:v2.20.1
货柜名称:普罗米修斯
端口:
- 9090:9090
卷数:
-/data/prometheus:/prometheus
-/普罗米修斯/:/etc/普罗米修斯/
重新启动:始终
alertmanager:
图像:prom/alertmanager:v0.21.0
容器名称:alertmanager
端口:
- 9093:9093
- 6783:6783
命令:
-“--log.level=debug”
-“--config.file=/etc/alertmanager/alertmanager_config.yml”
-“--storage.path=/alertmanager”
卷数:
-/alertmanager:/etc/alertmanager
-/data/alertmanager:/alertmanager
重新启动:始终
格拉法纳:
图片:格拉法纳/格拉法纳:7.1.5
集装箱名称:格拉法纳
端口:
- 3000:3000
卷数:
-/grafana.ini:/etc/grafana/grafana.ini
重新启动:始终
我试过很多东西

  • 已安装resolvconf并重新启动docker
    服务docker restart
  • 将主机上的/etc/resolv.conf更改为指向google或openDNS服务器
  • 在/etc/docker/daemon.json中添加DNS并重新启动docker
  • 已从更改容器中的DNS名称服务器

命令在容器内运行

/alertmanager $ wget http://curl.haxx.se/download/curl-7.36.0.tar.gz
wget: bad address 'curl.haxx.se'
/alertmanager $ nslookup google.com
;; connection timed out; no servers could be reached

/alertmanager $ 
发送警报时,alertmanager给出错误信息:

lookup api.<my website>.com on 172.24.100.50:53: read udp 172.18.0.5:44178->172.24.100.50:53: i/o timeout"
172.24.100.50:53上的查找api..com:读取udp 172.18.0.5:44178->172.24.100.50:53:i/o超时” 我尝试在主机网络上运行alertmanager,但仍然无法运行

docker run --net host -d prom/alertmanager:v0.21.0
docker exec -it <container_id> sh

/alertmanager $ cat /etc/resolv.conf 
nameserver 172.24.100.50
nameserver 8.8.8.8
/alertmanager $ ls
/alertmanager $ wget http://curl.haxx.se/download/curl-7.36.0.tar.gz
wget: bad address 'curl.haxx.se'
/alertmanager $ set vc
/alertmanager $ nslookup google.com
;; connection timed out; no servers could be reached
docker运行--net主机-d prom/alertmanager:v0.21.0
docker exec-it sh
/alertmanager$cat/etc/resolv.conf
名称服务器172.24.100.50
名称服务器8.8.8.8
/alertmanager$ls
/alertmanager$wgethttp://curl.haxx.se/download/curl-7.36.0.tar.gz
wget:错误地址'curl.haxx.se'
/alertmanager$set vc
/alertmanager$nslookup google.com
;连接超时;无法连接到任何服务器

我尝试了许多选项,但尚未找到解决方案。有谁能帮我解决这个问题吗?如果需要更多详细信息,请告诉我。

可能只是您的主机iptables规则被阻止了。

在您的主机上,仔细检查
iptables-L-v-n
的输出。或者暂时甚至尝试类似
iptables-P INPUT ACCEPT
的操作,然后在确认其工作后,使用
iptables-P INPUT DROP
将其还原。要访问外部世界而不是本地docker dns,请将输入替换为FORWARD。

I能够解决此问题。事实证明,在digitalocean的水滴防火墙中,出站流量被UDP阻止。只允许TCP流量。因此dns解析无法工作

DNS使用TCP进行区域传输,UDP进行常规(主要)或反向名称查询。UDP可用于交换小信息,而TCP必须用于交换大于512字节的信息。
DNS需要端口53进行名称解析,从docker日志可以看出端口53正在使用,但由于udp出站流量被阻止,DNS无法工作


但是,我确实试图通过设置dns_opt=use vc设置来强制docker使用TCP。这不起作用。UDP通信是允许的,现在可以工作了。

尝试用IP地址ping google以检查是否存在dns问题或连接问题NSLookup 172.217.163.46输出;连接超时;无法连接到任何服务器。我认为这是一个连接问题是:
docker run-it ubuntu/bin/bash
然后安装ping和
apt update&&apt install iputils ping
然后尝试通过ip和fqdn ping谷歌。如果问题仍然存在,你必须在你的局域网上搜索。我尝试了这个方法。iptables-P输入接受不起作用。然后我做了这个iptables-P输入丢弃。现在我不能t登录到droplet。(facepalm)哎呀。对不起,我假设iptables策略在您的计算机上是drop。您好,我不明白您是如何解决问题的。设置dns_opt=use vc是否有效?如果是,您在哪里设置的?如果不是,您是如何解决问题的。提前感谢您
/alertmanager $ wget http://curl.haxx.se/download/curl-7.36.0.tar.gz
wget: bad address 'curl.haxx.se'
/alertmanager $ nslookup google.com
;; connection timed out; no servers could be reached

/alertmanager $ 
lookup api.<my website>.com on 172.24.100.50:53: read udp 172.18.0.5:44178->172.24.100.50:53: i/o timeout"
docker run --net host -d prom/alertmanager:v0.21.0
docker exec -it <container_id> sh

/alertmanager $ cat /etc/resolv.conf 
nameserver 172.24.100.50
nameserver 8.8.8.8
/alertmanager $ ls
/alertmanager $ wget http://curl.haxx.se/download/curl-7.36.0.tar.gz
wget: bad address 'curl.haxx.se'
/alertmanager $ set vc
/alertmanager $ nslookup google.com
;; connection timed out; no servers could be reached