(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
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
sehenServer-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'.
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.
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
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.
Die einfache Methode besteht darin, den Mysql-Unix-Socket für den Host-Computer freizugeben. Dann durch die Steckdose verbinden
Schritte:
mkdir /Host
docker run -it -v /Host:/shared <mysql image>
aus./etc/my.cnf
und ändern Sie den Socket-Eintrag in der Datei in socket=/shared/mysql.sock
.service mysql restart
im Andockfenster neumysql -u root --socket=/Host/mysql.sock
vom Host aus mit dem MySQL-Server. Wenn das Kennwort verwendet wird, verwenden Sie die Option -pwenn 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>
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!
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
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
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.