(Es ist wahrscheinlich eine dumme Frage aufgrund meiner begrenzten Kenntnisse mit Docker oder der MySQL-Administration, aber da ich einen ganzen Abend mit diesem Thema verbracht habe, wage ich es, sie zu stellen.)
In einer Nussschale
Ich möchte MySQL in einem Docker-Container ausführen und von meinem Host aus eine Verbindung herstellen. Das Beste, was ich bisher erreicht habe, ist:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Mehr Details
Ich benutze folgendes Dockerfile
:
FROM ubuntu:14.04.3
RUN apt-get update && apt-get install -y mysql-server
# Ensure we won't bind to localhost only
RUN grep -v bind-address /etc/mysql/my.cnf > temp.txt \
&& mv temp.txt /etc/mysql/my.cnf
# It doesn't seem needed since I'll use -p, but it can't hurt
EXPOSE 3306
CMD /etc/init.d/mysql start && tail -F /var/log/mysql.log
In dem Verzeichnis, in dem sich diese Datei befindet, kann ich das Image erfolgreich erstellen und ausführen mit:
> docker build -t my-image .
> docker run -d -p 12345:3306 my-image
Wenn ich das Bild anhänge, scheint es gut zu funktionieren:
# from the host
> docker exec -it <my_image_name> bash
#inside of the container now
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
[...]
Allerdings habe ich vom Gastgeber nicht so viel Erfolg:
> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Noch mehr Details
- Ich habe gesehen, dass es eine Frage gibt, die meiner ähnelt . Es ist jedoch nicht dasselbe (und es gibt sowieso keine Antworten)
- Ich habe gesehen, dass es Bilder gibt , die MySQL gewidmet sind , aber ich hatte keinen größeren Erfolg damit
- Ich
grep -v
mag mich komisch fühlen. Zugegeben, es kann einen saubereren Weg geben, dies zu tun. Aber wenn ich mein Bild anhänge, kann ich beobachten, dass es tatsächlich wie erwartet funktioniert hat (dh: das entferntbind-address
). Und ich kann im Container sehen/var/log/mysql/error.log
:
Server-Hostname (Bindungsadresse): '0.0.0.0'; Port: 3306 - '0.0.0.0' wird in '0.0.0.0' aufgelöst; Auf IP erstellter Server-Socket: '0.0.0.0'.
quelle
Antworten:
Wenn Ihr Docker MySQL-Host ordnungsgemäß ausgeführt wird, können Sie von einem lokalen Computer aus eine Verbindung herstellen. Sie sollten jedoch Host, Port und Protokoll wie folgt angeben:
Ändern Sie 3306 in die Portnummer, die Sie vom Docker-Container weitergeleitet haben (in Ihrem Fall 12345).
Da Sie MySQL im Docker-Container ausführen, ist kein Socket verfügbar und Sie müssen eine Verbindung über TCP herstellen. Das Setzen von "--protocol" im Befehl mysql ändert dies.
quelle
--socket=/var/run/mysqld/mysqld.sock
2.--socket=/host/mysql.sock
--protocol=tcp
ließ die Verbindung endlich funktionieren. Vielen Dank an @maniekq für die nette Antwort und Ihre Erklärung zu den Steckdosen über Ihren Kommentar!Wenn Sie "127.0.0.1" anstelle von localhost verwenden, verwendet mysql die TCP-Methode und Sie sollten in der Lage sein, den Container mit folgenden Verbindungen zu verbinden:
quelle
Ich empfehle Docker-Compose. So würde das funktionieren:
Erstellen Sie eine Datei mit dem Namen docker-compose.yml, die folgendermaßen aussieht:
Führen Sie als Nächstes Folgendes aus:
Anmerkungen:
Jetzt können Sie folgendermaßen auf die MySQL-Konsole zugreifen:
Anmerkungen:
Sie können das Flag -d übergeben, um den mysql / mariadb-Container im getrennten / Hintergrundmodus auszuführen.
Das Passwort lautet "wp" und ist in der Datei docker-compose.yml definiert.
Gleicher Rat wie maniekq, aber vollständiges Beispiel mit Docker-Compose.
quelle
--protocol=tcp
hat alles für mich repariert. Danke dir!Die einfache Methode besteht darin, den MySQL-Unix-Socket für den Host-Computer freizugeben. Schließen Sie dann über die Steckdose an
Schritte:
mkdir /host
docker run -it -v /host:/shared <mysql image>
./etc/my.cnf
und den Socket-Eintrag in der Datei insocket=/shared/mysql.sock
service mysql restart
im Docker neumysql -u root --socket=/host/mysql.sock
. Wenn das Passwort verwendet wird, verwenden Sie die Option -pquelle
Wenn Sie Docker unter Docker-Maschine ausführen?
ausführen, um IP zu erhalten:
Gibt die IP für den Computer zurück und versucht, mysql zu verbinden:
quelle
Dazu führe ich einen temporären Docker-Container auf meinem Server aus, damit ich mir keine Gedanken darüber machen muss, was auf meinem Host installiert ist. Zuerst definiere ich, was ich brauche (was Sie für Ihre Zwecke ändern sollten):
Ich erstelle immer ein neues Docker-Netzwerk, das alle anderen Container benötigen:
Starten Sie einen mySQL-Datenbankserver:
Erfassen Sie die IP-Adresse des neuen Servercontainers
Öffnen Sie eine Befehlszeilenschnittstelle zum Server:
Dieser letzte Container entfernt sich selbst, wenn Sie die mySQL-Schnittstelle verlassen, während der Server weiter ausgeführt wird. Sie können auch ein Volume zwischen Server und Host freigeben, um den Import von Daten oder Skripten zu vereinfachen. Hoffe das hilft!
quelle
Denken Sie daran, Benutzer, Port und Host so zu ändern, dass sie Ihren Konfigurationen entsprechen. Das Flag -p ist erforderlich, wenn Ihr Datenbankbenutzer mit einem Kennwort konfiguriert ist
quelle
Für die Konvertierung , können Sie eine
~/.my.cnf
Datei im Host erstellen :Führen Sie das nächste Mal einfach den
mysql
MySQL-Client aus, um die Verbindung herzustellen.quelle
Ich konnte meinen SQL Server5.7, der auf meinem Host ausgeführt wird, mit dem folgenden Befehl verbinden: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p wobei die angegebene IP meine Host-IP und 3307 die ist Port in MySQL Docker forwaded. Nachdem Sie den Befehl eingegeben haben, geben Sie das Passwort für MyQL ein. Das ist es. Jetzt sind Sie mit dem MySQL Docker Container von Ihrer Host-Maschine verbunden
quelle
Führen Sie den folgenden Befehl aus, um den Container auszuführen
Führen Sie diesen Befehl aus, um die MySQL-Datenbank auf dem Host-Computer abzurufen
in deinem Fall ist es
quelle
--protocol=tcp
Flag hinzufügen, wie in mehreren anderen Kommentaren / Antworten beschrieben. In meinem Fall war es besonders verwirrend, weil auch eine lokale, nicht dockerisierte MySQL-Instanz ausgeführt wurde. Selbst wenn der Port angegeben ist, stellt der Befehl 'mysql' standardmäßig über die Socket-Datei eine Verbindung zur lokalen Instanz her, auch wenn der Port angegeben ist.mysql -u root -P <EXPOSED_DOCKER_PORT_HERE> -h <YOUR_HOST_IP_ADDRESS_HERE> --protocol=tcp -p
. Die Flagge--protocol=tcp
ist der Schlüssel, damit dies funktioniert.In Ihrem Terminal laufen:
docker exec -it container_name /bin/bash
Dann:mysql
quelle
OK. Ich habe dieses Problem endlich gelöst. Hier folgt meine in https://sqlflow.org/sqlflow verwendete Lösung .
Die Komplettlösung
Um die Demo in sich geschlossen zu machen, habe ich den gesamten erforderlichen Code nach https://github.com/wangkuiyi/mysql-server-in-docker verschoben .
Der Schlüssel zur Lösung
Ich verwende das offizielle Bild auf DockerHub.com https://hub.docker.com/r/mysql/mysql-server nicht . Stattdessen habe ich es mir selbst gemacht, indem ich MySQL unter Ubuntu 18.04 installiert habe. Dieser Ansatz gibt mir die Möglichkeit, mysqld zu starten und an 0.0.0.0 (alle IPs) zu binden. .
Einzelheiten finden Sie in meinen Zeilen in meinem GitHub-Repo.
So überprüfen Sie meine Lösung
apt-get
.Stellen Sie eine Verbindung von einem anderen Container auf demselben Host her
Wir können den MySQL-Client sogar von einem anderen Container (auf demselben Host) ausführen.
Stellen Sie eine Verbindung von einem anderen Host her
Auf meinem iMac installiere ich den MySQL-Client mit Homebrew.
Dann kann ich auf den obigen Ubuntu-Host (192.168.1.22) zugreifen.
Stellen Sie eine Verbindung von einem Container her, der auf einem anderen Host ausgeführt wird
Ich kann den MySQL-Client sogar in einem Container ausführen, der auf dem iMac ausgeführt wird, um eine Verbindung zum MySQL-Server in einem Container auf meiner Ubuntu-Workstation herzustellen.
Ein Sonderfall
Für den Fall, dass wir MySQL-Client und -Server in separaten Containern ausführen, die auf demselben Host ausgeführt werden. Dies kann passieren, wenn wir ein CI einrichten. Wir müssen kein eigenes MySQL-Server-Docker-Image erstellen. Stattdessen können wir das verwenden,
--net=container:mysql_server_container_name
wenn wir den Client-Container ausführen.So starten Sie den Server
Client starten
quelle
Docker run -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306: 3306 mysql
Docker Exec -it SQL-DB Bash
mysql -u root -p
quelle
ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
Ändern Sie "localhost" in Ihre echte Con-IP-Adresse,
da es sich um mysql_connect () handelt.
quelle