webentwicklung-frage-antwort-db.com.de

Stellen Sie vom Host aus eine Verbindung zu mysql in einem Docker-Container her

(Es ist wahrscheinlich eine blöde Frage, da ich nur begrenzte Kenntnisse über Docker oder die Verwaltung von MySQL habe, aber da ich einen ganzen Abend mit diesem Thema verbracht habe, wage ich es, es zu fragen.)

Auf den Punkt gebracht

Ich möchte mysql in einem Docker-Container ausführen und von meinem Host aus eine Verbindung dazu 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)

Weitere Details

Ich benutze die folgenden 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

> docker build -t my-image .
> docker run -d -p 12345:3306 my-image

Wenn ich an das Bild anhänge, scheint es ganz 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 Host 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 wie meine aussieht . Es ist jedoch nicht dasselbe (und es hat sowieso keine Antwort)
    • Ich habe gesehen, dass es Bilder gibt die MySQL gewidmet sind , aber ich hatte keinen größeren Erfolg damit
    • Mein grep -v fühlt sich vielleicht komisch an. Zugegeben, es gibt vielleicht eine sauberere Möglichkeit, dies zu tun. Aber wenn ich an mein Bild angehängt bin, kann ich beobachten, dass es tatsächlich wie erwartet funktioniert hat (dh: den bind-address entfernt). Und ich kann im Container /var/log/mysql/error.log sehen

Server-Hostname (Bindeadresse): '0.0.0.0'; Port: 3306 - '0.0.0.0' wird in '0.0.0.0' aufgelöst; Server-Socket erstellt auf IP: '0.0.0.0'.

46
gturri

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

Ändern Sie 3306 in die Portnummer, die Sie aus dem Docker-Container weitergeleitet haben (in Ihrem Fall ist es 12345).

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.

80
maniekq

Wenn Sie "127.0.0.1" anstelle von localhost verwenden, verwendet mysql die tcp-Methode, und Sie sollten in der Lage sein, Container mit folgendem zu verbinden: 

mysql -h 127.0.0.1 -P 3306 -u root
30
Vasili Pascal

Ich empfehle Docker-Compose. So würde das funktionieren:

Erstellen Sie eine Datei namens docker-compose.yml, die wie folgt aussieht:

version: '2'

services:

  mysql:
    image: mariadb:10.1.19
    ports:
      - 8083:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wp

Als nächstes ausführen: 

$ docker-compose up

Anmerkungen:

Nun können Sie so auf die MySQL-Konsole zugreifen:

$ mysql -P 8083 --protocol = tcp -u root -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.5-10.1.19-MariaDB-1~jessie mariadb.org binary distribution

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>

Anmerkungen: 

  • Sie können das Flag -d übergeben, um den mysql/mariadb-Container im detached/background-Modus auszuführen.

  • Das Kennwort lautet "wp" und ist in der Datei docker-compose.yml definiert.

  • Gleiche Ratschläge wie maniekq, aber ausführliches Beispiel mit Docker-Compose.

15
l3x

Die einfache Methode besteht darin, den Mysql-Unix-Socket für den Host-Computer freizugeben. Dann durch die Steckdose verbinden 

Schritte:

  • Erstellen Sie einen freigegebenen Ordner für den Host-Computer, z. B .: mkdir /Host
  • Führen Sie den Docker-Container mit der Volume-Mount-Option docker run -it -v /Host:/shared <mysql image> aus.
  • Ändern Sie dann die MySQL-Konfigurationsdatei /etc/my.cnf und ändern Sie den Socket-Eintrag in der Datei in socket=/shared/mysql.sock.
  • Starten Sie den MySQL-Dienst service mysql restart im Andockfenster neu
  • Verbinden Sie sich schließlich über den Socket mysql -u root --socket=/Host/mysql.sock vom Host aus mit dem MySQL-Server. Wenn das Kennwort verwendet wird, verwenden Sie die Option -p
11
Jobin

wenn Sie Docker unter Docker-Maschine laufen lassen?

ausführen um ip zu bekommen:

docker-machine ip <machine>

gibt die IP-Adresse für den Computer zurück und versucht, MySQL zu verbinden:

mysql -h<docker-machine-ip>
6
Gerardo Rochín

Ich führe dazu einen temporären Docker-Container auf meinem Server aus, sodass ich mich nicht darum kümmern muss, was auf meinem Host installiert ist. Zuerst definiere ich, was ich brauche (was Sie für Ihre Zwecke ändern sollten):

export MYSQL_SERVER_CONTAINER=mysql-db
export MYSQL_ROOT_PASSWORD=pswd 
export DB_DOCKER_NETWORK=db-net
export MYSQL_PORT=6604

Ich erstelle ein neues Docker-Netzwerk, das andere Container benötigen:

docker network create --driver bridge $DB_DOCKER_NETWORK

Starten Sie einen mySQL-Datenbankserver:

docker run --detach --name=$MYSQL_SERVER_CONTAINER --net=$DB_DOCKER_NETWORK --env="MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" -p ${MYSQL_PORT}:3306 mysql

Erfassen Sie die IP-Adresse des neuen Servercontainers

export DBIP="$(docker inspect ${MYSQL_SERVER_CONTAINER} | grep -i 'ipaddress' | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])')"

Öffnen Sie eine Befehlszeilenschnittstelle zum Server:

docker run -it -v ${Host_DATA}:/data --net=$DB_DOCKER_NETWORK --link ${MYSQL_SERVER_CONTAINER}:mysql --rm mysql sh -c "exec mysql -h${DBIP} -uroot -p"

Dieser letzte Container wird automatisch entfernt, wenn Sie die mySQL-Schnittstelle beenden, während der Server weiter ausgeführt wird. Sie können auch ein Volume für den Server und den Host freigeben, um das Importieren von Daten oder Skripts zu erleichtern. Hoffe das hilft!

3
COwnby
mysql -u root -P 4406 -h localhost --protocol=tcp -p

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

3
Hamfri

führen Sie den folgenden Befehl aus, um den Container auszuführen

docker run --name db_name -e MYSQL_ROOT_PASSWORD=PASS--publish 8306:3306 db_name

führen Sie diesen Befehl aus, um mysql db auf dem Hostcomputer abzurufen

mysql -h 127.0.0.1 -P 8306 -uroot  -pPASS

in deinem Fall ist es das

mysql -h 127.0.0.1 -P 12345 -uroot  -pPASS
0
Nitin

Zur Konvertierung können Sie im Host eine ~/.my.cnf-Datei erstellen: 

[Mysql]
user=root
password=yourpass
Host=127.0.0.1
port=3306

Dann führen Sie das nächste Mal einfach mysql für den mysql-Client aus, um die Verbindung zu öffnen.

0
Rod Terry