Как настроить доступ из контейнера Docker к локальному серверу MySQL?

Как настроить подключение php в Docker-контейнере к внешней базе данных MySQL, расположенной на localhost? У меня есть проблемы с подключением к базе данных после настройки контейнера с PHP 7.4 через docker-compose.yaml. Я пробовал использовать extra_hosts и host-mode, но они не решают проблему. Буду благодарен за помощь, если кто-то уже решал такую задачу.
  • 4 октября 2023 г. 9:47
Ответы на вопрос 3
Для настройки доступа из контейнера Docker к локальному серверу MySQL вам потребуется выполнить несколько шагов.

1. Установите контейнер MySQL на ваш локальный сервер. Вы можете использовать официальный образ MySQL из Docker Hub и запустить его с помощью команды `docker run`.

```shell
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -d mysql:latest
```

В данном примере мы создаем контейнер с именем `mysql-container` и проксируем порт 3306, необходимый для подключения к серверу MySQL.

2. Укажите необходимые параметры подключения к серверу MySQL в вашем файле `docker-compose.yaml` для контейнера с PHP. Ниже приведен пример конфигурации:

```yaml
version: '3'
services:
  php:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./source:/var/www/html
    ports:
      - 8080:80
    depends_on:
      - mysql
  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=password
    ports:
      - 3306:3306
```

Обратите внимание, что в разделе `services` добавлен сервис MySQL, который использует официальный образ MySQL и указывает пароль root пользователя MySQL.

3. В вашем PHP-коде укажите соответствующие параметры подключения к серверу MySQL. Ниже приведен пример PHP-кода для подключения к серверу MySQL:

```php
<?php
$host = 'mysql';
$port = 3306;
$dbname = 'db_name';
$username = 'root';
$password = 'password';

$dsn = "mysql:host=$host;port=$port;dbname=$dbname";

try {
    $db = new PDO($dsn, $username, $password);
    echo "Connected to the database";
} catch (PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}
?>
```

В приведенном выше примере мы используем `mysql` в качестве значения параметра хоста, чтобы обращаться к сервису MySQL, запущенному в контейнере Docker.

4. Запустите контейнеры из вашего файла `docker-compose.yaml` с помощью команды `docker-compose up`.

```shell
docker-compose up
```

Теперь ваш контейнер с PHP будет иметь доступ к локальному серверу MySQL через настроенное подключение.

Обратите внимание, что имя хоста `mysql`, используемое в конфигурации PHP, соответствует значению, указанному в `depends_on` для сервиса `php` в файле `docker-compose.yaml`. Если вы измените имя сервиса в `docker-compose.yaml`, убедитесь, что оно соответствует имени хоста в PHP-коде.

Также убедитесь, что проксирование портов выполнено правильно в файле `docker-compose.yaml`, чтобы контейнер с PHP мог подключаться к серверу MySQL. В приведенном выше примере мы использовали проксирование порта 3306 для контейнера MySQL и 8080 для контейнера PHP. Убедитесь, что эти порты не используются другими сервисами на вашем локальном сервере.
Хост-машина можно найти по адресу "host.docker.internal", о котором подробнее можно прочитать в справочнике Docker:https://docs.docker.com/desktop/networking/#i-want... 
 Чтобы найти хост-машины используйте адрес "host.docker.internal", с подробностями можно ознакомиться в документации Docker:https://docs.docker.com/desktop/networking/#i-want...

Нельзя выполнить команду ```docker-compose``` в под и контейнере в одну строку, использовать ```shell```. Обычно результат, который работает..
Похожие вопросы