2017-07-16 4 views
2

Je mis en place le conteneur Cassandra en exécutant les commandes suivantes:Impossible de se connecter à conteneurs Cassandra Docker de mon application Node.js

Cela va tirer l'image docker cassandra du moyeu docker et le démarrage d'un conteneur avec cassandra

docker run --name cassandraDb -d --publish-all=true cassandra:3.11 

Je peux le voir mis en place en exécutant les commandes suivantes:

docker images 
docker ps -a 
docker exec -i -t cassandraDb sh -c 'nodetool status' 

Voici le code de ma route Node.js, quand je frappe, je reçois Proceed erreur ING:

res.send(client.connect() 
     .then(() => { 
      console.log('Connected'); 
      console.log(Object.keys(client.metadata.keyspaces)); 
      return client.shutdown(); 
     }) 
     /* tslint:disable-next-line */ 
     .catch((err): any => { 
      console.error('There was an error when connecting', err); 
      return client.shutdown(); 
     })); 

Erreur:

There was an error when connecting { [Error: All host(s) tried for query failed. First host tried, 172.17.0.2:9042: Error: Connection timeout. See innerErrors.] 
    innerErrors: 
    { '172.17.0.2:9042': 
     { [Error: Connection timeout] 
     message: 'Connection timeout', 
     info: 'Cassandra Driver Error' } }, 
    info: 'Represents an error when a query cannot be performed because no host is available or could be reached by the driver.', 
    message: 'All host(s) tried for query failed. First host tried, 172.17.0.2:9042: Error: Connection timeout. See innerErrors.' } 

Je n'ai pas beaucoup d'expérience avec Cassandra ou Docker, donc je ne sais pas pourquoi mon application ne se connecte pas à la DB, peut-être quelque chose avec les ports n'étant pas ouverts aux demandes entrantes, mais je ne sais pas comment je pourrais vérifier cela ou le changer.

Répondre

2

Je vois deux problèmes:

1) documentation dit --publish-all = true | false .. est une opération de couverture qui identifie chaque port avec une ligne EXPOSER dans Dockerfile ou --expose de l'image commandline drapeau et le mappe à un port hôte quelque part dans une plage de port éphémère.

Au lieu de --publish-all, qui correspondra aux ports aléatoires, faites docker run --name cassandraDb -d -p 7199:7199 -p 7000:7000 -p 9042:9042 -p 9160:9160 -p7001:7001 cassandra:3.11. Vous pouvez voir la différence de docker ps sortie:

$ docker run --name cassandraDb -d -p 7199:7199 -p 7000:7000 -p 9042:9042 -p 
    9160:9160 -p7001:7001 cassandra:3.11 
$ docker ps 
    ... PORTS 
     0.0.0.0:7000-7001->7000-7001/tcp, 0.0.0.0:7199->7199/tcp, 
     0.0.0.0:9042->9042/tcp, 0.0.0.0:9160->9160/tcp cassandraDb 

$ docker run --name cassandraDb -d --publish-all=true cassandra:3.11 
$ docker ps 
... PORTS                               
    0.0.0.0:32782->7000/tcp, 0.0.0.0:32781->7001/tcp, 
    0.0.0.0:32780->7199/tcp, 0.0.0.0:32779->9042/tcp, 0.0.0.0:32778->9160/tcp 

2) Docker ip est probablement pas 172.17.0.2. Il est soit localhost ou essayez docker-machine ip