• Companies
    • Post job
    • Our process
    • Assessments
    • Hire tech talent
    • Employer of Record
    • Sales
    • Salary Calculator
  • Candidates
    • Jobs
    • Courses and challenges
  • Pricing

0

457
Views
Cómo acceder al servicio que ejecuta docker con network_mode: "host" desde una IP externa

Mi escenario:

Tengo un servidor con IP xxxx, en el que ejecuto una instancia de MongoDB. También construyo mi servicio con un archivo docker-compose.yml como se muestra a continuación

 version: "3" services: myApp: image: myApplication ports: - "8080:8080" environment: SPRING_DATA_MONGODB_URI: mongodb://localhost:27017/myAppDb

Cuando ejecuto docker-compose up para iniciar el contenedor, puedo acceder a mi servicio desde mi computadora a través de xxxx:8080

Pero el problema es que mi servicio no puede conectarse a mongoDB en localhost:27017, porque no están en la misma red. Por lo tanto, agrego la opción network_mode: "host" a mi archivo docker-compose. Resuelve el problema, mi servicio puede conectarse a mongoDB que se ejecuta en mi servidor. Sin embargo, ya no puedo acceder a mi servicio a través de xxxx:8080

Mi pregunta:

¿Cómo puedo seguir conectándome a mi servicio a través de xxxx:80 con la opción network_mode: "host" ? ¿O hay alguna forma de que no necesite usar esa opción, pero mi servicio aún puede conectarse a la instancia de mongoDB?

Nota: La instancia de MongoDB se instala de forma tradicional (yum install mongodb-org) y se configura de manera que solo se pueda acceder a ella a través de localhost:27017 (o 127.0.0.1:27107). No sé por qué ni cómo, pero es así, por lo que no puedo cambiar la cadena de conexión a mongodb://xxxx:27017. Simplemente no funcionará.

También sé que puedo agregar mongodb como un servicio en el archivo docker-compose para lograr mi objetivo, pero no quiero hacerlo porque, en mi caso, es mejor administrar la base de datos por separado.

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Parece que la única salida es ejecutar el contenedor myApp en modo host . En este modo, se debe poder acceder al servicio en la dirección IP del host en el puerto 8080 . Si no es así, lo más probable es que se deba a problemas con el cortafuegos.

Se puede acceder al mismo servicio en el modo de red bridge , ya que en este modo, Docker manipula las reglas de iptables para brindar acceso a los contenedores. Más información aquí .

En su caso específico, la ventana acoplable agrega una regla NAT para reenviar el tráfico entrante en el puerto 8080 en el host al puerto 8080 en el contenedor. Ejecutando iptables

 iptables -t nat -L

debe dar salida a la regla:

 Chain POSTROUTING (policy ACCEPT) MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:http-alt ... Chain DOCKER (2 references) DNAT tcp -- anywhere anywhere tcp dpt:http-alt to:172.17.0.2:8080

donde 172.17.0.2 es la IP del contenedor.

El problema está en el modo host , donde los puertos de publicación se descartan y la ventana acoplable no agrega ninguna regla para permitir el tráfico entrante a través del puerto 8080 . Tienes que agregar la regla tú mismo.

Espero eso ayude.

about 4 years ago · Santiago Trujillo Report

0

Experimenté algo similar, pero no usé docker-compose, pero creo que podría aplicar el mismo método.

En lugar de usar el host, creará su propia red puente ( https://docs.docker.com/network/bridge/ ), y luego creo que su servicio debería poder acceder a mongodb, y debería poder acceda a mongodb también :)

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!