Подключение symfony к mysql в docker

Вопрос или проблема

У меня возникает эта ошибка:

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for db failed: nodename nor servname provided, or not known

Мой docker-compose выглядит следующим образом:

 services:
          db:
            image: mysql:latest
            container_name: db
            environment:
              MYSQL_ROOT_PASSWORD: weply
              MYSQL_DATABASE: weply
              MYSQL_USER: weply
              MYSQL_PASSWORD: weply
            ports:
              - "6033:3306"
            volumes:
              - dbdata:/var/lib/mysql
          phpmyadmin:
            image: phpmyadmin/phpmyadmin
            container_name: pma
            platform: linux/amd64
            links:
              - db
            environment:
              PMA_HOST: db
              PMA_PORT: 3306
              PMA_ARBITRARY: 1
            restart: always
            ports:
              - 8081:80
        
        ###< doctrine/doctrine-bundle ###
 volumes:
     dbdata:

И мой .env DATABASE_URL

DATABASE_URL="mysql://root:weply@db:3306/weply"

Я могу подключиться через браузер ( контейнер phpmyadmin :8080 ). Но когда я пытаюсь создать новую миграцию, это происходит. Не уверен, где мне установить это имя сервиса/имя узла.

Ответ или решение

Для успешного подключения Symfony к MySQL, работающему в Docker-контейнере, важно правильно настроить соединение и конфигурацию окружения. На основании представленной информации, у вас возникла ошибка:

SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for db failed: nodename nor servname provided, or not known

Возможные причины ошибки

  1. Недоступный хост базы данных: Это указывает на то, что контейнер Symfony (или Laravel) не может найти сервис базы данных с именем db. Это может происходить по нескольким причинам:

    • Контейнер с приложением Symfony не подключен к той же сети, что и контейнер базы данных.
    • Сервис базы данных не запущен или уже завершил работу.
  2. Неправильная конфигурация Docker Compose: Убедитесь, что ваш файл docker-compose.yml правильно настроен и что все сервисы находятся в одной сети.

Решение проблемы

1. Проверьте настройки сети

Docker по умолчанию создает собственную сеть для всех контейнеров, определенных в docker-compose.yml. Убедитесь, что все сервисы находятся в одной сети. Вы можете явно указать сеть, добавив к каждому сервису параметр networks.

Пример настройки:

version: '3.8'

services:
  db:
    image: mysql:latest
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: weply
      MYSQL_DATABASE: weply
      MYSQL_USER: weply
      MYSQL_PASSWORD: weply
    ports:
      - "6033:3306"
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - my_network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: pma
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
    restart: always
    ports:
      - 8081:80
    networks:
      - my_network

  # Ваши другие сервисы...

networks:
  my_network:

volumes:
  dbdata:

2. Проверка конфигурационного файла .env

Убедитесь, что строка подключения к базе данных в вашем файле .env корректна. Строка подключения должна связывать root пользователя с правильным хостом и портом, что в вашем случае уже выполнено:

DATABASE_URL="mysql://root:weply@db:3306/weply"

3. Запустите контейнеры заново

После внесения изменений в файл docker-compose.yml выполните полную перезагрузку ваших контейнеров:

docker-compose down
docker-compose up -d

Эти команды завершат работу всех контейнеров и запустят их заново, что обновит конфигурацию сети.

4. Проверка состояния контейнеров

Убедитесь, что все контейнеры работают корректно:

docker ps

Если контейнер с db не запущен, проверьте логи:

docker logs db

Это поможет вам выявить возможные ошибки, которые могут происходить при запуске MySQL.

5. Тестирование соединения

Для проверки соединения с базой данных можно использовать команду docker-compose exec:

docker-compose exec php php bin/console doctrine:database:create

Эта команда запросит создание базы данных через Symfony и проверит, правильно ли настроен доступ к MySQL.

Заключение

Эффективное подключение Symfony к MySQL в Docker-контейнерах требует корректной настройки сети, конфигурации .env и мониторинга состояния контейнеров. Следуя приведенным выше шагам, вы сможете устранить возникшие проблемы и успешно подключиться к базе данных. Если проблема не решается, рассмотрите возможность развертывания контейнеров с использованием docker-compose в режиме отладки для более подробного анализа ситуации.

Оцените материал
Добавить комментарий

Капча загружается...