Docker 容器无法连接到互联网

标签 docker dns containers 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
我尝试了多种方法
  • 安装 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
    
    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 $ 
    
    发送警报时,警报管理器给出错误:
    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
    
    我尝试了很多选择,但还没有找到解决方案。谁能帮我解决这个问题?如果需要更多详细信息,请告诉我。

    最佳答案

    我能够解决这个问题。事实证明,在用于 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 流量被允许,现在它正在工作。

    关于Docker 容器无法连接到互联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64078387/

    相关文章:

    azure - 如何使用 gitlab-ci 中的托管标识进行身份验证,将 docker 容器从 gitlab 注册表推送到 Azure Web 服务?

    azure - kubernetes集群可以共享windows和linux节点吗?

    包含容器的对象的 C++ 布局

    docker - Docker-客户端版本比服务器更新

    docker - Kubernetes:未设置图像 “XXX.dkr.ecr.eu-west-1.amazonaws.com/msg/my_image:v1.0”的ID或大小

    SSL 与 Heroku 托管和 Gandi 域

    nginx - SSL 证书在 Nginx 代理管理器 (Cloudflare DNS) 上不起作用

    linux - 在节点中访问 Kubernetes DNS 服务器

    c++ - 为什么c++11标准库中没有std::clear

    docker - Aerospike Hearbeat 调用卡在 TIME_WAIT