Docker 容器无法连接到互联网

the*_*xed 7 dns containers docker digital-ocean

我有一个 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
Run Code Online (Sandbox Code Playgroud)

我尝试了多种方法

  • 安装 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"]
}
Run Code Online (Sandbox Code Playgroud)
  • 将容器内的 DNS 名称服务器从
nameserver 127.0.0.11
options ndots:0
Run Code Online (Sandbox Code Playgroud)

nameserver 127.0.0.11
nameserver 172.24.100.50
nameserver 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

命令在容器内运行

/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 $ 
Run Code Online (Sandbox Code Playgroud)

发送警报时,警报管理器给出错误:

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"
Run Code Online (Sandbox Code Playgroud)

我试图在主机网络上运行警报管理器,但它仍然不起作用

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
Run Code Online (Sandbox Code Playgroud)

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

the*_*xed 1

我能够解决这个问题。事实证明,在 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 是否有效?如果是的话你在哪里设置的?如果没有,您具体是如何解决问题的。先感谢您 (2认同)