Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Comunicação entre dois contêineres do Docker no macOS 10.12

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:
  1. Criar uma rede Docker
  2. Dê nomes aos seus contêineres
  3. 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 .