我已经创建了这个docker合成文件,build +运行时不会出错
version: '3.7'
volumes:
grafana:
driver: local
prometheus-data:
driver: local
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
expose:
- 9090
volumes:
- prometheus-data:/prometheus
- ./prometheus:/etc/prometheus
restart: unless-stopped
command:
- "--config.file=/etc/prometheus/prometheus.yml"
grafana:
image: grafana/grafana-oss:latest
container_name: grafana
expose:
- 3000
volumes:
- grafana:/etc/grafana
restart: unless-stopped
nginx:
image: nginx
container_name: webserver
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /opt/certs/:/etc/nginx/certs/
- ./nginx/gw-web/:/usr/share/nginx/html:ro
- ./nginx/nginx_proxy.conf:/etc/nginx/conf.d/default.conf
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
command: [nginx-debug, '-g', 'daemon off;']
nginx具有以下反向代理配置:
server {
listen 80;
listen [::]:80;
server_name 10.23.225.72;
location /prometheus {
proxy_pass http://prometheus:9090;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;
proxy_read_timeout 3000;
}
location /grafana {
proxy_pass http://grafana:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;
proxy_read_timeout 3000;
}
location / {
root /usr/share/nginx/html;
}
}
根页面是可访问的,并按预期工作,但当我试图进入任何容器时,我只是得到一个'404:未找到“错误。
我也尝试过:
location /prometheus {
proxy_pass http://prometheus:9090/;
以及
location /prometheus/ {
proxy_pass http://prometheus:9090/;
以及
location /prometheus/ {
proxy_pass http://prometheus:9090;
我也尝试过在主机上将nginx作为服务运行,也没有成功,无论如何,我的项目需要我将其容器化。
我试着在Docker compose文件中添加另一个nginx容器:
nginx2:
image: nginx
container_name: webserver2
restart: unless-stopped
expose:
- 8080
和nginx配置:
location /webserver {
proxy_pass http://webserver2:8080/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_max_temp_file_size 0;
proxy_read_timeout 3000;
}
但这也会返回404。
是不是 Docker 的网络出了什么问题?
我从vscode检查网络配置json
{
"Name": "frp-6_default",
"Id": "940872d1cf151f8d1bb060edbf95c1bcfe29a544c7ea9561091b79a6c5588510",
"Created": "2023-01-25T11:52:01.520893117Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"4a2c2b6ca8aec52f801ad554c6b2c14abbe616078393f1e8ef40bd82ad12aa2a": {
"Name": "webserver2",
"EndpointID": "86228e6678d82a9d6735b5440618be7fc281127e6d610d281d9ffc5bcb4f256f",
"MacAddress": "02:42:ac:12:00:05",
"IPv4Address": "172.18.0.5/16",
"IPv6Address": ""
},
"9e13cbc4805fedf4db05b5de989f726bc110b97596b99b933a93e701641294a9": {
"Name": "webserver",
"EndpointID": "1bbcfe058373b225e5f53e8ff4d907d39bed578d9ac14d514ccf8da2d3c9628a",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
},
"b846cc374fa09e90589c982613224f31135660a17a5f4585b24d876ea2abd53c": {
"Name": "grafana",
"EndpointID": "3c0dac6d612a48dc067a5c208334af4f90c8c1d9122e263ca464186c1cf19f35",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"dbe81d7b88413f78a06ce94f86781242299a3f6eee0f96f607ebaf8fb0b17be6": {
"Name": "prometheus",
"EndpointID": "4792bbd19cc7b782ec522d148eef7dcb5e31b5e38d99e886ff728a3f519b4973",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "frp-6",
"com.docker.compose.version": "2.15.1"
}
}
以下几点对我来说很突出:
"Internal": false,
"Attachable": false,
这些会是罪魁祸首吗?如果是,我该如何修改它们呢?为了记录在案,我还尝试将容器的IP地址放在nginx配置中,如下所示
location /prometheus {
proxy_pass http://172.18.0.2:9090/;
还是不成功。
1条答案
按热度按时间kulphzqa1#
问题出在你的普罗米修斯配置上。因为你有:
当你访问
http://yourhost/prometheus/
时,请求被代理到http://prometheus:9090/prometheus/
,默认情况下prometheus不知道如何处理/prometheus
路径。您需要使用
--web.external-url
命令行选项告诉它它正在从非根路径提供服务。(我保留了prometheus映像中默认使用的所有命令行选项;这里唯一的新东西是
--web.external-url
选项。)进行此更改之前:
进行此更改后: