Usar localhost no contêiner docker é inválido, pois localhost significa para o contêiner seu próprio contêiner, portanto, se você executar redis-cli de dentro do contêiner da web, redis-cli está tentando encontrar redis no contêiner da web em vez do contêiner redis.
Você precisa especificar o nome do serviço redis - o docker (rede do docker-compose para ser mais específico) resolverá o nome do seu serviço para o IP do contêiner do redis, então você deve usar:
redis-cli -h redis ping
saída esperada é:
PONG
Editar:
Essa resposta só funcionará se ambos os serviços usarem o mesmo modo de rede, portanto, existem 2 maneiras:
- Adicione network_mode:host ao serviço da web e, em seguida, "localhost" para redis funcionará
- Remova network_mode:host do redis e, em seguida, o domínio "redis" ficará bem