La pregunta corta es ¿puedo ejecutar mongo desde mongo: la última imagen en un puerto diferente al 27017 (por ejemplo, en 27018?)
En caso afirmativo, ¿cómo puedo hacer esto dentro de un archivo docker-compose.yml para poder escribir el siguiente comando?
docker-compose runLa historia más larga:
Tengo una aplicación ejecutándose en la instancia de AWS EC2. La aplicación consta de un mongodb y una aplicación web. Ahora decidí separar parte de esta aplicación en su propio microservicio que se ejecuta en el mismo contenedor de la ventana acoplable interna de AWS (dos contenedores, uno para otro mongo y otro para una aplicación web). Creo que el problema es que no puedo tener mongodb ejecutándose en el puerto 27017 y, al mismo tiempo, otro mongodb ejecutándose dentro de un contenedor docker en el puerto 27017. ¿Verdad? Tengo esta suposición porque cuando detengo el primer mongo (mi aplicación mongo), mi docker mongo funciona.
Entonces, estoy tratando de hacer que el segundo mongo (el que está dentro del contenedor de la ventana acoplable), se ejecute en un puerto diferente y mi segunda aplicación web (la que está dentro de otro conianter de la ventana acoplable), para escuchar a mongo en un puerto diferente. Aquí está mi intento de cambiar el archivo docker-compose:
version: '2' services: webapp: image: myimage ports: - 3000:3000 mongo: image: mongo:latest ports: - 27018:27018Y dentro de mi nueva aplicación, cambié la URL de mongo a:
monog_url = 'mongodb://mongo:27018' client = MongoClient(monog_url, 27018)Pues lo mismo si digo:
monog_url = 'mongodb://mongo:27018' client = MongoClient(monog_url)Pero cuando ejecuto docker-compose run, todavía no funciona y obtengo los siguientes errores:
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 useO
pymongo.errors.ServerSelectionTimeoutError: mongo:27018: [Errno -2] Name or service not knownPuede decirle a MongoDB que escuche en un puerto diferente en el archivo de configuración, o usando un parámetro de línea de comandos:
services: mongo: image: 'mongo:latest' command: mongod --port 27018 ports: - '27018:27018'Puede ejecutar procesos dentro y fuera de un contenedor en el mismo puerto. Incluso puede ejecutar varios contenedores utilizando el mismo puerto internamente. Lo que no puede hacer es asignar un puerto desde el host a un contenedor. O, en su caso, asigne un puerto que ya esté en uso a un contenedor.
Por ejemplo, esto funcionaría en su host:
services: webapp: image: myimage ports: - '3000:3000' mongo: image: 'mongo:latest' ports: - '27018:27017' mongo2: image: mongo:latest ports: - '27019:27017'El host mongo escucha en 27017. El host también asigna los puertos 27018 y 27019 a las instancias del contenedor mongo, ambos escuchando en 27017 dentro del contenedor.
Cada contenedor tiene su propio espacio de nombres de red y no tiene idea de lo que se ejecuta en otro contenedor o en el host.
La aplicación web debe poder conectarse al puerto interno de los contenedores mongo. Puede hacer esto a través de una red de contenedores que permite conexiones entre el contenedor y también resolución de nombres para cada servicio.
services: webapp: image: myimage ports: - '3000:3000' networks: - myapp depends_on: - mongo mongo: image: 'mongo:latest' ports: - '27018:27017' networks: - myapp networks: myapp: driver: bridge Desde su aplicación, la url mongo://mongo:27017 funcionará.
Desde su host, debe usar el puerto asignado y una dirección en el host, que normalmente es localhost : mongo://localhost:27018
Sin embargo, resolví el problema, no ejecutando el contenedor en un puerto diferente, sino aprendiendo una característica nueva en la versión 2 de docker-compose y es que no necesitamos especificar enlaces o redes. Los contenedores recién creados formarán parte de la red docker0 de forma predeterminada y, por lo tanto, pueden comunicarse entre sí.
Como mencionó Matt , podemos ejecutar procesos dentro de contenedores en el mismo puerto. Deben estar aislados. Entonces, el problema no puede ser que el contenedor docker y el host estén usando el mismo puerto. El problema es que tal vez haya un intento de reenviar un puerto usado en el host a otro puerto en el contenedor.
A continuación se muestra un archivo docker-compose en funcionamiento:
version: '2' services: webapp: image: myimage ports: - 3000:3000 mongo: image: mongo:latestMiré el archivo docker mongo:latest en github y me di cuenta de que expusieron 27017. Por lo tanto, no necesitamos cambiar el puerto o reenviar los puertos host al contenedor mongo en ejecución. Y la url de mongo puede permanecer en el mismo puerto:
monog_url = 'mongodb://mongo:27017' client = MongoClient(monog_url, 27017)Entonces, la solución anterior resolvió el problema, pero en cuanto al título de la pregunta 'docker run mongo image on a different port', la forma más sencilla es simplemente cambiar el docker-compose a:
version: '2' services: web: image: myimage mongo: image: mongo:latest command: mongod --port 27018Mongo ahora se ejecuta en 27018 y aún se puede acceder a la siguiente URL dentro de la web:
monog_url = 'mongodb://mongo:27018' client = MongoClient(monog_url, 27018)