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.
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 -Ldebe 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.
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 :)