2017-10-19 5 views
0

Ich bin in Symfony gewürzt, aber ziemlich neu für Docker, und ich habe eine "Verbindung abgelehnt Fehler", die ich nicht lösen kann.Symfony + Docker, Verbindung verweigert

ziemlich sicher, es ist ein Anfänger Fehler und dass die Lösung hier ist ganz einfach ...

Hier ist der Inhalt meiner docker-compose Datei ist:

version: '3.2' 

services: 
    cg-demo: 
     build: docker/cg-demo 
     container_name: cg-demo 
     working_dir: /var/www/html 
     volumes: 
      - .:/var/www/html 
      - ./docker/demo/vhost.conf:/etc/apache2/sites-available/000-default.conf:ro 
      - ./docker/demo/php.ini:/usr/local/etc/php/php.ini:ro 
      - ~/.ssh:/var/www/.ssh 
      - ~/.composer:/var/www/.composer 
     environment: 
      - SYMFONY_ENV 
      - DOMAIN_NAME: cg-demo.docker 
      - VIRTUAL_HOST: cg-demo.docker 
     depends_on: 
      - database 
     env_file: .env 
     ports: 
      - 8000:80 

    database: 
     image: percona:5.6 
     ports: 
      - 3306:3306 
     expose: 
      - 3306 
     container_name: cg-demo-database 
     volumes: 
      - /docker/database:/etc/mysql/conf.d 
     environment: 
      MYSQL_ROOT_PASSWORD: root 
      MYSQL_DATABASE: demo 
     tmpfs: 
      - /var/lib/mysql 
      - /tmpfs:size=300M 

Dies wird von einem anderen Projekt stützt, die funktioniert, aber ich bin mir nicht sicher, was hier passiert ...

Ich habe auch einen phpmyadmin Container, hier nicht gezeigt. PhpMyAdmin verbindet sich korrekt mit der Datenbank und kann sie problemlos von jedem Webserver aus benutzen. Doch wenn es um die symfony Behälter kommt, ich habe diese, wann immer versucht, die Datenbank zu verwenden:

[Doctrine\DBAL\Exception\ConnectionException] 
An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused 

[Doctrine\DBAL\Driver\PDOException] 
SQLSTATE[HY000] [2002] Connection refused 

[PDOException] 
SQLSTATE[HY000] [2002] Connection refused 

Die Verbindungsinformationen ist die folgende, in einer .env Datei:

# Database credentials 
DATABASE_HOST=database 
DATABASE_PORT=3306 
DATABASE_USER=root 
DATABASE_PASSWORD=root 
DATABASE_DB=cg-demo 

docker ps Aufruf gibt mir diese :

CONTAINER ID  IMAGE     COMMAND    
CREATED    STATUS     PORTS     NAMES 
16a67dadeebb  phpmyadmin/phpmyadmin "/run.sh phpmyadmin"  15 minutes ago  Up 15 minutes    0.0.0.0:8001->80/tcp cg.phpmyadmin.docker 
8bd783aa1dd1  cg_cg-demo   "entrypoint.sh apa..." 15 minutes ago  Up 15 minutes    0.0.0.0:8000->80/tcp cg-demo 
2fc7cd9105ba  percona:5.6   "docker-entrypoint..." 15 minutes ago  Up 15 minutes (healthy) 3306/tcp    cg-database 

ich ping database aus dem Demo-Container versucht haben und es funktioniert ...

EDIT 1:

addierten die folgenden auf die Datenbank-Container:

ports: 
    - 3306:3306 

EDIT 2:

folgendes aus allen Behältern entfernt:

networks: 
    - default 

EDIT 3:

Meine Lehre Konfiguration in app/config/config.yml:

dbal: 
    host:  "%env(DATABASE_HOST)%" 
    port:  "%env(DATABASE_PORT)%" 
    dbname: "%env(DATABASE_DB)%" 
    user:  "%env(DATABASE_USER)%" 
    password: "%env(DATABASE_PASSWORD)%" 
    charset: UTF8 
    mapping_types: 
     enum: string 
    server_version: 5.6 

EDIT 4:

addierten die folgenden auf die Datenbank-Konfiguration:

expose: 
    - 3306 
+0

Sie haben den Port für MySQL belichten, wie Sie mit 'cg-demo' tat Service –

+0

Vielen Dank für Ihr Feedback. Der Beitrag wurde aktualisiert (funktioniert immer noch nicht) – Zephyr

+0

Eine weitere Sache, hatte ich ein ähnliches Problem, und ich entfernte die "Netzwerke" -Attribut von den Diensten und es funktionierte –

Antwort

0

Sie müssen aussetzen die Ports (über expose:) im internen Netzwerk des Dockers (s) nicht nur an den Host weitergeleitet (über ports:), damit ein anderer Container sich mit ihnen verbinden kann.

Es ist normal, dass ping funktioniert, aber die Ports (d. H. 3306 in Ihrem Fall) wird durch Docker Firewall blockiert, wenn Sie es nicht explizit verfügbar machen.

Folgendes Ihre compose-Datei hinzufügen:

services: mysql: 
    # [..] 
    expose: 
     - 3306 

ferner sicher, dass MySQL auf ALLE Netzwerkgeräten überwacht. Der Standard (zumindest unter Ubuntu) besteht darin, nur auf localhost, aka, zu hören. die Loopback-Schnittstelle (127.0.0.1). Sie benötigen die folgende Zeile in der MySQL-Konfiguration.

bind-address=0.0.0.0 
+0

Vielen Dank für Ihre Hilfe! Trotzdem funktioniert es nicht. Ich habe die 'bind-address' -Klausel zu mysql conf und' expose' ohne Erfolg hinzugefügt. – Zephyr

Verwandte Themen