J'essaie d'accéder au serveur Redis via le code et il ne se connecte pas. Mais si je tiens au conteneur redis, je peux accéder au redis-cli.
docker-compose.yml ressemble à ceci
version: '2'
services:
web:
build:
context: .
dockerfile: Dockerfile_nginx
ports:
- "9000:80"
environment:
- NGINX_SERVERNAME=xxx.dev *.xxx.dev
command: /bin/bash -c "envsubst '$$NGINX_SERVERNAME' < /var/www/site.template > /etc/nginx/conf.d/default.conf
&& dos2unix /var/www/provision/init_storage.sh && sh /var/www/provision/init_storage.sh
&& nginx -g 'daemon off;'"
volumes:
- .:/var/www
links:
- php
networks:
frontend
php:
build:
context: .
dockerfile: Dockerfile_php-fpm
command: /bin/bash -c "composer install
&& php-fpm"
volumes:
- .:/var/www
environment:
- APP_ENV=local
- APP_DEBUG=true
networks:
- frontend
- backend
links:
- redis
db:
build:
context: .
dockerfile: Dockerfile_mariadb
volumes:
- ./initdb:/docker-entrypoint-initdb.d
ports:
- "3309:3306"
environment:
MYSQL_ROOT_PASSWORD: xxxx
MYSQL_DATABASE: xxxx
networks:
- backend
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
networks:
frontend:
driver: bridge
backend:
driver: bridge
Dockerfile_redis
FROM redis:latest
Quand j'essaie de me connecter au serveur Redis en utilisant ce code
$redis = new \Redis();
try {
$redis->connect('127.0.0.1', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}
Il donne cet avertissement
Warning: Redis::connect(): connect() failed: Connection refused
Est-ce que quelqu'un sait comment connecter un conteneur Redis à un conteneur PHP?
Docker Compose crée un conteneur de menu fixe séparé pour différents services. Logiquement, chaque conteneur ressemble à différents serveurs informatiques séparés qui ne se connectent que les uns aux autres par le biais du réseau Docker.
Considérez chaque case de ce diagramme comme un ordinateur individuel. C'est pratiquement ce que vous avez:
+----------------------------------------------------------+
| your machine |
+----------------------------------------------------------+
| | |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+
Votre conteneur PHP ne voit aucune redis dans "localhost" car il ne contient aucune redis. Juste comme il ne verrait aucun MySQL dans "localhost". Votre redis est exécuté dans le conteneur "redis". Votre MySQL s'exécute dans votre conteneur "db".
Les directives de liaison de port (c'est-à-dire ports
dans cette définition) sont les suivantes:
redis:
build:
context: .
dockerfile: Dockerfile_redis
ports:
- "6379:6379"
Le port 6379
du conteneur "redis" est lié à votre ordinateur, mais à votre ordinateur UNIQUEMENT. L'autre conteneur n'a pas le même accès aux liaisons de port. Ainsi, même votre ordinateur peut le connecter avec "127.0.0.1:6379", le conteneur php
ne peut pas en faire autant.
Comme décrit dans Mise en réseau dans Docker Compose , chaque conteneur de composition de docker peut accéder à un autre conteneur en utilisant le nom du service comme nom d’hôte. Par exemple, votre programmation exécutée par le service php
peut accéder à votre service MySQL avec le nom d’hôte db
.
Donc, vous devriez connecter redis avec son nom d’hôte redis
$redis = new \Redis();
try {
$redis->connect('redis', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}
il suffit de supprimer le port Redis et de modifier le nom d’hôte Redis en redis
dans le fichier Laravel du projet .env.
REDIS_Host=redis
#REDIS_PORT=6379
lnmp-redis:
image: yahuiwong/lnmp:redis3.2.9
hostname: lnmp-redis-v3
ports:
- "63789:63789"
$redis = new \Redis();
var_dump($redis);
try {
$redis->connect('lnmp-redis-v3', 63789);
var_dump($redis->keys("*"));
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
}
Si vous utilisez une adresse IP statique pour votre réseau, utilisez ci-dessous au lieu de localhost
$redis->connect('<static-ip>', 6379);