簡體   English   中英

Docker 容器無法連接到互聯網

[英]Docker containers unable to connect to internet

我有一個 docker 組合文件,它啟動了幾個容器,包括 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並重啟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 $ 

發送警報時,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 流量被允許,現在它正在工作。

我在 Ubuntu LTS 22 上遇到了同樣的問題。在我的情況下,問題是 docker 安裝不正確。 我使用 Snap 應用商店在 Ubuntu 上安裝了 docker,但它沒有用。

我卸載了 docker 然后再次安裝,這次使用存儲庫中推薦的方法。 Ubuntu 的 docker 安裝詳細信息可在此處找到:

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

僅供參考 - 由於 docker 安裝錯誤,我在 Amazon Linux 2 機器上遇到了完全相同的問題。

希望能幫助到你!

可能只是您的主機 iptables 規則被阻止。
在您的主機上,仔細檢查iptables -L -v -n的輸出。 或者暫時甚至嘗試像iptables -P INPUT ACCEPT這樣的東西,然后在確認它工作后,用iptables -P INPUT DROP恢復它。 對於訪問外部世界而不是本地 docker dns,將 INPUT 替換為 FORWARD。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM