Estoy tratando de acceder al servidor Redis a través del código y no se conecta. Pero si golpeo el contenedor de redis, puedo acceder a redis-cli.
docker-compose.yml se ve así
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: bridgeDockerfile_redis
FROM redis:latestCuando intento conectarme al servidor redis usando este código
$redis = new \Redis(); try { $redis->connect('127.0.0.1', 6379); } catch (\Exception $e) { var_dump($e->getMessage()) ; die; }Da esta advertencia
Warning: Redis::connect(): connect() failed: Connection refused¿Alguien sabe cómo conectar el contenedor Redis al contenedor PHP?
Docker Compose crea un contenedor docker separado para diferentes servicios. Cada contenedor es, lógicamente hablando, como diferentes servidores informáticos separados que solo se conectan entre sí a través de la red Docker.
Considere cada cuadro en este diagrama como una computadora individual, entonces esto es prácticamente lo que tiene:
+----------------------------------------------------------+ | your machine | +----------------------------------------------------------+ | +------ (virtual network by docker) -------+ | | | +-----------------+ +-------------------+ +----------------+ | "php" container | | "redis" container | | "db" container | +-----------------+ +-------------------+ +----------------+Su contenedor PHP no ve ningún redis en "localhost" porque no hay redis en él. Al igual que no vería ningún MySQL en "localhost". Su redis se está ejecutando en el contenedor "redis". Su MySQL se está ejecutando en su contenedor "db".
Lo que lo confunde son las directivas de enlace de puertos (es decir ports en esta definición):
redis: build: context: . dockerfile: Dockerfile_redis ports: - "6379:6379" El puerto 6379 del contenedor "redis" está vinculado a su computadora, pero SOLAMENTE a su computadora . Otro contenedor no tiene el mismo acceso a los enlaces de puerto. Entonces, incluso su computadora puede conectarlo con '127.0.0.1:6379', el contenedor php no puede hacer lo mismo.
Como se describe en Redes en Docker Compose , cada contenedor de docker compose puede acceder a otro contenedor usando el nombre del servicio como nombre de host. Por ejemplo, su programación ejecutada por el servicio php puede acceder a su servicio MySQL con el nombre de host db .
Por lo tanto, debe conectar redis con su nombre de host redis
$redis = new \Redis(); try { $redis->connect('redis', 6379); } catch (\Exception $e) { var_dump($e->getMessage()) ; die; }simplemente elimine el puerto redis y cambie el nombre de host redis a redis en el archivo .env de su proyecto Laravel.
REDIS_HOST=redis #REDIS_PORT=6379Si usa una IP estática para su red, use a continuación en lugar de localhost
$redis->connect('<static-ip>', 6379);