docker run mongo image sur un autre port
La petite question est ce que je peux exécuter mongo de mongo:dernière image sur un autre port que le port 27017 (par exemple sur 27018?)
Si oui, comment puis-je faire cela à l'intérieur d'un menu fixe-composer.fichier yml afin ro être en mesure de taper la commande suivante:
docker-compose run
La longue histoire:
J'ai une application s'exécutant dans AWS EC2. L'application se compose d'un mongodb et une application web. Maintenant, j'ai décidé de se séparer d'une partie de cette application dans son propre microservice cours d'exécution dans la même AWS à l'intérieur de conteneur docker (deux conteneurs l'un pour l'autre mongo et l'autre pour une application web). Je pense que le problème est que je ne peut pas avoir de mongodb sur le port 27017 et dans le même temps, un autre mongodb à l'intérieur d'un conteneur docker sur le port 27017. Droit? J'ai cette hypothèse parce que quand j'ai arrêter la première mongo (mon application mongo), mon menu fixe mongo œuvres.
Donc je suis en train de faire la deuxième mongo (celui qui est à l'intérieur du conteneur docker), à exécuter dans un autre port, et mon deuxième web app (l'un dans l'autre docker conianter), à écouter mongo sur un port différent. Voici ma tentative de changer le menu fixe-composition de fichier:
version: '2'
services:
webapp:
image: myimage
ports:
- 3000:3000
mongo:
image: mongo:latest
ports:
- 27018:27018
Et à l'intérieur de ma nouvelle application, j'ai changé les mongo url:
monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url, 27018)
Bien, même si je dis:
monog_url = 'mongodb://mongo:27018'
client = MongoClient(monog_url)
Mais lorsque je lance le menu fixe-composition de l'exécuter, il ne fonctionne toujours pas, et j'obtiens les erreurs suivantes:
ERROR: for mongo driver failed programming external
connectivity on endpoint: Error starting userland proxy:
listen tcp 0.0.0.0:27017: bind: address already in use
Ou
pymongo.errors.ServerSelectionTimeoutError:
mongo:27018: [Errno -2] Name or service not known
Vous devez vous connecter pour publier un commentaire.
Vous pouvez dire MongoDB pour l'écoute sur un autre port dans le fichier de configuration, ou en utilisant un paramètre de ligne de commande:
Vous pouvez exécuter des processus à l'intérieur d'un conteneur et à l'extérieur sur le même port. Vous pouvez même exécuter plusieurs conteneurs en utilisant le même port en interne. Ce que vous ne pouvez pas mapper le port de l'hôte à un conteneur. Ou dans votre, une carte, un port qui est déjà en cours d'utilisation à un conteneur.
Par exemple, ce serait de travailler sur votre hôte:
L'hôte mongo écoute sur 27017. La aussi l'hôte des cartes des ports 27018 et 27019 pour le conteneur de mongo cas, à la fois à l'écoute sur 27017 à l'intérieur du conteneur.
Chaque conteneurs a son propre nom de réseau de l'espace et n'a pas de notion de ce qui est en cours d'exécution dans un autre récipient ou sur l'ordinateur hôte.
Réseaux
De la webapp doit être en mesure de se connecter à l'mongo conteneurs du port interne. Vous pouvez le faire sur une conteneur réseau qui permet les connexions entre le conteneur et aussi la résolution de nom pour chaque service
À partir de votre application l'url
mongo://mongo:27017
travailleront ensuite.À partir de votre hôte besoin d'utiliser le mappé port et une adresse sur l'hôte, qui est normalement
localhost
:mongo://localhost:27018
docker0
pont qui permet de ne pas autoriser la communication de conteneur à moins que vous l'installationlinks
. Vous devez modifier les mongo config. Peut-être créer votre propre DockerfileFROM mongo
etCOPY
la config dans votre nouvelle image de constructionDéfaut de communication entre les différents conteneurs en cours d'exécution sur le même ordinateur hôte
J'ai résolu le problème, et non pas par l'exécution du conteneur dans un autre port, mais par l'apprentissage d'une nouvelle fonctionnalité dans le panneau-composition de la version 2 et que nous n'avez pas besoin de spécifier des liens ou des réseaux. Le nouvellement créé de conteneurs par défaut sera le cadre de docker0 réseau et par conséquent, ils peuvent communiquer les uns avec les autres.
Comme Matt mentionné, nous pouvons exécuter des processus à l'intérieur de conteneurs sur le même port. Ils doivent être isolés. Donc, le problème ne peut pas être que le conteneur docker et l'hôte sont en utilisant le même port. Le problème est peut-être, il est une tentative de transmettre un port de l'hôte à un autre port dans un conteneur.
Ci-dessous est un travail de docker-composition de fichier:
J'ai regardé les mongo:le dernier panneau fichiers sur github, et réalisé qu'ils exposés 27017. Donc, nous n'avons pas besoin de changer le port ou transférer les ports d'hôte à l'exécution de mongo conteneur. Et les mongo url peut rester sur le même port:
Docker exécutez une image sur un port différent
Si la solution ci-dessus ont résolu le problème, mais comme pour la question-titre de " docker run mongo image sur un autre port, de la façon la plus simple est juste pour changer le menu fixe-composer de:
Mongo est maintenant en cours d'exécution sur 27018 et l'url suivante est toujours accessible à l'intérieur de la toile: