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网络
如果不想合并配置,可手动创建共享网络并让两个容器加入:
- 创建自定义网络:
docker network create opennms-shared-net
- 修改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
- 修改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
相关产品推荐
相关产品推荐

