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

Graylog容器无法连接MongoDB容器 求助排查故障原因

Graylog无法连接MongoDB(MongoSocketOpenException超时)

问题现象

通过Docker Compose部署Graylog、MongoDB、Elasticsearch,所有容器运行正常,但Graylog日志报MongoSocketOpenException连接超时,无法连接MongoDB。尝试无密码Mongo镜像、调整连接配置后问题依旧。

Graylog错误日志

2023-04-13 13:07:00,602 INFO : org.mongodb.driver.client - MongoClient with metadata {"driver": {"name": "mongo-java-driver|legacy", "version": "4.7.1"}, "os": {"type": "Linux", "name": "Linux", "architecture": "amd64", "version": "5.19.0-38-generic"}, "platform": "Java/Eclipse Adoptium/17.0.6+10"} created with settings MongoClientSettings{readPreference=primary, writeConcern=WriteConcern{w=null, wTimeout=null ms, journal=null}, retryWrites=true, retryReads=true, readConcern=ReadConcern{level=null}, credential=MongoCredential{mechanism=null, userName='graylog', source='graylog', password=<hidden>, mechanismProperties=<hidden>}, streamFactoryFactory=null, commandListeners=[], codecRegistry=ProvidersCodecRegistry{codecProviders=[ValueCodecProvider{}, BsonValueCodecProvider{}, DBRefCodecProvider{}, DBObjectCodecProvider{}, DocumentCodecProvider{}, IterableCodecProvider{}, MapCodecProvider{}, GeoJsonCodecProvider{}, GridFSFileCodecProvider{}, Jsr310CodecProvider{}, JsonObjectCodecProvider{}, BsonCodecProvider{}, EnumCodecProvider{}, com.mongodb.Jep395RecordCodecProvider@772861aa]}, clusterSettings={hosts=[mongo:27017], srvServiceName=mongodb, mode=SINGLE, requiredClusterType=UNKNOWN, requiredReplicaSetName='null', serverSelector='null', clusterListeners='[]', serverSelectionTimeout='30000 ms', localThreshold='30000 ms'}, socketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=0, receiveBufferSize=0, sendBufferSize=0}, heartbeatSocketSettings=SocketSettings{connectTimeoutMS=10000, readTimeoutMS=10000, receiveBufferSize=0, sendBufferSize=0}, connectionPoolSettings=ConnectionPoolSettings{maxSize=1000, minSize=0, maxWaitTimeMS=120000, maxConnectionLifeTimeMS=0, maxConnectionIdleTimeMS=0, maintenanceInitialDelayMS=0, maintenanceFrequencyMS=60000, connectionPoolListeners=[], maxConnecting=2}, serverSettings=ServerSettings{heartbeatFrequencyMS=10000, minHeartbeatFrequencyMS=500, serverListeners='[]', serverMonitorListeners='[]'}, sslSettings=SslSettings{enabled=false, invalidHostNameAllowed=false, context=null}, applicationName='null', compressorList=[], uuidRepresentation=UNSPECIFIED, serverApi=null, autoEncryptionSettings=null, contextProvider=null}
2023-04-13T13:07:00.620457410Z 2023-04-13 13:07:00,620 INFO : org.mongodb.driver.cluster - Cluster description not yet available. Waiting for 30000 ms before timing out
2023-04-13T13:07:10.631796188Z 2023-04-13 13:07:10,618 INFO : org.mongodb.driver.cluster - Exception in monitor thread while connecting to server mongo:27017
2023-04-13T13:07:10.631837021Z com.mongodb.MongoSocketOpenException: Exception opening socket
2023-04-13T13:07:10.631847816Z  at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:70) ~[graylog.jar:?]
2023-04-13T13:07:10.631856020Z  at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:180) ~[graylog.jar:?]
2023-04-13T13:07:10.631863303Z  at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.lookupServerDescription(DefaultServerMonitor.java:193) [graylog.jar:?]
2023-04-13T13:07:10.631870507Z  at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:157) [graylog.jar:?]
2023-04-13T13:07:10.631891681Z  at java.lang.Thread.run(Unknown Source) [?:?]
2023-04-13T13:07:10.631900455Z Caused by: java.net.SocketTimeoutException: Connect timed out
2023-04-13T13:07:10.631907101Z  at sun.nio.ch.NioSocketImpl.timedFinishConnect(Unknown Source) ~[?:?]
2023-04-13T13:07:10.631913863Z  at sun.nio.ch.NioSocketImpl.connect(Unknown Source) ~[?:?]
2023-04-13T13:07:10.631920435Z  at java.net.SocksSocketImpl.connect(Unknown Source) ~[?:?]
2023-04-13T13:07:10.631927792Z  at java.net.Socket.connect(Unknown Source) ~[?:?]
2023-04-13T13:07:10.631934758Z  at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:107) ~[graylog.jar:?]
2023-04-13T13:07:10.631942570Z  at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:79) ~[graylog.jar:?]
2023-04-13T13:07:10.631950098Z  at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[graylog.jar:?]
2023-04-13T13:07:10.631957216Z  ... 4 more
2023-04-13T13:07:30.623275709Z 2023-04-13 13:07:30,622 INFO : org.graylog2.bootstrap.preflight.MongoDBPreflightCheck - MongoDB is not available. Retry #1

Docker Compose配置

version: "3.9"

#Docker Networks
networks:
  network:
    driver: bridge

volumes:
  es_data:
  mongo_data:
  graylog_data:
  graylog_journal:

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.7.0
    container_name: elasticsearch_1
    environment:
      - http.host=0.0.0.0
      - transport.host=localhost
      - network.host=0.0.0.0
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    deploy:
      resources:
        limits:
          memory: 1g
    networks:
      - network
    volumes:
      - es_data:/usr/share/elasticsearch/data

  mongo:
    image: mongo:latest
    container_name: mongo_1
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: secret
    ports:
      - "27017:27017"
    expose:
      - 27017
    networks:
      - network
    volumes:
      - ./init/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js
      - mongo_data:/data/db

  graylog:
    image: graylog/graylog:5.0.6
    container_name: graylog_1
    environment:
      - GRAYLOG_PASSWORD_SECRET=passwordforgraylog
      - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
      - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
      - GRAYLOG_ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - GRAYLOG_MONGODB_URI=mongodb://graylog:secret@mongo:27017/graylog
    entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh
    volumes:
      - graylog_data:/usr/share/graylog/data/data
      - graylog_journal:/usr/share/graylog/data/journal
    links:
      - mongo:mongo
      - elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    ports:
      - "9000:9000"
      - "1514:1514"
      - "1514:1514/udp"
      - "12201:12201"
      - "12201:12201/udp"
      - "5555:5555"
    restart: always
    networks:
      - network

MongoDB初始化脚本(init-mongo.js)

graylog = db.getSiblingDB('graylog');
graylog.createUser(
    {
        user: "graylog",
        pwd: "secret",
        roles: [
            { role: "dbOwner", db: "graylog" }
        ]
    }
);

排查与解决方案

1. 确保MongoDB服务就绪后再启动Graylog

depends_on仅保证容器启动顺序,不确保服务完全就绪。修改Graylog的entrypoint,同时等待MongoDB:

entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 -- wait-for-it mongo:27017 -- /docker-entrypoint.sh

或者添加健康检查实现更可靠的依赖:
给MongoDB服务添加健康检查:

mongo:
  # 保留原有配置
  healthcheck:
    test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"]
    interval: 10s
    timeout: 5s
    retries: 5

修改Graylog的depends_on:

depends_on:
  mongo:
    condition: service_healthy
  elasticsearch:
    condition: service_started

2. 验证MongoDB用户与连接字符串

进入MongoDB容器,确认graylog用户存在且权限正确:

docker exec -it mongo_1 mongosh -u root -p secret
use graylog
db.getUser("graylog")

确保GRAYLOG_MONGODB_URI中的用户名、密码、数据库名与初始化脚本完全一致。

3. 检查容器网络连通性

在Graylog容器内测试MongoDB的网络可达性:

docker exec -it graylog_1 ping mongo
docker exec -it graylog_1 nc -zv mongo 27017

如果不通,检查Docker网络配置:

docker network inspect network

确认三个容器都加入了同一网络,且mongo主机名可解析。

4. 清理旧数据卷

若之前的MongoDB数据卷存在残留配置,可能导致认证异常:

docker-compose down -v
docker-compose up -d

5. 调整MongoDB绑定地址

确保MongoDB监听所有网络接口,在mongo服务的environment中添加:

MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: secret
MONGO_URI: mongodb://0.0.0.0:27017

内容的提问来源于stack exchange,提问作者Никита Козловский

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:35:19