web-dev-qa-db-fra.com

Docker Redis Connection refusé

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?

11
Isuru Buddhika

Ton problème

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.

Solution

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;
}
23
Koala Yeung

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
2
Aboozar Ghaffari

docker-compose.yml Config

    lnmp-redis:
    image: yahuiwong/lnmp:redis3.2.9
    hostname: lnmp-redis-v3
    ports:
        - "63789:63789"

Exemple

    $redis = new \Redis();
var_dump($redis);
try {
    $redis->connect('lnmp-redis-v3', 63789);
    var_dump($redis->keys("*"));
} catch (\Exception $e) {
    var_dump($e->getMessage())  ;
}
0
Tinywan

Si vous utilisez une adresse IP statique pour votre réseau, utilisez ci-dessous au lieu de localhost

$redis->connect('<static-ip>', 6379);
0
upillai