#php #docker #docker-compose #mariadb #symfony4
#php #docker #docker-compose #mariadb #symfony4
Вопрос:
У меня проблема с базой данных при запуске Symfony4
проекта.
docker-compose.yml
db:
environment:
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}
MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
MYSQL_USER: ${DATABASE_USERNAME}
image: 'mariadb/server:10.4'
ports:
- '3306:3306'
volumes:
- 'db-data:/var/lib/mysql'
.env
DATABASE_URL=mysql://symfony:symfony@db.localhost/symfony
###< doctrine/doctrine-bundle ###
DB_HOST=db.localhost
DB_NAME=symfony
DB_USERNAME=symfony
DB_PASSWORD=symfony
DATABASE_PORT=3306
DATABASE_HOST=db.localhost
DATABASE_USERNAME=symfony
DATABASE_PASSWORD=symfony
DATABASE_NAME=symfony
DATABASE_PORT=3306
PROJECT_NAME=oversight-api
Я получил ошибку Access denied for user symfony@172.18.0.1
Я не уверен, что 172.18.0.1
. Должен ли я добавить db.localhost
в /etc/hosts
?
Как решить эту проблему?
Комментарии:
1. Когда вы запускаете docker, он создает свою собственную сеть, 172.18.0.0 — это сеть, которую он создал для уровня docker. это позволяет вам пинговать docker-container2, когда вы сидите на docker-container1, не зная IP-адреса. Я думаю, очевидным вопросом было бы, вы создали пользователя symfony в контейнере MySQL и предоставили ему разрешение на доступ к базе данных?
2. @user1628449 Я ничего не делал, включая добавление
symfony
пользователя. Я только что выполнилdocker-compose up -d
3. @user1628449 это неправда. Контейнер настраивается с помощью переменных среды. В частности, пользователь, созданный с помощью переменных среды, является суперпользователем. Я смог развернуть контейнер локально с точной заданной конфигурацией.
Ответ №1:
Если вы используете Mac, вы можете разрешить URL базы данных с помощью host.docker.internal
. В другой ОС вы можете назвать свой контейнер с помощью container_name: my_db
в docker_compose.yaml и использование my_db
в качестве хоста
Комментарии:
1. Я использую Ubuntu
2. попробуйте назвать контейнер в этом случае, он должен разрешить IP сам по себе
Ответ №2:
Вместо подключения к 172.18.0.1
, мы можем подключиться к localhost
. Мы перенаправили порт контейнера 3306
на порт локальной машины 3306
, таким образом, порт доступен через localhost
.
Если docker-host является удаленной машиной, и мы хотим подключиться к контейнеру, запущенному на удаленной машине, нам нужно подключиться к сетевому адресу удаленной машины или DNS-имени (это имя / адрес в физической сети, а не во внутренней сети docker. По сути, адрес, который мы использовали бы для подключения к компьютеру по ssh).
Если мы хотим получить доступ к базе данных из другого контейнера в той же сети, мы можем ссылаться на контейнер по его имени.