Andockfenster Redis-Connection refused
Ich versuche, auf der Redis-server durch den code, und es ist nicht anschließen. Aber wenn ich die bash auf der redis-container kann ich den Zugriff auf die redis-cli.
docker-Komponieren.yml sieht wie folgt aus
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
Wenn ich versuche, die Verbindung zum redis-server mit diesem code
$redis = new \Redis();
try {
$redis->connect('127.0.0.1', 6379);
} catch (\Exception $e) {
var_dump($e->getMessage()) ;
die;
}
Gibt es diese Warnung
Warning: Redis::connect(): connect() failed: Connection refused
Wer weiß, wie die connect-Redis-container die PHP-container ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihr Problem
Docker Compose schafft getrennt docker-container für verschiedene Dienste. Die einzelnen container sind, logisch gesehen, wie verschiedene getrennte computer-Servern, die nur miteinander verbunden durch docker Netzwerk.
Betrachten die einzelnen Felder in diesem Diagramm als ein einzelner computer, dann ist das praktisch, was Sie haben:
Ihre PHP-container nicht sehen redis in "localhost", weil es keine redis in es. Genau wie Sie würde nicht sehen, dass MySQL in "localhost". Ihre redis läuft in der "redis" - container. Ihre MySQL ausgeführt wird, in Ihren "db" - container.
Die Dinge, die dich verwirrt, ist der port verbindliche Richtlinien (z.B.
ports
in dieser definition):Hafen
6379
von der "redis" - container ist gebunden an Ihren computer, aber Ihrem computer NUR. Andere container nicht den gleichen Zugang zu den port-Bindungen. So auch Ihr computer kann verbinden Sie es mit '127.0.0.1:6379', diephp
container nicht das gleiche.Lösung
Wie beschrieben in Vernetzung in Docker Compose, jedes docker compose-container kann Zugriff auf die anderen container mit dem service-Namen als hostname. Zum Beispiel, Ihre Programmierung ausführen von service
php
können den Zugriff auf Ihre MySQL-Dienst mit dem Hostnamendb
.Also sollten Sie verbinden redis mit seinem hostname
redis
entfernen Sie einfach die redis port, und ändern Sie die redis hostname zu
redis
in eurer Laravel Projekt .env-Datei.Wenn Sie eine statische ip für Ihre Netzwerk verwenden unten statt "localhost"
docker-Komponieren.yml Config
Beispiel