sql >> Base de Datos >  >> NoSQL >> Redis

Comunicación entre dos contenedores Docker en macOS 10.12

Cada contenedor tiene su propio host local

Cada servicio se ejecuta en su propio contenedor. Desde la perspectiva del contenedor de Ubuntu, redis no está escuchando en localhost.

Usar redes Docker

Para que sus contenedores se comuniquen, deben estar en la misma red de Docker. Esto consta de tres pasos:

  1. Crear una red Docker
  2. Dé nombres a sus contenedores
  3. Adjunte sus contenedores a la red que creó

Una vez hecho esto, los contenedores pueden comunicarse entre sí usando sus nombres como si fueran nombres de host.

Hay más de una forma de despellejar a este gato... Veré dos en esta respuesta, pero probablemente haya otras formas de hacerlo con las que no estoy familiarizado (como usar Kubernetes o Swarm, por ejemplo).

Hacerlo a mano

Puede crear una red para esta aplicación 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

Cuando ejecute el contenedor redis, asegúrese de que tenga un nombre y que esté en esta red. Puede exponer los puertos externamente (a macOS) si lo desea (usando -p ), pero eso no es necesario solo para que otros contenedores hablen con redis.

docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>

Ahora ejecuta tu contenedor de Ubuntu. También puede nombrarlo si lo desea, pero no me molestaré en este ejemplo porque este no está ejecutando ningún servicio.

docker run -it --network my_redis_app ubuntu bash

Ahora, desde el interior del contenedor de Ubuntu, debería poder llegar a redis usando el nombre redis_server , como si fuera un nombre DNS.

Hacerlo usando Compose

Tiendo a crear configuraciones como esta usando Compose, porque es más fácil escribirlo en un archivo YAML (IMO). Aquí hay un ejemplo de lo anterior, reescrito en 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

Con esto en su lugar, puede ejecutar docker-compose up -d redis y tenga su servicio redis en línea usando una red Docker específica. Compose creará la red por usted, si aún no existe.

Tiene menos sentido ejecutar el contenedor de Ubuntu de esa manera... es interactivo, por supuesto. Pero asumo que una vez que haya iniciado Redis, agregará algún tipo de contenedor de aplicaciones, y tal vez un proxy web como nginx... simplemente coloque los demás en services también, y puede administrarlos todos juntos.

Desde ubuntu es interactivo, puede ejecutarlo de forma interactiva:

# without -d, container is run interactively
docker-compose run ubuntu bash

Y ahora en Ubuntu, debería poder conectarse a redis usando su nombre, que en este ejemplo es simplemente redis .