복붙노트

[REDIS] 도커 레디 스의 연결이 거부 됨

REDIS

도커 레디 스의 연결이 거부 됨

나는 코드를 통해 레디 스 서버에 액세스하기 위해 노력하고있어 그것을 연결 아니에요. 내가 레디 스 컨테이너에 비난하지만 나는 레디 스-CLI에 액세스 할 수 있습니다.

이 같은 고정 표시기 - compose.yml의 모습

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

나는이 코드를 사용하여 레디 스 서버에 연결하려고 할 때

$redis = new \Redis();
    try {
        $redis->connect('127.0.0.1', 6379);
    } catch (\Exception $e) {
        var_dump($e->getMessage())  ;
        die;
    }

그것은이 경고를 제공합니다

Warning: Redis::connect(): connect() failed: Connection refused

사람이 PHP 컨테이너에 레디 스 컨테이너를 연결하는 방법을 알고 있나요?

해결법

  1. ==============================

    1.도커 작성 다른 서비스를 분리 용기 고정 표시기를 생성한다. 각 컨테이너는 논리적으로 만 서로 고정 표시기를 통해 네트워크에 연결된 다른 분리 된 컴퓨터 서버와 같은, 말하자면된다.

    도커 작성 다른 서비스를 분리 용기 고정 표시기를 생성한다. 각 컨테이너는 논리적으로 만 서로 고정 표시기를 통해 네트워크에 연결된 다른 분리 된 컴퓨터 서버와 같은, 말하자면된다.

    다음이 당신이 가지고있는 실질적이고, 개별 컴퓨터로이 그림에서 각 상자를 고려 :

    +----------------------------------------------------------+
    |                       your machine                       |
    +----------------------------------------------------------+
            |                      |                   |
    +-----------------+ +-------------------+ +----------------+
    | "php" container | | "redis" container | | "db" container |
    +-----------------+ +-------------------+ +----------------+
    

    거기에 더 레디 스를가 없기 때문에 귀하의 PHP 컨테이너는 "로컬 호스트"에서 어떤 레디 스 표시되지 않습니다. 그냥은 "로컬 호스트"에서 어떤 MySQL을 참조 would't있다. 귀하의 레디 스의 "레디 스"컨테이너에서 실행됩니다. 귀하의 MySQL은 당신의 "DB"컨테이너에서 실행됩니다.

    (이 정의에 즉 포트) 지시를 바인딩 포트 혼란 것들 :

    redis:
      build:
        context: .
        dockerfile: Dockerfile_redis
      ports:
        - "6379:6379"
    

    은 "레디 스"컨테이너의 포트 6379는 컴퓨터에 바인더 제본하지만 컴퓨터에만있다. 다른 컨테이너는 포트 바인딩에 동일한 액세스 할 수 없습니다. 그래서 심지어 컴퓨터가 '127.0.0.1:6379'로 연결할 수 있습니다, PHP는 컨테이너는 동일한 기능을 수행 할 수 없습니다.

    도커 작성 네트워킹에서 설명한 바와 같이, 각각의 고정 표시기 작성 컨테이너는 호스트로의 서비스의 이름을 사용하여, 다른 용기에 액세스 할 수있다. 예를 들어, 서비스 PHP하여 프로그램 실행은 호스트 이름 데시벨로 MySQL의 서비스에 액세스 할 수 있습니다.

    당신은 호스트 이름 레디 스와 레디 스를 연결해야합니다 그래서

    $redis = new \Redis();
    try {
        $redis->connect('redis', 6379);
    } catch (\Exception $e) {
        var_dump($e->getMessage())  ;
        die;
    }
    
  2. ==============================

    2.단지 레디 스 포트를 제거하고 Laravel 프로젝트 .env의 파일에 레디 스에 레디 스 호스트 이름을 변경합니다.

    단지 레디 스 포트를 제거하고 Laravel 프로젝트 .env의 파일에 레디 스에 레디 스 호스트 이름을 변경합니다.

    REDIS_HOST=redis
    #REDIS_PORT=6379
    
  3. ==============================

    3.아래 대신 로컬 호스트의 네트워크 사용을위한 정적 IP를 사용하는 경우

    아래 대신 로컬 호스트의 네트워크 사용을위한 정적 IP를 사용하는 경우

    $redis->connect('<static-ip>', 6379);
    
  4. ==============================

    4.

        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())  ;
    }
    
  5. from https://stackoverflow.com/questions/42360356/docker-redis-connection-refused by cc-by-sa and MIT license