我正在尝试通过代码访问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为不同的服务创建了单独的docker容器。从逻辑上讲,每个容器就像不同的分离的计算机服务器,它们仅通过docker网络相互连接。
将此图中的每个方框视为一台单独的计算机,那么实际上就是您所拥有的:
+----------------------------------------------------------+ | your machine | +----------------------------------------------------------+ | +------ (virtual network by docker) -------+ | | | +-----------------+ +-------------------+ +----------------+ | "php" container | | "redis" container | | "db" container | +-----------------+ +-------------------+ +----------------+
您的PHP容器在“ localhost”中看不到任何Redis,因为其中没有Redis。就像在“ localhost”中看不到任何MySQL一样。您的redis在“ redis”容器中运行。您的MySQL在“ db”容器中运行。
使您感到困惑的是端口绑定指令(即ports在此定义中):
ports
redis: build: context: . dockerfile: Dockerfile_redis ports: - "6379:6379"
6379“ redis”容器的端口已绑定到您的计算机,但 仅 绑定到您的计算机。其他容器对端口绑定的访问权限不同。因此,即使您的计算机可以将其与“ 127.0.0.1:6379”连接,该php容器也无法执行此操作。
6379
php
如Docker Compose中的网络中所述,每个docker compose容器都可以通过使用服务名称作为主机名来访问其他容器。例如,按服务运行的编程php可以使用hostname访问MySQL服务db。
db
所以你应该用它的主机名连接redis redis
redis
$redis = new \Redis(); try { $redis->connect('redis', 6379); } catch (\Exception $e) { var_dump($e->getMessage()) ; die; }