Docker 网络配置说明
网络隔离问题
当使用 Docker Compose 启动 Prometheus 和 Grafana 时,它们会创建一个独立的 bridge 网络(默认名称:<project>_monitoring),使用 172.18.0.0/16 网段。
而普通 Docker 容器默认连接到 bridge 网络,使用 172.17.0.0/16 网段。
这导致:
- Prometheus/Grafana 在
172.18.0.x网段 - 普通容器在
172.17.0.x网段 - 它们无法直接通信
解决方案
方案 1: 让普通容器连接到 monitoring 网络(推荐)
如果 Frontend 服务也在 Docker 容器中运行,可以让它连接到同一个网络:
# 查看 monitoring 网络名称
docker network ls | grep monitoring
# 将 Frontend 容器连接到 monitoring 网络
docker network connect docker_monitoring <frontend-container-name>
或者在启动 Frontend 容器时指定网络:
docker run --network docker_monitoring <frontend-image>
方案 2: 使用 host.docker.internal(适用于宿主机上的服务)
如果 Frontend 服务在宿主机上运行,Prometheus 配置中已经使用了 host.docker.internal:
- targets: ['host.docker.internal:8888']
这允许容器访问宿主机上的服务。
方案 3: 使用默认 bridge 网络
修改 docker-compose.yml,让 Prometheus 和 Grafana 使用默认的 bridge 网络:
networks:
monitoring:
external: true
name: bridge
注意: 不推荐此方案,因为会失去网络隔离的优势。
方案 4: 使用 host 网络模式
修改 docker-compose.yml,使用 host 网络:
services:
prometheus:
network_mode: host
# 移除 networks 配置
注意: 此方案会失去端口映射,直接使用主机网络。
方案 5: 配置网络别名
在 docker-compose.yml 中为服务配置别名,然后使用别名访问:
services:
prometheus:
networks:
monitoring:
aliases:
- prometheus
验证网络连接
检查容器网络
# 查看容器 IP 地址
docker inspect <container-name> | grep IPAddress
# 查看容器所属网络
docker inspect <container-name> | grep -A 10 Networks
测试网络连通性
# 在 Prometheus 容器中测试连接
docker exec prometheus ping -c 3 <target-ip>
# 测试 HTTP 连接
docker exec prometheus wget -O- http://<target-ip>:<port>/metrics
当前配置说明
当前的 prometheus.yml 配置使用 host.docker.internal,这意味着:
- ✅ 如果 Frontend 在宿主机上运行:可以直接访问
- ❌ 如果 Frontend 在 Docker 容器中(172.17.0.x):无法访问
如果 Frontend 在 Docker 容器中,需要:
- 将 Frontend 容器连接到
docker_monitoring网络 - 修改
prometheus.yml中的 targets 为容器名或 IP
推荐配置
Frontend 在宿主机上
保持当前配置,使用 host.docker.internal:8888
Frontend 在 Docker 容器中
-
将 Frontend 连接到 monitoring 网络:
docker network connect docker_monitoring <frontend-container> -
修改
prometheus.yml:- targets: ['<frontend-container-name>:8888'] # 或使用服务发现 -
或者使用 Docker Compose 的 service name(如果 Frontend 也在 compose 中)