Configuración: tengo una máquina virtual y en la máquina virtual ejecuto tres contenedores (un proxy nginx, una aplicación de matraz muy minimalista y redis). Flask debería estar sirviendo en el puerto 5000 mientras que redis en 6379.
Cada uno de estos contenedores funciona perfectamente como un servicio independiente, pero también está disponible a través de docker compose as a service .
En la aplicación del matraz, mi objetivo es conectarme a redis y consultar algunas claves.
El contenedor nginx expone el puerto 80, el puerto matraz 5000 y el puerto redis 6379.
En la aplicación del matraz tengo una función que intenta crear un cliente redis
db = redis.Redis(host='localhost', port=6379, decode_responses=True)Al ejecutar la aplicación del matraz, recibo un error que indica que el puerto no se puede usar
redis.exceptions.ConnectionError: Error 99 connecting to localhost:6379. Cannot assign requested address.No tengo claro qué podría estar causando este problema y cualquier idea sería apreciada.
En la aplicación del matraz tengo una función que intenta crear un cliente redis
db = redis.Redis(host='localhost', port=6379, decode_responses=True)
Cuando su proceso de matraz se ejecuta en un contenedor, localhost se refiere a la interfaz de red del propio contenedor. No se resuelve en la interfaz de red de su host docker.
Por lo tanto, debe reemplazar localhost con la dirección IP del contenedor que ejecuta redis.
En el contexto de un archivo docker-compose.yml, esto es fácil ya que docker-compose hará que los nombres de los servicios se resuelvan en la dirección IP correcta del contenedor:
version: "3" services: my_flask_service: image: ... my_redis_service: image: ...luego, en su aplicación de matraz, use:
db = redis.Redis(host='my_redis_service', port=6379, decode_responses=True)Tuve el mismo problema, excepto que el servicio al que quería que accediera mi contenedor era remoto y estaba asignado a través del túnel ssh a mi host Docker. En otras palabras, no había un servicio de docker-compose para que mi código lo encontrara. Resolví el problema diciéndole explícitamente a redis que buscara mi host local como una cadena:
pyredis.Redis(host='docker.for.mac.localhost', port=6379)Cualquiera que use solo Docker para ejecutar un contenedor, puede agregar --network=host en el comando como docker run --network=host para hacer que Docker use la red del host mientras ejecuta el contenedor.
También puede usar una red de host para un servicio de enjambre, pasando --network host al comando docker service create .
Asegúrese de no publicar ningún puerto mientras hace esto. como -p 80:8000
No estoy seguro de si Docker compose es compatible con esto.
Nb, esto solo es compatible con Linux.