首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker Redis连接被拒绝

Docker Redis连接被拒绝
EN

Stack Overflow用户
提问于 2017-02-21 06:40:17
回答 6查看 34.2K关注 0票数 24

我试图通过代码访问Redis服务器,但它没有连接。但如果我撞到红色容器,我就能访问红宝石。

docker-compose.yml看起来像这样

代码语言:javascript
复制
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

代码语言:javascript
复制
FROM redis:latest

当我试图使用以下代码连接到redis服务器时

代码语言:javascript
复制
$redis = new \Redis();
    try {
        $redis->connect('127.0.0.1', 6379);
    } catch (\Exception $e) {
        var_dump($e->getMessage())  ;
        die;
    }

它给出了这个警告

代码语言:javascript
复制
Warning: Redis::connect(): connect() failed: Connection refused

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-02-21 07:34:47

你的问题

码头组成为不同的服务创建独立的码头容器。从逻辑上讲,每个容器就像不同的分离的计算机服务器,它们仅通过码头网络相互连接。

将此图表中的每个框看作是一台单独的计算机,那么这实际上就是您所拥有的:

代码语言:javascript
复制
+----------------------------------------------------------+
|                       your machine                       |
+----------------------------------------------------------+
                               |                    
        +------ (virtual network by docker) -------+
        |                      |                   |
+-----------------+ +-------------------+ +----------------+
| "php" container | | "redis" container | | "db" container |
+-----------------+ +-------------------+ +----------------+

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

使您困惑的是端口绑定指令(即本定义中的ports ):

代码语言:javascript
复制
redis:
  build:
    context: .
    dockerfile: Dockerfile_redis
  ports:
    - "6379:6379"

"redis“容器的端口6379被绑定到您的计算机,而绑定到您的计算机上只有。其他容器对端口绑定没有相同的访问权限。因此,即使您的计算机也可以将其连接到'127.0.0.1:6379',php容器也不能这样做。

解决方案

正如码头组合中的网络化中所描述的,每个坞组合容器都可以使用服务名称作为主机名来访问其他容器。例如,通过服务php运行的编程可以使用主机名db访问您的MySQL服务。

因此,您应该将redis与其主机名redis连接起来。

代码语言:javascript
复制
$redis = new \Redis();
try {
    $redis->connect('redis', 6379);
} catch (\Exception $e) {
    var_dump($e->getMessage())  ;
    die;
}
票数 59
EN

Stack Overflow用户

发布于 2018-06-03 05:53:12

只需移除redis端口,并在Laravel项目redis文件中将redis主机名更改为.env。

代码语言:javascript
复制
REDIS_HOST=redis
#REDIS_PORT=6379
票数 14
EN

Stack Overflow用户

发布于 2018-11-29 22:41:35

如果您的网络使用静态ip,请在下面使用而不是本地主机。

代码语言:javascript
复制
$redis->connect('<static-ip>', 6379);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42360356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档