prometheus в докер контейнере не имеет доступа к локальной машине MacBook m1

Рейтинг: 0Ответов: 1Опубликовано: 13.01.2023

Локальная машина это MacBook m1. На localhost развернуто node.js приложение с эндпоинтом localhost:9650/metrics. Локально обращение по этому эндпоинту позволяет получить метрики prometheus. В докер контейнере развернут прометеус командой

docker run -p 9090:9090  -v xxx/prometheus/prometheus.yaml:/etc/prometheus/prometheus.yml prom/prometheus

файл конфигурации prometheus.yml

global:
  scrape_interval: 5s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

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

После запуска вебинтерфейс прометеуса доступен по адресу localhost:9090 Но таргет localhost:9650 из контейнера не доступен.

Что пробовал использовать:

  • соединять порт 9650 с портом 9651 в контейнере, указывая этот порт у таргета.
  • использовать --add-host host.docker.internal:host-gateway и указывать тагрет как host.docker.internal:9650
  • --net host
  • brew install chipmk/tap/docker-mac-net-connect

Ответы

▲ 1Принят

В принципе для доступа к хосту из докер контейнера на маке достаточно использовать host.docker.internal.

Это легко проверить. Достаточно запустить в одном терминале nc -l 10000, а в другом - docker run -ti alpine:latest /bin/sh -c "apk add curl; curl http://host.docker.internal:10000". Будет видно, что в неткат запрос приходит.

У вас же проблема в том, что если в nodejs использовать localhost в качестве имени хоста, то при этом приложение не слушает все сетевые интерфейсы, в частности не слушает интерфейс, который соединяет хост и докер.

Это тоже просто проверить используя простейшее приложение и выполнив команду для доступа к нему из докера:

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Так что, используйте 127.0.0.1 (или 0.0.0.0 чтоб слушать вообще все интерфейсы) при запуске приложение на nodejs.