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 :
- Créer un réseau Docker
- Donnez des noms à vos conteneurs
- 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
.