Mongodb Docker swarm

Rajat Talwar
Aug 9, 2017 · 3 min read

Initiate master

sudo docker swarm init 

join workers

sudo docker swarm join — token <token>

after that list your nodes

sudo docker node ls

Inspect your nodes

sudo docker node inspect <node_id>

Assign labels to ur nodes

docker node update --label-add mongo.replica=1 $(docker node ls -q -f name=manager1)

Create volumes

Volumes should be created on individual nodes by logging into them

manager1$ sudo docker volume create — name mongodata1
manager1$ sudo docker volume create — name mongoconfig1
worker1$ sudo docker volume create — name mongodata2
worker1$ sudo docker volume create — name mongoconfig2
worker2$ sudo docker volume create — name mongodata3
worker2$ sudo docker volume create — name mongoconfig3

Create mongo service

docker service create --replicas 1 --network mongo --mount type=volume,source=mongodata1,target=/data/db --mount type=volume,source=mongoconfig1,target=/data/configdb --constraint 'node.labels.mongo.replica == 1' --name mongo1 mongo:3.4 mongod --replSet mysetdocker service create --replicas 1 --network mongo --mount type=volume,source=mongodata2,target=/data/db --mount type=volume,source=mongoconfig2,target=/data/configdb --constraint 'node.labels.mongo.replica == 2' --name mongo2 mongo:3.4 mongod --replSet "myset"docker service create --replicas 1 --network mongo --mount type=volume,source=mongodata3,target=/data/db --mount type=volume,source=mongoconfig3,target=/data/configdb --constraint 'node.labels.mongo.replica == 3' --name mongo3 mongo:3.4 mongod --replSet "myset"

Initiate the replica set

docker@manager1:~$ sudo docker exec -it $(sudo docker ps -qf label=com.docker.swarm.service.name=mongo1) mongo --eval 'rs.initiate({ _id: "myset", members: [{ _id: 1, host: "mongo1:27017" }, { _id: 2, host: "mongo2:27017" }, { _id: 3, host: "mongo3:27017" }], settings: { getLastErrorDefaults: { w: "majority", wtimeout: 30000 }}})'
MongoDB shell version: 3.2.10
connecting to: test
{ "ok" : 1 }
docker@manager1:~$ docker exec -it $(docker ps -qf label=com.docker.swarm.service.name=mongo1) mongo --eval 'rs.status()'
MongoDB shell version: 3.2.10
connecting to: test
{
"set" : "example",
"date" : ISODate("2016-11-07T03:36:44.510Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 1,
"name" : "mongo1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 777,
"optime" : {
"ts" : Timestamp(1478489792, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-11-07T03:36:32Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1478489792, 1),
"electionDate" : ISODate("2016-11-07T03:36:32Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "mongo2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 22,
"optime" : {
"ts" : Timestamp(1478489792, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-11-07T03:36:32Z"),
"lastHeartbeat" : ISODate("2016-11-07T03:36:44.448Z"),
"lastHeartbeatRecv" : ISODate("2016-11-07T03:36:43.872Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "mongo1:27017",
"configVersion" : 1
},
{
"_id" : 3,
"name" : "mongo3:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 22,
"optime" : {
"ts" : Timestamp(1478489792, 2),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2016-11-07T03:36:32Z"),
"lastHeartbeat" : ISODate("2016-11-07T03:36:44.448Z"),
"lastHeartbeatRecv" : ISODate("2016-11-07T03:36:43.874Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "mongo1:27017",
"configVersion" : 1
}
],
"ok" : 1
}
docker@manager1:~$ docker exec -it $(docker ps -qf label=com.docker.swarm.service.name=mongo1) mongo --eval 'rs.config()'
MongoDB shell version: 3.2.10
connecting to: test
{
"_id" : "example",
"version" : 1,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 1,
"host" : "mongo1:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "mongo2:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "mongo3:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : "majority",
"wtimeout" : 30000
},
"replicaSetId" : ObjectId("581ff6b54865b4277baf414d")
}
}

Rajat Talwar

Written by

iOS and javascript dev, entrepreneur,health freak.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade