【问题标题】:Docker containers unable to connect to internetDocker 容器无法连接到互联网
【发布时间】:2021-01-12 15:09:42
【问题描述】:

我有一个 docker compose 文件,它可以启动几个容器,包括 prometheus、alertmanager 和 grafana。这些容器无法连接到互联网。我尝试了多种解决方案,但无济于事。 我正在使用 digitalocean ubuntu 液滴。

我的 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并重启dockerservice 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

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 google 以检查是 DNS 问题还是连接问题
  • nslookup 172.217.163.46 输出 ;;连接超时;无法访问任何服务器。我认为这是一个连接问题
  • 试试这个:docker run -it ubuntu /bin/bash 然后用apt update &amp;&amp; apt install iputils-ping 安装 ping 然后尝试通过 ip 和 fqdn ping google。如果问题仍然存在,您必须在 LAN 上进行搜索。

标签: docker dns containers digital-ocean


【解决方案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。现在我无法登录到液滴。 (捂脸)
  • 糟糕。抱歉,我认为 iptables 策略已在您的计算机上删除。
【解决方案2】:

我能够解决这个问题。事实证明,在 droplet 的 digitalocean 防火墙中,UDP 的出站流量被阻止了。只允许 TCP 流量。因此 dns 解析不起作用。

DNS uses TCP for Zone transfer and UDP for name queries either regular (primary) or reverse. UDP can be used to exchange small information whereas TCP must be used to exchange information larger than 512 bytes. DNS 需要端口 53 进行名称解析,从 docker 日志中可以看到端口 53 正在被使用,但由于 udp 出站流量被阻止,dns 无法正常工作。

但是,我确实尝试通过设置 dns_opt=use-vc 设置来强制 docker 使用 TCP。这没有用。 UDP 流量被允许,现在它正在工作。

【讨论】:

  • 你好,我不明白你是如何解决这个问题的。设置 dns_opt=use-vc 是否有效?如果是的话,你在哪里设置的?如果没有,您是如何解决问题的。提前谢谢你
  • 你的回答不清楚,请详细描述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2018-01-21
  • 2016-02-20
  • 1970-01-01
  • 2018-07-20
相关资源
最近更新 更多