Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

967
Vistas
docker-compose y conexión al contenedor Mongo

Estoy tratando de crear 2 contenedores según el siguiente archivo docker-compose.yml. El problema es que si inicio el contenedor de la base de datos mongo y luego ejecuto mi código localmente (presionando 127.0.0.1), entonces todo está bien, pero si intento ejecutar mi contenedor api y presiono eso (ver archivo yml) entonces obtengo conexión rechazada es decir

172.29.0.12:27117: [Errno 111] Conexión rechazada, tiempo de espera: 30 s, descripción de topología: <ID de descripción de topología: 60437a460a3e0fa904650e35, tipo de topología: único, servidores: [<Descripción de servidor ('172.29.0.12', 27117) tipo de servidor: desconocido, rtt: Ninguno, error=AutoReconnect('172.29.0.12:27117: [Errno 111] Conexión rechazada')>]>

Tenga en cuenta: configuré mongo para usar el puerto 27117 en lugar de 27017 Mi aplicación es una aplicación Python Flask y estoy usando PyMongo de la siguiente manera:

 try: myclient = pymongo.MongoClient('mongodb://%s:%s@%s:%s/%s' % (username, password, hostName, port, database)) mydb = myclient[database] cursor = mydb["temperatures"] app.logger.info('Database connected to: ' + database) except: app.logger.error('Error connecting to database')

Lo que me vuelve loco es que se ejecuta localmente y accede con éxito a mongo a través del contenedor, pero tan pronto como pruebo la aplicación en un contenedor, falla.

docker-compose.yml de la siguiente manera:

 version: '3.7' services: hotbin-db: image: mongo container_name: hotbin-db restart: always ports: # <Port exposed> : < MySQL Port running inside container> - '27117:27017' expose: # Opens port 3306 on the container - '27117' command: [--auth] environment: MONGO_INITDB_ROOT_USERNAME: *** MONGO_INITDB_ROOT_PASSWORD: *** MONGO_INITDB_DATABASE: *** MONGODB_DATA_DIR: /data/db MONDODB_LOG_DIR: /dev/null # Where our data will be persisted volumes: - /home/simon/mongodb/database/hotbin-db/:/data/db #- my-db:/var/lib/mysql # env_file: # - .env networks: hotbin-net: ipv4_address: 172.29.0.12 hotbin-api: image: scsherlock/compost-api:latest container_name: hotbin-api environment: MONGODB_DATABASE: *** MONGODB_USERNAME: *** MONGODB_PASSWORD: *** MONGODB_HOSTNAME: 172.29.0.12 MONGODB_PORT: '27117' depends_on: - hotbin-db restart: always ports: # <Port exposed> : < MySQL Port running inside container> - '5050:5050' expose: - '5050' networks: hotbin-net: ipv4_address: 172.29.0.13 # # Names our volume volumes: my-db: networks: hotbin-net: driver: bridge ipam: driver: default config: - subnet: 172.29.0.0/16
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Usar el nombre de servicio del contenedor mongo y el puerto estándar de 27017 en lugar de 27117 (aunque eso es lo que se define en el archivo docker-compose) funciona. Aunque me gustaría entender por qué

El archivo de composición de la ventana acoplable NO configura MongoDB para que se ejecute en el puerto 27117. Si desea que se ejecute en el 27117, deberá cambiar esta línea en la composición de la ventana acoplable:

 command: mongod --auth --port 27117

Como no ha especificado un puerto, MongoDB se ejecutará en el puerto predeterminado 27017.

Su sección de expose expone el puerto del contenedor 27117 al host, pero Mongo no se está ejecutando en ese puerto, por lo que la línea no hace nada.

Su sección de ports asigna un puerto de host 27117 a un puerto de contenedor 27017. Esto significa que si se está conectando desde el host , puede conectarse en el puerto 27117, pero se está conectando al puerto 27017 en el contenedor .

Ahora a su programa Python. Como esto se ejecuta en la red de contenedores, para conectar servicios dentro de una red compuesta por docker, los hace referencia por su nombre de servicio.

Juntando esto, su cadena de conexión será: mongodb://hotbin-db:27017/yourdb?<options>

Como han mencionado otros, realmente no necesita crear direcciones IP específicas a menos que tenga una muy buena necesidad de hacerlo . Ni siquiera tiene que definir una red, ya que docker-compose crea su propia red interna.

Referencia: https://docs.docker.com/compose/networking/

over 4 years ago · Santiago Trujillo Denunciar

0

¿Está utilizando Windows para ejecutar el contenedor? En caso afirmativo, localhost se identifica como localhost del contenedor y no como localhost de su máquina host.

Por lo tanto, en lugar de proporcionar la dirección IP de su host, intente modificar su cadena mongodB de esta manera cuando se ejecute dentro del contenedor docker:

Pruebe esto: mongodb://host.docker.internal:27017/ en lugar de: mongodb://localhost:27017/

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda