J'ai une application back-end en nœud qui nécessite MongoDB avec un ensemble de répliques. J'ai créé une image docker pour mon application qui exécute simplement l'application ; j'ai également créé une image docker pour mon application. docker-compose
qui exécute l'instance MongoDB et configure son ensemble de répliques. Voici mon docker-compose
fichier :
version: '2'
services:
mongod1:
image: mongo
command: mongod --replSet ${RS} --oplogSize 16 --smallfiles --noprealloc --bind_ip 0.0.0.0
ports:
- '27017:27017'
mongod2:
image: mongo
command: mongod --replSet ${RS} --oplogSize 16 --smallfiles --noprealloc --bind_ip 0.0.0.0
ports:
- '27018:27017'
mongod3:
image: mongo
command: mongod --replSet ${RS} --oplogSize 16 --smallfiles --noprealloc --bind_ip 0.0.0.0
ports:
- '27019:27017'
mongo-config:
image: mongo
depends_on:
- mongod1
- mongod2
- mongod3
volumes:
- ./scripts:/scripts
environment:
- MONGO1=mongod1
- MONGO2=mongod2
- MONGO3=mongod3
- USER=machine
- PWD=abc123456
- RS=rs0
entrypoint: ['/scripts/setup.sh']
et dans le point d'entrée, j'ai le bash script comme ci-dessous :
#!/bin/bash
mongodb1=$(getent hosts ${MONGO1} | awk '{ print $1 }')
mongodb2=$(getent hosts ${MONGO2} | awk '{ print $1 }')
mongodb3=$(getent hosts ${MONGO3} | awk '{ print $1 }')
port=${PORT:-27017}
echo "Waiting for startup.."
until mongo --host ${mongodb1}:${port} --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
printf '.'
sleep 1
done
echo "Started.."
echo "setup.sh; time now: $(date +"%T")"
mongo --host ${mongodb1}:${port} <<EOF
use admin
db.createUser(
{
user: ${USER},
pwd: #{pwd},
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
EOF
mongo --host ${mongodb1}:${port} <<EOF
var cfg = {
"_id": "${RS}",
"members": [
{
"_id": 0,
"host": "${mongodb1}:${port}"
},
{
"_id": 1,
"host": "${mongodb2}:${port}"
},
{
"_id": 2,
"host": "${mongodb3}:${port}"
}
]
};
rs.initiate(cfg, { force: true });
rs.config();
EOF
mongo --host ${mongodb2}:${port} <<EOF
db.setSlaveOk()
EOF
mongo --host ${mongodb3}:${port} <<EOF
db.setSlaveOk()
EOF
Maintenant, dans mon environnement, je peux me connecter à mongodb en localhost:27017
mais l'application ne peut pas se connecter à 0.0.0.0:27017
. Comment puis-je résoudre ce problème ? Dois-je utiliser les réseaux docker ?