Docker 个容器无法连接到互联网

Docker containers unable to connect to internet

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

我的docker-撰写文件:

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

我试过很多东西

{
    "dns" : ["172.24.100.50", "8.8.8.8"]
}
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

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

可能只是您的主机 iptables 规则被阻止了。
在您的主机上,仔细检查 iptables -L -v -n 的输出。或者暂时甚至尝试 iptables -P INPUT ACCEPT 之类的东西,然后在确认它有效后,用 iptables -P INPUT DROP 恢复它。对于访问外部世界而不是本地 docker dns,将 INPUT 替换为 FORWARD.

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