Прометей - Джанго: соединение отказано - PullRequest
1 голос
/ 01 июля 2019

(Я впервые использую Prometheus, и я пока не очень хорошо разбираюсь в Docker / Django)

Я запускаю проект Django в контейнере Docker, а Prometheus с docker run -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

В моем docker-compose.yml у меня есть:

...
nginx-proxy:
        build:
            context: ./dockerfiles/nginx-proxy/
            args:
                - DOMAIN_NAME=local.my.url
        ports:
            - "80:80"
        depends_on:
            - api
            - ...
        volumes:
            - ./volumes/nginx-front/log/:/var/log/nginx

api:
        build:
            context: ./dockerfiles/api/
            args:
                - GUNICORN_WORKERS=20
        restart: always
        volumes:
            - ./volumes/api/src/:/usr/src/app
...

В /tmp/prometheus.yml У меня есть:

global:
  scrape_interval:     15s
  evaluation_interval: 15s
  external_labels:
      monitor: 'my-project-monitor'

rule_files:

scrape_configs:
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'api'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ['api.local.my.url']

Работа prometheus, кажется, работает нормально (но это не такне интересующие меня метрики), api выдает следующую ошибку из пользовательского интерфейса Promotheus: Get http://api.local.my.url:80/metrics: dial tcp 127.0.0.1:80: connect: connection refused

Однако, когда я набираю http://api.local.my.url:80/metrics в своем браузере, я вижу информациюправильно.Я пытался заменить URL своим IP-адресом 10.25.2.192, но это не меняет результат.

Я не понимаю, почему он не может подключиться.

1 Ответ

1 голос
/ 01 июля 2019

Это потому, что ваш контейнер Prometheus находится в другой сети, и для него «localhost» означает другое. Он преднамеренно не имеет доступа к сети хоста (по умолчанию).

Вы можете проверить это, запустив sudo docker network ls во время работы обоих ваших контейнеров.

Что вы можете сделать, это убедиться, что два контейнера работают в одной сети.

В вашей команде docker это будет означать добавление --network [name], а для docker-compose это будет означать добавление атрибута network:. Это можно сделать для всех сервисов в файле docker-compose, если вы добавите что-то вроде этого внизу вашего файла:

networks:
  default:
    external:
      name: [name]

Источник: https://docs.docker.com/compose/networking/#use-a-pre-existing-network

Чтобы создать сеть вне docker-compose, вы можете использовать

sudo docker network create -d bridge [name]
...