Redis
 sql >> Base de données >  >> NoSQL >> Redis

Communication entre deux conteneurs Docker sur macOS 10.12

Chaque conteneur a son propre hôte local

Chaque service s'exécute dans son propre conteneur. Du point de vue du conteneur Ubuntu, redis n'écoute pas sur localhost.

Utiliser les réseaux Docker

Pour que vos conteneurs communiquent, ils doivent être sur le même réseau Docker. Cela se compose de trois étapes :

  1. Créer un réseau Docker
  2. Donnez des noms à vos conteneurs
  3. Associez vos conteneurs au réseau que vous avez créé

Ceci fait, les conteneurs peuvent se parler en utilisant leurs noms comme s'ils étaient des noms d'hôte.

Il y a plus d'une façon d'écorcher ce chat... J'en examinerai deux dans cette réponse, mais il y a probablement quelques autres façons de le faire que je ne connais pas (comme utiliser Kubernetes ou Swarm, par exemple).

Le faire à la main

Vous pouvez créer un réseau pour cette application en utilisant docker network commandes.

# Show the current list of networks
docker network ls

# Create a network for your app
docker network create my_redis_app

Lorsque vous exécutez le conteneur Redis, assurez-vous qu'il a un nom et qu'il se trouve sur ce réseau. Vous pouvez exposer les ports en externe (à macOS) si vous le souhaitez (en utilisant -p ), mais cela n'est pas nécessaire uniquement pour que d'autres conteneurs communiquent avec redis.

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

Exécutez maintenant votre conteneur Ubuntu. Vous pouvez également le nommer si vous le souhaitez, mais je ne m'attarderai pas sur cet exemple car celui-ci n'exécute aucun service.

docker run -it --network my_redis_app ubuntu bash

Maintenant, depuis l'intérieur du conteneur Ubuntu, vous devriez pouvoir accéder à redis en utilisant le nom redis_server , comme s'il s'agissait d'un nom DNS.

Faire cela avec Compose

J'ai tendance à créer des configurations comme celle-ci en utilisant Compose, car il est plus facile de l'écrire dans un fichier YAML (IMO). Voici un exemple de ce qui précède, réécrit sous la forme 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

Avec cela en place, vous pouvez exécuter docker-compose up -d redis et avoir votre service redis en ligne en utilisant un réseau Docker spécifique. Compose créera le réseau pour vous, s'il n'existe pas déjà.

Cela a moins de sens d'exécuter le conteneur Ubuntu de cette façon... c'est interactif, bien sûr. Mais je suppose qu'une fois que vous aurez redis, vous ajouterez une sorte de conteneur d'application, et peut-être un proxy Web comme nginx... placez simplement les autres sous services ainsi, et vous pouvez les gérer tous ensemble.

Depuis ubuntu est interactif, vous pouvez l'exécuter de manière interactive :

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

Et maintenant, dans Ubuntu, vous devriez pouvoir vous connecter à redis en utilisant son nom, qui dans cet exemple est simplement redis .