Не удается подключиться к базе данных в docker-compose - PullRequest
0 голосов
/ 24 июня 2019

Это мой docker-compose.yaml

version: "3.1"
services:
  mysql:
    image: mysql:8.0.13
    container_name: project-mysql
    volumes:
      - ./docker/data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: db
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: secret
    ports:
      - "3306:3306"

  webserver:
    image: nginx:alpine
    container_name: project-webserver
    working_dir: /var/www
    volumes:
      - .:/var/www
      - ./docker/config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"

  php-fpm:
    build: ./docker/config/php
    container_name: project-php-fpm
    working_dir: /var/www
    volumes:
      - .:/var/www
    environment:
      XDEBUG_CONFIG: remote_host=172.17.0.1
      PHP_IDE_CONFIG: serverName=docker

Проблема в том, что php-контейнер не может подключиться к mysql.Хотя с хоста я могу подключиться с mycli -h 127.0.0.1 -P 3306 -u root.Но когда я выполняю exec в php-контейнере и пробую его, получаю сообщение «Отказано в соединении»

Ответы [ 3 ]

1 голос
/ 24 июня 2019

Служба mysql связывает порт сервера mysql с 3306 до 3306 хост-машины.Таким образом, это нормально, что вы можете подключиться с хоста.

Изнутри контейнера php, localhost ссылается на этот конкретный контейнер, как сказал @David Maze в комментариях.

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

Попробуйте это из php контейнера:

mycli -h mysql -P 3306 -u root

1 голос
/ 24 июня 2019

Вы можете связаться с пользователем root.Но в вашем файле docker-compose вы подключаетесь через пользователя dbuser.Дайте мне знать, если это не проблема.

0 голосов
/ 24 июня 2019

Как правило, отказ в соединении вы получаете, когда запрос приходит с другого ip, чем его bind-адрес. Попробуй ниже должно сработать.

  • Убедитесь, что конфигурация mysql my.cnf или другие конфигурации по умолчанию не блокируют подключение извне (проверьте bind-address в конфигурации MySQL, если это 127.0.0.1 только его разрешить подключение формы локально, я бы сейчас сделать это 0.0.0.0 или прокомментировал эту строку, если существует)
    • mysqld --verbose --help => вы увидите все опции
    • mysqld --verbose --help | grep bind-address => проверить адрес привязки
  • Убедитесь, что у пользователя, которому я пытался войти, достаточно прав подключиться (SELECT user,host FROM mysql.user;) проверить ваш пользователь может подключиться из Docker Network => 172.* или в любом месте => %
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...