Docker容器无法连接互联网。

9

我有一个 Docker Compose 文件,启动几个容器,包括 Prometheus、Alertmanager 和 Grafana。这些容器无法连接到互联网。我尝试了多种解决方案,但都没有成功。

我使用的是 DigitalOcean Ubuntu Droplet,以下是我的 Docker Compose 文件:

version: '3'

services:

    prometheus:
      image: prom/prometheus:v2.20.1
      container_name: prometheus
      ports:
        - 9090:9090
      volumes:
        - /data/prometheus:/prometheus
        - ./prometheus/:/etc/prometheus/
      restart: always
    
    alertmanager:
      image: prom/alertmanager:v0.21.0
      container_name: alertmanager
      ports:
        - 9093:9093
        - 6783:6783
      command:
        - '--log.level=debug'
        - '--config.file=/etc/alertmanager/alertmanager_config.yml'
        - '--storage.path=/alertmanager'
      volumes:
        - ./alertmanager:/etc/alertmanager
        - /data/alertmanager:/alertmanager
      restart: always


    grafana:
      image: grafana/grafana:7.1.5
      container_name: grafana
      ports:
        - 3000:3000
      volumes:
        - ./grafana.ini:/etc/grafana/grafana.ini
      restart: always

我尝试了多种方法

  • 安装了resolvconf并重新启动docker:service docker restart
  • 更改宿主机上的/etc/resolv.conf指向Google或OpenDNS服务器。
  • 在/etc/docker/daemon.json中添加了DNS并重新启动了Docker。
{
    "dns" : ["172.24.100.50", "8.8.8.8"]
}
  • 已更改容器内的DNS域名服务器:
nameserver 127.0.0.11
options ndots:0

to

nameserver 127.0.0.11
nameserver 172.24.100.50
nameserver 8.8.8.8

容器内运行的命令

/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"

我尝试在主机网络上运行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

我尝试了许多选项,但还没有找到解决方案。有人能帮我吗?如果需要更多细节,请告诉我。


尝试使用IP地址ping谷歌,以检查是否存在DNS问题或连接问题。 - Max
nslookup 172.217.163.46 输出: ;; 连接超时;无法到达任何服务器。我认为这是一个连接问题。 - thecodeboxed
尝试运行以下命令:docker run -it ubuntu /bin/bash,然后使用apt update && apt install iputils-ping安装ping工具,接着尝试通过IP地址和完全限定域名(FQDN)来ping谷歌。如果问题仍然存在,则需要在您的局域网中进行搜索。 - Max
3个回答

1
我已经解决了这个问题。原来在droplet的digitalocean防火墙中,UDP的出站流量被阻止了,只允许TCP流量通过。因此DNS解析无法工作。
DNS使用TCP进行区域传输和UDP进行名称查询(正向或反向)。UDP可用于交换小型信息,而必须使用TCP来交换大于512字节的信息。DNS需要端口53进行名称解析,从docker日志中可以看到端口53正在使用,但由于UDP出站流量被阻止,因此DNS无法工作。
然而,我尝试强制docker使用TCP,设置dns_opt=use-vc选项,但这没有起作用。现在允许UDP流量通过,所以它正在工作。

2
你好,我不太明白你是如何解决这个问题的。设置dns_opt=use-vc有用吗?如果有用,你在哪里进行了设置?如果没有用,你是如何解决这个问题的?谢谢。 - Sunshine
1
你的回答不够清晰,请详细描述。 - Harun-Ur-Rashid

0

我在Ubuntu LTS 22上遇到了同样的问题。我的情况是docker安装不正确。我使用Snap应用商店在Ubuntu上安装了docker,但它无法正常工作。

我卸载了docker,然后再次安装,这次使用存储库中推荐的方法。Ubuntu的docker安装详细信息可以在此处找到:

https://docs.docker.com/engine/install/ubuntu

顺便说一下 - 我在Amazon Linux 2机器上遇到了完全相同的问题,原因是docker安装有问题。

希望能帮到你!


-1

可能是您的主机iptables规则被阻止了。
在您的主机上,仔细检查iptables -L -v -n的输出。或者暂时尝试像iptables -P INPUT ACCEPT这样的命令,然后在确认它可以工作后,使用iptables -P INPUT DROP来恢复。对于访问外部世界而不是本地docker dns,请将INPUT替换为FORWARD。


我尝试了这个命令:iptables -P INPUT ACCEPT,但是没有起作用。然后我尝试了这个命令:iptables -P INPUT DROP。现在我无法登录到 droplet 了。(捂脸) - thecodeboxed
抱歉,我假设您的机器上iptables策略是拒绝。 - smekkley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接