Не удается подключиться между контейнером MySQL и PHP в докере - PullRequest
0 голосов
/ 28 января 2019

Пытаюсь подключиться к mysql 8 (mysql: latest) из php: latest image (без apache или nginx), и я получаю эту досадную ошибку:

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused in /src/conn.php:5
Stack trace:
#0 /src/conn.php(5): PDO->__construct('mysql:host=data...', 'root', '12345678')
#1 {main}
  thrown in /src/conn.php on line 5

Я искал +20 решений здесь, на stackoverflow, но ни одно из них не смогло решить мою проблему.Я могу без проблем подключиться с помощью MySQL Workbench или DataGrid, используя следующие учетные данные:

сервер: локальный пользователь: root pass: 12345678

Но любая конфигурация, которую я использую наphp image Я не могу связать их друг с другом.

Мой файл docker-compose:

version: '3'
services:
  composer:
    container_name: composer
    networks:
      - backend
    image: composer
    volumes:
      - .:/app
    command: install
  database:
    container_name: mysql
    networks:
      - backend
    image: mysql:latest
    volumes:
      - ./database/mysqldata:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: 12345678
      MYSQL_DATABASE: testdb
    ports:
      - "3306:3306"
  php:
    build:
      context: .
    container_name: php
    networks:
      - backend
    image: php:apache
    links:
      - database
    env_file:
      - .env
    volumes:
      - .:/
    command:
      php /src/conn.php
    depends_on:
      - composer
      - database
networks:
  backend:

Мой conn.php:

<?php
    $db = new PDO('mysql:host=database;dbname=testdb', 'root', '12345678');

Что ядо сих пор пытался решить проблему:

  1. Изменить хост conn.php на 127.0.0.1
  2. Изменить хост conn.php на localhost
  3. Пробовал использоватьmysqli (получил также отказано в соединении)
  4. Пробовал другие php образы (с apache, nginx и т. д.)
  5. Пробовал использовать mysql в качестве хоста

PS: Я использую Docker для Mac

После 5 часов исследований я действительно не знаю, что еще делать, и, поскольку я не эксперт по докеру, был бы признателен за любую помощь, чтобы указать мнеНаправление исправления.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 января 2019

удалось найти решение.Оказывается, мне нужно подождать, пока служба MySQL станет доступной, прежде чем я запустю скрипт php.Поэтому я использовал решение wait-for-it и сделал это в docker-compose:

 command: >
      bash -c "chmod +x /docker/./wait-for-it.sh
      && /docker/./wait-for-it.sh database:3306 -- echo 'database is up'
      && php phpscript.php"

Спасибо за помощь

0 голосов
/ 28 января 2019

В вашем случае вы не можете подключиться к mysql через localhost или 127.0.0.1.Если вы подключитесь так.Это вызов localhost inside php контейнера.Но в вашем php-контейнере нет установки mysql.

Вы должны подключиться через имя контейнера.Или docker inspect контейнер MySQL и получите контейнер IP.Например, с вашим docker-compose

database:
    container_name: mysql

Теперь ваш хост базы данных mysql mysql - вместо него имя контейнера localhost

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...