概要
Prometheusで、postgres-exporterのDockerコンテナからホストOS上のpostgresにログインしたかった。
コンテナからアクセスするとlocalhostからのアクセスにならないので接続拒否される。しかし、Postgresの接続許可設定をallにはしたくない。
そこで、コンテナのIPアドレスを固定し、postgresのpg_hba.confに接続許可設定をすることで通信を可能にした。
関連記事
docker-compose.yaml
postgres-exporterコンテナからホストOSのpostgresにパスワードログインさせる。
Docker networkを作り、各コンテナにipv4_addressを割り当てるころでIPアドレスを固定。
postgres-exporterコンテナで host.docker.internal:host-gateway
を渡し、コンテナからlocalhostへのアクセスを可能にする。
exporter_proxyコンテナは今回は関係ないが、他のコンテナのIPアドレスも固定する例として記載した。
詳しく知りたい方はこちらを参照。
[目次] Prometheusで監視システムを作る with Docker
version: '3'
services:
# ホストOSのpostgresに接続するコンテナ
postgres-exporter:
container_name: quay.io/prometheuscommunity/postgres-exporter
image: postgres-exporter
hostname: postgres-exporter
# ホストOSのlocalhostへ接続するための設定
extra_hosts:
- "host.docker.internal:host-gateway"
# postgresへの接続情報(後述)
env_file:
- ./postgres-exporter/.env
ports:
- 127.0.0.1:9187:9187
restart: always
# IPアドレスの固定化
networks:
sample-network:
ipv4_address: 192.168.200.2
exporter_proxy:
image: rrreeeyyy/exporter_proxy
container_name: exporter_proxy
volumes:
- ./exporter_proxy/config:/config
ports:
- 9099:9099
entrypoint: ['/exporter_proxy', '-config', '/config/config.yaml']
restart: always
networks:
sample-network:
ipv4_address: 192.168.200.3
# ネットワークを作成し、必要なIPアドレスの数だけサブネットを切る。
networks:
sample-network:
ipam:
driver: default
config:
# 16個
- subnet: 192.168.200.0/28
./postgres-exporter/.envの設定
postgres-exporterコンテナに設定した host.docker.internal
がlocalhostの意味になるので、ホスト名はこれにする。
DATA_SOURCE_NAME=postgresql://postgres_exporter:password@host.docker.internal:5432/postgres?sslmode=disable
pg_hba.conf
ホストOSのpg_hba.confに以下を追記する。
192.168.200.2(postgres_exporterコンテナ)から、postgres_exporterユーザーが、postgresデータベースに接続する設定。
# TYPE DATABASE USER ADDRESS METHOD
host postgres postgres_exporter 192.168.200.2/32 md5
postgresの再起動をして反映させる。これでアクセス可能となる。