Cada contêiner tem seu próprio localhost
Cada serviço é executado em seu próprio contêiner. Da perspectiva do contêiner do Ubuntu, o redis não está escutando no localhost.
Usar redes Docker
Para que seus contêineres se comuniquem, eles devem estar na mesma rede do Docker. Isso consiste em três etapas:
- Criar uma rede Docker
- Dê nomes aos seus contêineres
- Anexe seus contêineres à rede que você criou
Feito isso, os containers podem conversar entre si usando seus nomes como se fossem nomes de host.
Há mais de uma maneira de esfolar este gato... Vou ver duas nesta resposta, mas provavelmente existem algumas outras maneiras de fazer isso com as quais não estou familiarizado (como usar Kubernetes ou Swarm, por exemplo).
Fazendo manualmente
Você pode criar uma rede para este aplicativo usando
docker network
comandos. # Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
Ao executar o contêiner redis, certifique-se de que ele tenha um nome e esteja nesta rede. Você pode expor as portas externamente (para macOS) se quiser (usando
-p
), mas isso não é necessário apenas para que outros contêineres conversem com o redis. docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
Agora execute seu contêiner do Ubuntu. Você pode nomeá-lo também, se quiser, mas não vou me incomodar neste exemplo porque este não está executando nenhum serviço.
docker run -it --network my_redis_app ubuntu bash
Agora, de dentro do contêiner do Ubuntu, você deve conseguir acessar o redis usando o nome
redis_server
, como se fosse um nome DNS. Fazendo isso usando o Compose
Costumo criar configurações como essa usando o Compose, porque é mais fácil escrevê-lo em um arquivo YAML (IMO). Aqui está um exemplo do acima, reescrito no formato docker-compose.yml:
version: '2'
services:
redis:
image: <IMAGE ID>
networks:
- my_redis_app
ports: 6379:6379
ubuntu:
image: ubuntu:latest
networks:
- my_redis_app
networks:
my_redis_app:
driver: bridge
Com isso, você pode executar
docker-compose up -d redis
e tenha seu serviço redis online usando uma rede específica do Docker. O Compose criará a rede para você, caso ela ainda não exista. Faz menos sentido rodar o container do Ubuntu dessa forma... é interativo, claro. Mas suponho que uma vez que você tenha redis em andamento, você adicionará algum tipo de contêiner de aplicativo e talvez um proxy da Web como nginx ... apenas coloque os outros em
services
também, e você pode gerenciá-los todos juntos. Desde
ubuntu
é interativo, você pode executá-lo interativamente:# without -d, container is run interactively
docker-compose run ubuntu bash
E agora no Ubuntu, você deve conseguir se conectar ao redis usando seu nome, que neste exemplo é simplesmente
redis
.