Как подключиться к базе данных используя Docker?

Написал `docker-compose` файл со следующим содержанием:

version: '2'

services:
  php:
    image: chialab/php:7.3-fpm
    container_name: exchange-php
    working_dir: /app
    volumes:
      - .:/app
    environment:
      - APP_ENV=test

  mysql:
    image: mysql:5.7
    container_name: exchange-mysql
    volumes:
      - './docker/mysql/my.cnf:/etc/mysql/my.cnf'
    ports:
      - 33060:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test_db
      - MYSQL_USER=test_user
      - MYSQL_PASSWORD=test_password


Хочу подключиться к базе данных:

docker exec exchange-php php -r "new PDO('mysql:host=exchange-mysql;port=33060;charset=utf8', 'test_user', 'test_password');"


Получаю ошибку: `SQLSTATE[HY000] [2002] Connection refused`

Захожу в контейнер mysql и проверяю слушает mysql все IP:

$ docker exec -it exchange-mysql bash
$ mysqld --verbose --help | grep bind-address

  --bind-address=name IP address to bind to.
bind-address                                                 0.0.0.0


Так же проверил, что пользователю разрешена авторизация:

mysql> SELECT host, user FROM mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | root          |
| %         | test_user     |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
5 rows in set (0.00 sec)


Что необходимо сделать, что бы осуществить подключения к mysql используя php и docker?
  • Вопрос задан
  • 888 просмотров
Решения вопроса 1
l3ftoverz
@l3ftoverz Куратор тега PHP
Нет ничего лучше, чем музыка DGD.
В описании PHP контейнера нужно линкануть MySQL контейнер, после чего MySQL будет доступна по адресу, равному имени сервиса, не имени контейнера.

Т.е.:
version: '2'

services:
  php:
    image: chialab/php:7.3-fpm
    container_name: exchange-php
    working_dir: /app
    volumes:
      - .:/app
    environment:
      - APP_ENV=test
    links:
      - mysql

  mysql:
    image: mysql:5.7
    container_name: exchange-mysql
    volumes:
      - './docker/mysql/my.cnf:/etc/mysql/my.cnf'
    ports:
      - 33060:3306
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=test_db
      - MYSQL_USER=test_user
      - MYSQL_PASSWORD=test_password


Коннектиться в php по адресу mysql.

bind-address 0.0.0.0

По 0.0.0.0 ты можешь стучать из хоста в контейнер, по-дефолту контейнеры изолированы друг от друга.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы