Je dois configurer un jeu de répliques Mongo avec docker-compose. Pour le jeu de répliques, les conteneurs doivent se connaître.
J'ai essayé en docker-compose.yml
dbreplicasetpart1:
image: mongo:2.6.8
expose:
- '27018'
links:
- replicasetpart2
- replicasetpart3
cap_add:
- NET_ADMIN
dbreplicasetpart2:
image: mongo:2.6.8
links:
- replicasetpart1
- replicasetpart3
expose:
- '27019'
cap_add:
- NET_ADMIN
...
Je reçois un message d'importation circulaire. Mais si je supprime le lien retour vers dbreplicasetpart1, je ne peux pas cingler de dbreplicasetpart2 à dbreplicasetpart1 . Quelle est la solution?
Mise à jour pour Docker 1.10
Docker 1.10 permet la définition de réseaux dans le fichier de composition ..__ Voici le code mis à jour
version: "2"
services:
replica1:
image: mongo:2.6.8
container_name: replica1
networks:
- my-net
ports:
- "27018"
environment:
REPLICA2_URL: "http://replica2:27019"
replica2:
image: mongo:2.6.8
container_name: replica2
networks:
- my-net
ports:
- "27019"
environment:
REPLICA1_URL: "http://replica1:27018"
networks:
my-net:
driver: bridge
Réponse précédente pour Docker 1.9
À partir de Docker 1.9, la solution consiste à créer un réseau personnalisé et à le transmettre à la commande docker-compose up
.
Créer un réseau
docker network create --driver bridge my-net
Référencez ce réseau en tant que variable d'environnement (${NETWORK}
) dans les fichiers docker-compose.yml. Par exemple:
`` `
replica1:
image: mongo:2.6.8
container_name: replica1
net: ${NETWORK}
ports:
- "27018"
environment:
REPLICA2_URL: "http://replica2:27019"
replica2:
image: mongo:2.6.8
container_name: replica2
net: ${NETWORK}
ports:
- "27019"
environment:
REPLICA1_URL: "http://replica1:27018"
`` `
Notez que replica1
dans http://replica1:27018
sera résolu en adresse ip du service réplica1 (conteneur). Pas besoin de coder en dur les adresses IP; Une entrée pour replica1 est automatiquement ajoutée au répertoire/etc/Host du conteneur replica2. Il en va de même pour le conteneur replica1. Docker ajoutera une entrée pour replica2 dans son fichier/etc/Host.
NETWORK=my-net docker-compose up -d -f docker-compose.yml
J'ai créé un pont pont ci-dessus qui ne fonctionne que dans un seul nœud (hôte). Bon pour dev. Si vous avez besoin que deux nœuds se parlent, vous devez créer un réseau en superposition. Même principe cependant. Vous transmettez le nom du réseau à la commande docker-compos up.
Vous devriez utiliser le motif ambassadeur:
https://docs.docker.com/engine/admin/ambassador_pattern_linking/
Fondamentalement, vous créez un composant intermédiaire qui relie les deux. Vous pouvez voir un exemple que nous utilisons avec le service de découverte Eureka de Spring Cloud:
ambassador:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name eureka_1 -name eureka2_1 "
eureka:
links:
- "ambassador:eureka2"
eureka2:
links:
- "ambassador:eureka"
Pour simplifier, je n'ai copié que les liens
Nous avons pensé utiliser la solution avec l'ambassadeur. C’est bien la solution la plus confortable ... La configuration qui nous convient:
amba1:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name cucumber_dbreplicasetpart1_1"
amba2:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name cucumber_dbreplicasetpart2_1"
amba3:
image: cpuguy83/docker-grand-ambassador
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
command: "-name cucumber_dbreplicasetpart3_1"
dbreplicasetpart1:
image: 'mongo:2.6.8'
hostname: dbreplicasetpart1
command: >
bash -c
'
mongod --fork --logpath mongo.log --smallfiles --replSet rs1
echo "
printjson(
rs.initiate(
{
_id : \"rs1\",
members : [
{_id : 0, Host : \"dbreplicasetpart1:27017\"},
{_id : 1, Host : \"dbreplicasetpart2:27017\"},
{_id : 2, Host : \"dbreplicasetpart3:27017\"},
]
}
)
);
" | mongo;
tail -f mongo.log
'
links:
- "amba2:dbreplicasetpart2"
- "amba3:dbreplicasetpart3"
dbreplicasetpart2:
image: 'mongo:2.6.8'
hostname: dbreplicasetpart2
command: >
bash -c
'
mongod --fork --logpath mongo.log --smallfiles --replSet rs1
echo "
printjson(
rs.initiate(
{
_id : \"rs1\",
members : [
{_id : 0, Host : \"dbreplicasetpart1:27017\"},
{_id : 1, Host : \"dbreplicasetpart2:27017\"},
{_id : 2, Host : \"dbreplicasetpart3:27017\"},
]
}
)
);
" | mongo;
tail -f mongo.log
'
links:
- "amba1:dbreplicasetpart1"
- "amba3:dbreplicasetpart3"
dbreplicasetpart3:
image: 'mongo:2.6.8'
hostname: dbreplicasetpart3
command: >
bash -c
'
mongod --fork --logpath mongo.log --smallfiles --replSet rs1
echo "
printjson(
rs.initiate(
{
_id : \"rs1\",
members : [
{_id : 0, Host : \"dbreplicasetpart1:27017\"},
{_id : 1, Host : \"dbreplicasetpart2:27017\"},
{_id : 2, Host : \"dbreplicasetpart3:27017\"},
]
}
)
);
" | mongo;
tail -f mongo.log
'
links:
- "amba1:dbreplicasetpart1"
- "amba2:dbreplicasetpart2"
Sans mettre à jour le fichier docker-compose.yml
,
docker network connect docker-compose-network-you-want-to-connect conatianer-name-from-another-docker-compose
Plus ici