Не удается получить доступ к докеру mysql

Я использую docker-compose создавать mysql контейнер. Я получаю IP-адрес хоста 172.21.0.2.Но когда я подключаю mysql. Я получаю ошибку:

  1. Мой docker-compose.yml:

    version: '2'services:### Mysql container    mysql:      image: mysql:latest      ports:       - "3306:3306"      volumes:       - /var/lib/mysql:/var/lib/mysql     environment:       MYSQL_ROOT_PASSWORD: root       MYSQL_DATABASE: test_db       MYSQL_USER: test       MYSQL_PASSWORD: test_pass
  2. Получить IP-адрес моего хоста docker inspect db_mysql_1 | grep IPAddress

    "IPAddress": "172.21.0.2",

  3. Доступ к mysql: mysql -h 172.21.0.2 -P 3306 -u root -proot.

    ERROR 1130 (HY000): Host '172.21.0.1' is not allowed to connect to this MySQL server

Как я могу подключиться к контейнеру mysql?

Вы можете передать дополнительную переменную среды при запуске контейнера MySQL MYSQL_ROOT_HOST=<ip> это создаст пользователя root с разрешением на вход с заданного IP-адреса. В случае, если вы хотите разрешить вход с любого IP-адреса, вы можете указать MYSQL_ROOT_HOST=%.

Это будет работать только для вновь созданных контейнеров.

При вращении нового контейнера:

docker run --name some-mysql -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

В файле compose это было бы:

version: '2'services:  ### Mysql container  mysql:    image: mysql:latest    ports:      - "3306:3306"    volumes:      - /var/lib/mysql:/var/lib/mysql    environment:      MYSQL_ROOT_PASSWORD: root      MYSQL_DATABASE: test_db      MYSQL_USER: test      MYSQL_PASSWORD: test_pass      MYSQL_ROOT_HOST: '%'  # needs to be enclosed with quotes

В моем случае. Я удалил конфигурацию томов, и это сработало.

Таким образом, это сработало для меня:

MYSQL_ROOT_HOST: '%'

Это то, что сработало для меня:

docker exec -it mysql1 mysql -u root -pupdate mysql.user set host='%' where user='root' and host = 'localhost';flush privileges;

менять mysql1 к вашему имени контейнера.

P.S: Я не использую docker-compose.

Когда вы подключаетесь к серверу MySQL, он проверяет, что он GRANT таблица (таблица "user" в "mysql| database на сервере MySQL) против IP-адреса подключающегося клиентского компьютера MySQL. Если есть НЕТ СОВПАДАЮЩИХ ЗАПИСЕЙ в столбце "хост" в таблице "пользователь" в базе данных "mysql", MySQL НЕМЕДЛЕННО ЗАКРОЕТ СОЕДИНЕНИЕ с ERROR 1130.

Проверьте, может ли клиент получить доступ к порту 3306 (порт MySQL) на сервере базы данных:

telnet 172.21.0.2 3306Trying ::1...Connected to 172.21.0.2.Escape character is '^]'.

Вы должны войти на сервер MySQL и запустить "mysql", чтобы проверить таблицу грантов:

# mysql mysqlmysql> SELECT host,user FROM user;+-----------------+-----------+| host            | user      |+-----------------+-----------+| 172.21.0.5      | root      || 172.21.0.4      | root      || 127.0.0.1       | root      || ::1             | root      || localhost       | root      |

"корень" является авторизован для подключения с нескольких IP-адресов, но не с клиентского IP 172.21.0.1. Итак, просто добавьте ПРЕДОСТАВИТЬ доступ с этого IP:

mysql> GRANT ALL PRIVILEGES ON root.* TO 'your_db'@'172.21.0.1' IDENTIFIED BY 'Password';Query OK, 0 rows affected (0.00 sec)mysql> FLUSH PRIVILEGES;Query OK, 0 rows affected (0.00 sec)

Затем проверьте свое соединение.