Kann nicht auf mysql Docker zugreifen

Ich benutze docker-compose erstellen mysql Container. Ich bekomme Host-IP 172.21.0.2.Aber wenn ich MySQL verbinde. Ich bekomme einen Fehler:

  1. Mein 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. Holen Sie sich meine Host-IP docker inspect db_mysql_1 | grep IPAddress

    "IPAddress": "172.21.0.2",

  3. Zugriff auf 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

Wie kann ich eine Verbindung zum MySQL-Container herstellen?

Sie können beim Starten des MySQL-Containers eine zusätzliche Umgebungsvariable übergeben MYSQL_ROOT_HOST=<ip> dadurch wird ein Root-Benutzer mit der Berechtigung zum Anmelden von der angegebenen IP-Adresse erstellt. Für den Fall, dass Sie die Anmeldung von einer beliebigen IP-Adresse aus zulassen möchten, können Sie Folgendes angeben MYSQL_ROOT_HOST=%.

Dies funktioniert nur für neu erstellte Container.

Beim Spinnen neuer Behälter:

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

In der Compose-Datei wäre es:

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

In meinem Fall. Ich habe die Volumes-Konfiguration gelöscht und es hat funktioniert.

So hat es bei mir funktioniert:

MYSQL_ROOT_HOST: '%'

Das hat bei mir funktioniert:

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

ändern mysql1 zu Ihrem Containernamen.

PS: Ich benutze nicht docker-compose.

Wenn Sie eine Verbindung zu einem MySQL-Server herstellen, wird überprüft, ob dies der Fall ist GRANT tabelle (die Tabelle "Benutzer" in der Datenbank "mysql| auf dem MySQL-Server) gegen die IP-Adresse des verbindenden MySQL-Clientcomputers. Wenn es KEINE PASSENDEN EINTRÄGE in der Spalte "host" in der Tabelle "user" in der Datenbank "mysql", MySQL wird DIE VERBINDUNG SOFORT SCHLIEßEN mit ERROR 1130.

Überprüfen Sie, ob der Client auf Port 3306 (den MySQL-Port) auf dem Datenbankserver zugreifen kann:

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

Sie sollten sich beim MySQL-Server anmelden und "mysql" ausführen, um die Grants-Tabelle zu überprüfen:

# 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      |

"root" is berechtigt, von mehreren IP-Adressen aus eine Verbindung herzustellen, jedoch nicht von der Client-IP 172.21.0.1. Fügen Sie also einfach GRANT-Zugriff von dieser IP hinzu:

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)

Überprüfen Sie dann Ihre Verbindung.