I want to use Dockerizing MongoDB and store data in local volume.
But .. failed ...
It has mongo:latest
images
kerydeMacBook-Pro:~ hu$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE mongo latest b11eedbc330f 2 weeks ago 317.4 MB ubuntu latest 6cc0fc2a5ee3 3 weeks ago 187.9 MB
I want to store the mono data in ~/data
. so ---
kerydeMacBook-Pro:~ hu$ docker run -p 27017:27017 -v ~/data:/data/db --name mongo -d mongo f570073fa3104a54a54f39dbbd900a7c9f74938e2e0f3f731ec8a3140a418c43
But ... it not work...
docker ps -- no daemon mongo
kerydeMacBook-Pro:~ hu$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
try to run "mongo" --failed
kerydeMacBook-Pro:~ hu$ docker exec -it f57 bash Error response from daemon: Container f57 is not running
docker inspect mongo
kerydeMacBook-Pro:~ hu$ docker inspect mongo [ { "Id": "f570073fa3104a54a54f39dbbd900a7c9f74938e2e0f3f731ec8a3140a418c43", "Created": "2016-02-15T02:19:01.617824401Z", "Path": "/entrypoint.sh", "Args": [ "mongod" ], "State": { "Status": "exited", "Running": false, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 0, "ExitCode": 100, "Error": "", "StartedAt": "2016-02-15T02:19:01.74102535Z", "FinishedAt": "2016-02-15T02:19:01.806376434Z" }, "Mounts": [ { "Source": "/Users/hushuming/data", "Destination": "/data/db", "Mode": "", "RW": true }, { "Name": "365e687c4e42a510878179962bea3c7699b020c575812c6af5a1718eeaf7b57a", "Source": "/mnt/sda1/var/lib/docker/volumes/365e687c4e42a510878179962bea3c7699b020c575812c6af5a1718eeaf7b57a/_data", "Destination": "/data/configdb", "Driver": "local", "Mode": "", "RW": true } ],
If I do not set data volume, mongo image can work!
But, when setting data volume, it can't. Who can help me?
Docker-managed volumes All managed volumes are stored in the same Docker directory. Usage is fairly easy, for Mongo it's only a matter of providing Mongo's data location in a container which is /data/db .
In Dockerfile you can specify only the destination of a volume inside a container. e.g. /usr/src/app . When you run a container, e.g. docker run --volume=/opt:/usr/src/app my_image , you may but do not have to specify its mounting point ( /opt ) on the host machine.
If you want to persist the data on your local machine, you can mount a volume using the -v argument. If your application is running inside a container itself, you can run MongoDB as part of the same Docker network as your application using --network .
To mount a data volume to a container add the --mount flag to the docker run command. It adds the volume to the specified container, where it stores the data produced inside the virtual environment. Replace [path_in_container] with the path where you want to place the data volume in the container.
Try and check docker logs to see what was going on when the container stopped and go in "Existed" mode.
See also if specifying the full path for the volume would help:
docker run -p 27017:27017 -v /home/<user>/data:/data/db ...
The OP adds:
docker logs mongo exception in initAndListen: 98 Unable to create/open lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance already running? terminating 2016-02-15T06:19:17.638+0000 I CONTROL [initandlisten] dbexit: rc: 100
An errno:13 is what issue 30 is about.
This comment adds:
It's a file ownership/permission issue (not related to this docker image), either using boot2docker with VB or a vagrant box with VB.
Nevertheless, I managed to hack the ownership, remounting the /Users shared volume inside boot2docker to uid 999 and gid 999 (which are what mongo docker image uses) and got it to start:
$ boot2docker ssh $ sudo umount /Users $ sudo mount -t vboxsf -o uid=999,gid=999 Users /Users
But... mongod crashes due to filesystem type not being supported (mmap not working on vboxsf)
So the actual solution would be to try a DVC: Data Volume Container, because right now the mongodb doc mentions:
MongoDB requires a filesystem that supports
fsync()
on directories.
For example, HGFS and Virtual Box’s shared folders do not support this operation.
So:
the mounting to OSX will not work for MongoDB because of the way that virtualbox shared folders work.
For a DVC (Data Volume Container), try docker volume create
:
docker volume create mongodbdata
Then use it as:
docker run -p 27017:27017 -v mongodbdata:/data/db ...
And see if that works better.
As I mention in the comments:
A docker volume inspect mongodbdata
(see docker volume inspect
) will give you its path (that you can then backup if you need)
As of summer 2017, a local volume is not considered best practice.
Per Docker Docs:
Volumes are the preferred mechanism for persisting data generated by and used by Docker containers.
docker volume create mongodbdata docker run -p 27017:27017 -v mongodbdata:/data/db mongo
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With