Docker Redis连接被拒绝

我试图通过代码访问Redis服务器,并没有连接。 但是,如果我猛击redis容器,我可以访问redis-cli。

docker-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服务器

 $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 

有谁知道如何将Redis容器连接到PHP容器?

你的问题

Docker Compose为不同的服务创build分离的docker容器。 从逻辑上说,每个容器都像不同的分离的计算机服务器,只通过dockernetworking彼此连接。

考虑这个图表中的每一个盒子作为一台个人电脑,那么这实际上是你所拥有的:

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

您的PHP容器在“localhost”中看不到任何redis,因为没有redis。 就像它不会在“localhost”中看到任何MySQL。 您的redis正在“redis”容器中运行。 你的MySQL正在你的“db”容器中运行。

混淆你的东西是端口绑定指令(即在这个定义中的ports ):

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

“redis”容器的端口6379绑定到您的计算机,但仅限于您的计算机 。 其他容器不具有相同的端口绑定访问权限。 所以即使您的电脑可以连接到“127.0.0.1:6379”,PHP容器不能这样做。

如Docker Compose中的“ 联网”中所述,每个Docker撰写容器都可以使用服务名称作为主机名来访问其他容器。 例如,你的php运行的程序可以通过主机名db访问你的MySQL服务。

所以你应该把redis和它的主机名redis连接起来

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