You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenNMS Docker初始化时无法连接PostgreSQL数据库求助

解决OpenNMS Docker容器无法连接PostgreSQL的问题

问题根源

你用两个独立的docker-compose.yml分别启动PostgreSQL和OpenNMS容器,Docker会为每个compose项目创建独立的默认网络。OpenNMS容器内配置的POSTGRES_HOST: '127.0.0.1'指向容器自身,而非宿主机或PostgreSQL容器,导致连接被拒绝。

解决方案

方案一:合并到同一个Docker Compose配置(推荐)

将PostgreSQL和OpenNMS服务放在同一个docker-compose.yml中,Docker会自动创建共享网络,服务间可通过容器名直接访问:

version: '3'

volumes:
  data-opennms: {}
  data-config: {}
  data-postgres: {}

services:
  database:
    image: postgres:latest
    container_name: database
    environment:
      TZ: 'Asia/Shanghai'
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'MY.POSTGRES.PASSWORD'
    volumes:
      - 'data-postgres:/var/lib/postgresql/data'
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U postgres" ]
      interval: 10s
      timeout: 3s
      retries: 3
    ports:
      - '5432:5432/tcp'

  horizon:
    image: opennms/horizon:latest
    container_name: horizon
    environment:
      TZ: 'Asia/Shanghai'
      POSTGRES_HOST: 'database'  # 用PostgreSQL容器名替代127.0.0.1
      POSTGRES_PORT: 5432
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'MY.POSTGRES.PASSWORD'
      OPENNMS_DBNAME: 'opennms-core-db'
      OPENNMS_DBUSER: 'opennms'
      OPENNMS_DBPASS: 'MY.OPENNMS-DB.PASSWORD'
    volumes:
      - data-opennms:/opennms-data
      - data-config:/opt/opennms/etc
    command: ["-s"]
    ports:
      - '8980:8980/tcp'
      - '8101:8101/tcp'
    healthcheck:
      test: [ 'CMD', 'curl', '-f', '-I', 'http://localhost:8980/opennms/login.jsp' ]
      interval: 1m
      timeout: 5s
      retries: 3
    depends_on:
      - database  # 确保PostgreSQL启动后再启动OpenNMS

方案二:手动加入自定义Docker网络

如果不想合并配置,可手动创建共享网络并让两个容器加入:

  1. 创建自定义网络:
docker network create opennms-shared-net
  1. 修改PostgreSQL的docker-compose.yml,添加网络配置:
version: '3'

volumes:
  data-postgres: {}

services:
  database:
    image: postgres:latest
    container_name: database
    environment:
      TZ: 'Asia/Shanghai'
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'MY.POSTGRES.PASSWORD'
    volumes:
      - 'data-postgres:/var/lib/postgresql/data'
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U postgres" ]
      interval: 10s
      timeout: 3s
      retries: 3
    ports:
      - '5432:5432/tcp'
    networks:
      - opennms-shared-net  # 加入自定义网络

networks:
  opennms-shared-net:
    external: true
  1. 修改OpenNMS的docker-compose.yml,更新数据库地址并加入网络:
version: '3'

volumes:
  data-opennms: {}
  data-config: {}

services:
  horizon:
    image: opennms/horizon:latest
    container_name: horizon
    environment:
      TZ: 'Asia/Shanghai'
      POSTGRES_HOST: 'database'  # 用PostgreSQL容器名替代127.0.0.1
      POSTGRES_PORT: 5432
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'MY.POSTGRES.PASSWORD'
      OPENNMS_DBNAME: 'opennms-core-db'
      OPENNMS_DBUSER: 'opennms'
      OPENNMS_DBPASS: 'MY.OPENNMS-DB.PASSWORD'
    volumes:
      - data-opennms:/opennms-data
      - data-config:/opt/opennms/etc
    command: ["-s"]
    ports:
      - '8980:8980/tcp'
      - '8101:8101/tcp'
    healthcheck:
      test: [ 'CMD', 'curl', '-f', '-I', 'http://localhost:8980/opennms/login.jsp' ]
      interval: 1m
      timeout: 5s
      retries: 3
    networks:
      - opennms-shared-net  # 加入自定义网络

networks:
  opennms-shared-net:
    external: true

验证步骤

重启两个容器后,进入OpenNMS容器测试数据库连接:

docker exec -it horizon psql -h database -U postgres

输入PostgreSQL密码后,若能进入数据库命令行,说明连接正常,重新执行OpenNMS初始化流程即可。

内容的提问来源于stack exchange,提问作者Marcus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 02:35:55