Я искал в Интернете несколько часов, но не нашел решения своей проблемы. У меня есть 3 контейнера: - nginx - php - mysql
Все они подключены к одной сети.
Если я пытаюсь войти в систему mysql из mysql контейнер, все отлично работает. Если я пытаюсь установить соединение pdo из контейнера php с контейнером mysql, я всегда получаю сообщение «Доступ запрещен для пользователя». Понятия не имею почему. Позвольте мне показать вам, ребята, что происходит.
Это мой docker -компонентный файл:
version: ‘3’
networks:
danvers:
services:
#WebServer Service
danvers-nginx:
image: nginx:stable
container_name: danvers-nginx
ports:
- ‘8080:80’
volumes:
- ./:/var/www
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- danvers-php
- danvers-mysql-app
networks:
danvers:
#PHP Service
danvers-php:
build:
context: ./
dockerfile: Dockerfile
container_name: danvers-php
volumes:
- ./:/var/www
- ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
depends_on:
- danvers-mysql-app
networks:
danvers:
#MySQL Service for App Database
danvers-mysql-app:
image: mysql:5.7.22
container_name: danvers-mysql-app
restart: unless-stopped
tty: true
ports:
- “33061:3306”
environment:
- MYSQL_ROOT_PASSWORD=securerootpassword
- MYSQL_DATABASE={DB_APP_DATABASE}
- MYSQL_USER={DB_APP_USERNAME}
- MYSQL_PASSWORD=${DB_APP_PASSWORD}
volumes:
- danvers-app-data:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/my.cnf
networks:
danvers:
volumes:
danvers-app-data:
Если я go внутри контейнера danvers- php и открыть интерактив Оболочка для php и попытка сделать соединение pdo Я получаю это:
php > new PDO(‘mysql:host=danvers-mysql-app;dbname=danvers-app’, ‘d-app-conn-user’, ‘cable’);
Warning: Uncaught PDOException: SQLSTATE[HY000] [1045] Access denied for user ‘d-app-conn-user’@‘danvers-php.projectdanvers_danvers’ (using password: YES) in php shell code:1
Stack trace:
#0 php shell code(1): PDO->__construct(‘mysql:host=danv…’, ‘d-app-conn-user’, ‘cable’)
#1 {main}
thrown in php shell code on line 1
Соединение установлено, как я вижу входящий запрос в журнале от danvers- mysql -app. Здесь кажется странным, что пользовательский формат ошибки выглядит странно. Я понятия не имею, откуда взялся «danvers- php .projectdanvers_danvers». Это объединение контейнера php и сети, в которой находятся контейнеры. Я думаю, именно поэтому доступ запрещен, потому что я понятия не имею, как это изменить, поскольку я предположил, что вместо этого должно быть имя mysql контейнера.
Кто-нибудь знает, что я здесь делаю неправильно?
Спасибо за любой ответ или отзыв.
РЕДАКТИРОВАТЬ:
В моем mysql контейнере я вошел в систему с root и получил этот список пользователей:
+ ----------------- + ----------- +
| пользователь | host |
+ ----------------- + ----------- +
| d-app-conn-user | % |
| root | % |
| mysql .session | localhost |
| mysql .sys | localhost |
| root | localhost |
+ ----------------- + ----------- +
Вывод от выбранного пользователя, host from mysql .user
% для имени хоста означает, что имя хоста не имеет значения, если имя пользователя правильное, я должен иметь возможность войти в систему. Учетные данные работают изнутри контейнера mysql, но когда соединение устанавливается из другого контейнера, оно завершается ошибкой. Если я пытаюсь установить соединение с SequelPro с моей локальной машины через порт 33061, это также работает. Проблема существует, только если это межконтейнерное соединение.
EDIT2:
Поэтому я изменил конфигурацию nginx и php с помощью конфигурации php: 7.4- apache в моем Dockerfile и Теперь эта проблема больше не существует. Я могу войти в контейнер mysql из контейнера php. Проблема связана с веб-сервером Nginx.