Ошибка «Host '192.XXX.XXX.X' не разрешено подключаться к этому серверу MySQL» при попытке доступа к контейнеру MySQL Docker из другого контейнера - PullRequest
0 голосов
/ 03 июля 2019

У меня есть файл для создания докера, который создает один контейнер для запуска моего приложения (Ruby on Rails), а другой - для запуска сервера mysql.

version: "3"

volumes:
  test-db:
    external: false

services:
  db:
    image: mysql:5.7
    env_file: .env
    environment:
      MYSQL_DATABASE: test_development
      MYSQL_ROOT_PASSWORD: foobar
      MYSQL_USER: root
      MYSQL_PASSWORD: foobar
    volumes:
      - test-db:/var/lib/mysql
    ports:
      - "3306:3306"

  app:
    build:
      ./
    image: test_app:latest
    env_file: .env
    command: "rails server -b 0.0.0.0"
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true

Я выполняю в контейнере db и могу получить доступ кmysql cli, как и ожидалось.

$ docker exec -it test_db_1 mysql -pfoobar
Welcome to the MySQL monitor.  Commands end with ; or \g.

Однако, когда я пытаюсь получить доступ к серверу через контейнер приложения, меня встречает следующее.

 $ docker exec -it test_app_1 mysql -hdb -pfoobar
ERROR 1130 (HY000): Host '192.168.144.3' is not allowed to connect to this MySQL server 

Почему контейнер работает под управлением mysqlсервер не может получать запросы от контейнера тестового приложения?

Когда я запускаю docker ps, я вижу следующее:

 COMMAND                      PORTS                            
 "rails server -b 0.0…"       0.0.0.0:3000->3000/tcp           
 "docker-entrypoint.s…"       0.0.0.0:3306->3306/tcp, 33060/tcp

Ответы [ 2 ]

1 голос
/ 03 июля 2019

По умолчанию, когда вы запускаете контейнер MySQL, он автоматически создает пользователя root, которого вы используете для доступа к тому же контейнеру test_db_1 на основе переданных переменных среды, этому пользователю root разрешено / разрешено подключаться только с локального хоста.

Но если вы хотите получить доступ к MySQL из другого контейнера, вы должны создать пользователя, которому разрешено подключаться к базе данных с удаленного хоста (либо username@%, либо username@container-name) - поскольку каждый контейнер имеетдругой IP-адрес внутри сети по умолчанию для докера,

Примечание : вы можете сделать это, войдя в MySQL в контейнере и создать пользователя , в вашем случае это будетбыть что-то вроде: grant all on <your-database>@`%` to <yourusername>@`%` identified by '<password>'

0 голосов
/ 03 июля 2019
Опция

ports предоставляет порты для вашего хост-компьютера, но я не думаю, что это происходит между одинаковыми контейнерами. Попробуйте использовать expose: 3306 в конфигурации базы данных. Кстати, я хотел бы отметить, что, хотя вы используете опцию depends_on, которая не гарантирует, что ваша база данных будет работать, когда вы запустите свое приложение, только то, что контейнер db будет готов, так что имейте это в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...