Ich habe ein Docker-Mysql-Image ausgeführt. Nachfolgend sehen Sie die Datei docker-compose.yml:
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ""
MYSQL_ALLOW_EMPTY_PASSWORD: yes
ports:
- "3306:3306"
Das funktioniert gut.
Meine Frage ist: Wie kann ich über den Befehlszeilen-MySQL-Client auf dem Host (meinem Macbook) eine Verbindung zu der MySQL-Instanz herstellen, die in diesem Container ausgeführt wird?
Zu klären:
docker
-Befehl verwenden, um dies zu ermöglichen. Vielmehr möchte ich den mysql
-Client direkt vom Terminal aus nutzen (ohne durch einen Docker-Container zu tunneln).Da MySQL nicht lokal ausgeführt wird, sollte Port 3306 offen und einsatzbereit sein.
Der Befehl, den ich zum Starten des Containers verwende, lautet: docker-compose run
docker-compose up
verwendenDa Sie den Port 3306
auf Ihrem docker-Host veröffentlicht haben, würden Sie von diesem Host selbst eine Verbindung zu 127.0.0.1:3306
herstellen.
docker-compose run
verwendenIn diesem Fall wird der Abschnitt für die Portzuordnung der Datei docker-compose.yml
ignoriert. Um den Abschnitt für die Portzuordnung berücksichtigen zu können, müssen Sie die Option --service-ports
hinzufügen:
docker-compose run --service-ports db
Beachten Sie, dass der mysql-Client standardmäßig versucht, eine Verbindung über einen Unix-Socket herzustellen, wenn Sie ihn anweisen, eine Verbindung zu localhost
herzustellen. Verwenden Sie also 127.0.0.1
und nicht localhost
:
$ mysql -h 127.0.0.1 -P 3306 -u root
Willkommen beim MySQL-Monitor. Befehle enden mit; oder\g . Ihre MySQL-Verbindungs-ID lautet 1 Server-Version: 5.6.26 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle und/oder ihre verbundenen Unternehmen. Alle Rechte vorbehalten.
Oracle ist eine eingetragene Marke der Oracle Corporation und/oder ihrer Mitgliedsorganisationen. Andere Namen sind möglicherweise Marken ihrer jeweiligen Besitzer.
Geben Sie "help" ein. oder '\ h' um Hilfe. Geben Sie '\ c' ein, um die aktuelle Eingabeanweisung zu löschen.
mysql>
$ mysql -h localhost -P 3306 -u root
FEHLER 2002 (HY000): Es kann keine Verbindung zum lokalen MySQL-Server über den Socket '/var/run/mysqld/mysqld.sock' (2) hergestellt werden.
Ich habe es verstanden!! Die Antwort ist, die --service-ports
-Option zu verwenden, wenn Sie docker-compose
ausführen:
docker-compose run --service-ports db
(die ursprüngliche docker-compose.yml-Datei funktioniert einwandfrei)
Vielen Dank an alle für die Hilfe!
Eine einfache Möglichkeit, sich in einem Docker-Image bei MySQL anzumelden, ist:
Sudo docker exec -it <IMAGE_ID> mysql -u root -p
für root
ist das Standardkennwort nicht festgelegt. Es ist leer. Drücken Sie einfach die Eingabetaste, es sei denn, Sie haben das root-Kennwort geändert.
Bei erfolgreicher Ausführung erhalten Sie mit dem obigen Befehl eine mysql-Eingabeaufforderung.
Prost!
Stellen Sie über {Host ip}: 3306 eine Verbindung zu MySQL her, da Sie den internen Port als 3306 für Ihren Host verfügbar gemacht haben. Wenn Sie auf die MySQL-CLI-Tools zugreifen müssen, müssen Sie docker exec -it mycontainer bash
eingeben mit MySQL installiert, wenn sie nicht lokal auf dem Host installiert sind.
das hat für mich funktioniert.
/usr/local/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -p
Wenn Ihr Docker MySQL Host ordnungsgemäß ausgeführt wird, können Sie eine Verbindung vom lokalen Computer aus herstellen. Sie sollten jedoch Host, Port und Protokoll wie folgt angeben:
mysql -h localhost -P 3306 --protocol=tcp -u root
Da Sie MySQL im Docker-Container ausführen, ist Socket nicht verfügbar und Sie müssen eine Verbindung über TCP herstellen. Die Einstellung "--protocol" im Befehl mysql ändert dies.
Ihre Yml-Datei sieht gut aus.
Sie können einen Docker-Container direkt verbinden, da er bereits mit dem lokalen Port 3306 ..__ zugeordnet ist
mysql -h 127.0.0.1 -u root -p
Hinweis: Sie müssen Zugriff auf die Befehlszeile von mysql haben. Wenn der mysql-Befehl einen Fehler anzeigt, prüfen Sie '/ usr/local/mysql/bin'. Andernfalls können Sie keine Verbindung zum mysql-Server herstellen. In anderen Worten müssen Sie einen MySQL-Client auf Ihrem Rechner haben.