Verbindung mit einem Docker-Compose-MySQL-Container verweigert den Zugriff, Docker, auf dem dasselbe Image ausgeführt wird, jedoch nicht

Ich habe einige Probleme mit der Verbindung zum mysql-Docker-Container, den ich mit docker-compose gestartet habe. Dies ist ein langer Beitrag (sorry!).

Hier ist meine docker-compose.yml-Datei:

db:
  image: mysql:5.7
  ports:
    - "3306:3306" # I have tried both ports and expose "3306". Still doesn't work 
  environment:
    - MYSQL_ROOT_PASSWORD="secret"
    - MYSQL_USER="django"
    - MYSQL_PASSWORD="secret"
    - MYSQL_DATABASE="myAppDB"

Dann

$> docker-compose build
db uses an image, skipping #expected!
$> docker-compose up
<<LOTS OF OUTPUT>>
gt; docker-compose build db uses an image, skipping #expected!
$> docker-compose build
db uses an image, skipping #expected!
$> docker-compose up
<<LOTS OF OUTPUT>>
gt; docker-compose up <<LOTS OF OUTPUT>>

OK, jetzt habe ich einen Docker Container Runner mysql: 5.7. Groß! Oder ist es? Beim Testen in meiner Django-App erhalte ich Betriebsfehler, die darauf hinweisen, dass der Benutzer keine Verbindung zur Datenbank herstellen darf. Ok, vielleicht ist es dann mein Django?

$> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
c7216f99ca0f        mysql:5.7           "docker-entrypoint.sh"   3 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp   sharpfin_db_1

$> docker-machine ip dev
192.168.99.100
$> mysql -h 192.168.99.100 -P 3306 -u django -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'django'@'192.168.99.1' (using password: YES)
gt; docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7216f99ca0f mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp sharpfin_db_1
$> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
c7216f99ca0f        mysql:5.7           "docker-entrypoint.sh"   3 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp   sharpfin_db_1

$> docker-machine ip dev
192.168.99.100
$> mysql -h 192.168.99.100 -P 3306 -u django -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'django'@'192.168.99.1' (using password: YES)
gt; docker-machine ip dev 192.168.99.100
$> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
c7216f99ca0f        mysql:5.7           "docker-entrypoint.sh"   3 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp   sharpfin_db_1

$> docker-machine ip dev
192.168.99.100
$> mysql -h 192.168.99.100 -P 3306 -u django -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'django'@'192.168.99.1' (using password: YES)
gt; mysql -h 192.168.99.100 -P 3306 -u django -p Enter password: ERROR 1045 (28000): Access denied for user 'django'@'192.168.99.1' (using password: YES)

ok Also vielleicht hat es etwas mit dem Herstellen einer Verbindung zum Docker-Compose-Container zu tun? Was ist, wenn ich versuche, eine Verbindung im Docker-Container herzustellen?

$> docker exec -it c7216f99ca0f /bin/bash
root@c7216f99ca0f:/#
root@c7216f99ca0f:/# mysql -u django -p                                                                                                                                                           
Enter password: 
ERROR 1045 (28000): Access denied for user 'django'@'localhost' (using password: YES)
gt; docker exec -it c7216f99ca0f /bin/bash root@c7216f99ca0f:/# root@c7216f99ca0f:/# mysql -u django -p Enter password: ERROR 1045 (28000): Access denied for user 'django'@'localhost' (using password: YES)

ok, Docker MySQL lässt mich keine Verbindung herstellen, weiß nicht warum. Mal sehen, was passiert, wenn ich dies ohne Docker-Compose versuche:

$> docker run --name run-mysql -e MYSQL_ROOT_PASSWORD="secret" -e MYSQL_USER="django" -e MYSQL_PASSWORD="secret" -e MYSQL_DATABASE="myAppDB" -p "3306:3306" mysql:5.7
<<LOTS OF OUTPUT SAME AS BEFORE>>
gt; docker run --name run-mysql -e MYSQL_ROOT_PASSWORD="secret" -e MYSQL_USER="django" -e MYSQL_PASSWORD="secret" -e MYSQL_DATABASE="myAppDB" -p "3306:3306" mysql:5.7 <<LOTS OF OUTPUT SAME AS BEFORE>>

Ok, jetzt haben wir also einen Container, in dem dasselbe Bild wie zuvor mit denselben Einstellungen ausgeführt wird. (Ich denke, diese Behauptung ist wahrscheinlich nicht wahr - docker-compose macht etwas anderes als docker run).

$> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
73071b929e82        mysql:5.7           "docker-entrypoint.sh"   3 minutes ago       Up 3 minutes        0.0.0.0:3306->3306/tcp   run-mysql
gt; docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73071b929e82 mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp run-mysql

Da ist mein Container (genannt run-mysql). Lass uns verbinden!

$> mysql -h 192.168.99.100 -P 3306 -u django -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myAppDB            |
+--------------------+
2 rows in set (0.01 sec)

mysql>
gt; mysql -h 192.168.99.100 -P 3306 -u django -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | myAppDB | +--------------------+ 2 rows in set (0.01 sec) mysql>

In Ordung. Kann mich einloggen. Das ist komisch ... Was ist mit aus dem Inneren des Containers?

$> docker exec -it 73071b929e82 /bin/bash
root@73071b929e82:/# mysql -u django -p                                                                                                                                                           
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.12 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myAppDB            |
+--------------------+
2 rows in set (0.00 sec)

mysql> 
gt; docker exec -it 73071b929e82 /bin/bash root@73071b929e82:/# mysql -u django -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.12 MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | myAppDB | +--------------------+ 2 rows in set (0.00 sec) mysql>

Ok, ich kann mich von außerhalb und innerhalb des Containers anmelden, wenn ich mit docker run starte, aber nicht mit docker-compose. Was ist los? Es muss etwas geben, das Docker-Compose hinter den Kulissen tut und das die Art und Weise ändert, wie die Datenbank initialisiert wird.

All das oben Genannte ist das gleiche, wenn ich es auch mit dem Root-Benutzer versuche. Es ist also kein Berechtigungsproblem für den Django-Benutzer.

Irgendwelche Ideen, wie man das löst?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage