Timur Fayzrakhmanov Timur Fayzrakhmanov - 25 days ago 8
Linux Question

Mongo daemon doesn't run by service mongod start

Recently I installed mongodb package by reading this page (http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/).
I use docker and ubuntu 14.04 image to deploy my server.

The problems start by first running the mongod service:

# service mongod start


I got the following:

Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mongod restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the stop(8) and then start(8) utilities,
e.g. stop mongod ; start mongod. The restart(8) utility is also available.


I've tried this:

# start mongod


But got no output.

Next I wanted to check the log, but there is no log!

ls /var/log/mongodb -a #empty


Ok, next I tried to start mongo shell:

# mongo
2014-08-12T17:42:44.431+0000 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2014-08-12T17:42:44.432+0000 Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed at src/mongo/shell/mongo.js:146
exception: connect failed


Ok, after googling I checked (applaied) all answers from Mongodb in linux server and https://wiki.archlinux.org/index.php/MongoDB (section Troubleshooting), but still get nothing.

The mongo shell works only when I run mongod directly in background:

mongod --verbose &

[DataFileSync] BackgroundJob starting: DataFileSync
shardKeyTest passed
isInRangeTest passed
shardObjTest passed
[initandlisten] MongoDB starting : pid=451 port=27017 dbpath=/data/db 64-bit host=a9d816faea4c
[initandlisten] db version v2.6.4
[initandlisten] git version: 3a830be0eb92d772aa855ebb711ac91d658ee910
[initandlisten] build info: Linux build7.nj1.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49
[initandlisten] allocator: tcmalloc
[initandlisten] options: { systemLog: { verbosity: 1 } }
[initandlisten] flushing directory /data/db
[initandlisten] journal dir=/data/db/journal
[initandlisten] recover : no journal files present, no recovery needed
[initandlisten] flushing directory /data/db/journal
[initandlisten] flushing directory /data/db/journal
[initandlisten] opening db: local
[initandlisten] enter repairDatabases (to check pdfile version #)
[initandlisten] local
[initandlisten] done repairDatabases
[initandlisten] opening db: admin
[initandlisten] query admin.system.roles planSummary: EOF ntoreturn:0 ntoskip:0 keyUpdates:0 numYields:0 locks(micros) W:119 r:106 nreturned:0 reslen:20 0ms
[ClientCursorMonitor] BackgroundJob starting: ClientCursorMonitor
[PeriodicTaskRunner] BackgroundJob starting: PeriodicTaskRunner
[TTLMonitor] BackgroundJob starting: TTLMonitor
[initandlisten] fd limit hard:1048576 soft:524288 max conn: 419430
[IndexRebuilder] BackgroundJob starting: IndexRebuilder
[IndexRebuilder] opening db: local
[initandlisten] create collection local.startup_log { size: 10485760, capped: true }
[initandlisten] command local.$cmd command: create { create: "startup_log", size: 10485760, capped: true } ntoreturn:1 keyUpdates:0 numYields:0 reslen:75 0ms
[initandlisten] insert local.startup_log ninserted:1 keyUpdates:0 numYields:0 0ms
[initandlisten] waiting for connections on port 27017
[IndexRebuilder] checking complete2014-08-12T17:48:29.837+0000 [DataFileSync] BackgroundJob starting: DataFileSync


Now I have the following:

/var/lib/mongodb (mongodb:mongodb) empty
/var/log/mongodb (mongodb:nogroup) empty
/data/db (mongo:nogroup) #useless

# mongod.conf
dbpath=/var/lib/mongodb
logpath=/var/log/mongodb/mongod.log
logappend=true
port = 27017
bind_ip = 0.0.0.0
...


What's going on here? I'm absolutely confused (

Answer

Docker containers typically does not have a full init system and interaction with upstart will not work inside a docker container. (In theory it is possible, but it defeats the purposes of having light weight stack)

What this implies is that you start a docker container, it would run a single command "/usr/bin/mongod"

Example of running mongodb inside a docker container: https://docs.docker.com/engine/examples/mongodb/

Also since you are running installation commands using an interactive docker container, your shell interpreter is the single command as far as docker is considered. Once in interactive session, you can run mongod in background (As you did) and start mongo client session.

Another way would be to run these instructions as part of Dockerfile. You can refer to mongodb example.

You might also want to consider some of the official mongo db images already published in docker hub:

https://registry.hub.docker.com/_/mongo/