Как подключиться к базе данных используя 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?
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
l3ftoverz
@l3ftoverz Куратор тега PHP
Люблю Финский металкор
В описании 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 ты можешь стучать из хоста в контейнер, по-дефолту контейнеры изолированы друг от друга.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 150 000 до 220 000 руб.
OV Global Санкт-Петербург
До 150 000 руб.
21 нояб. 2019, в 10:21
140000 руб./за проект
21 нояб. 2019, в 09:33
500 руб./за проект
21 нояб. 2019, в 09:12
3001 руб./за проект