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,提问作者Никита Козловский
相关产品推荐
相关产品推荐

