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
我试过很多东西
- 已安装 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"
我尝试 运行 主机网络上的 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 流量已被允许,现在它正在运行。
我有一个 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
我试过很多东西
- 已安装 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"
我尝试 运行 主机网络上的 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 流量已被允许,现在它正在运行。