(C'est probablement une question stupide en raison de ma connaissance limitée de Docker ou de l'administration mysql, mais comme j'ai passé une soirée entière sur ce problème, j'ose le poser.)
En un mot
Je veux exécuter mysql dans un conteneur docker et me connecter à celui-ci depuis mon hôte. Jusqu'à présent, le meilleur que j'ai réalisé est:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Plus de détails
J'utilise ce qui suit 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
Dans le répertoire où se trouve ce fichier, je peux créer avec succès l'image et l'exécuter avec:
> docker build -t my-image .
> docker run -d -p 12345:3306 my-image
Lorsque je m'attache à l'image, cela semble fonctionner très bien:
# 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.
[...]
Cependant, je n'ai pas beaucoup de succès de la part de l'hôte:
> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Encore plus de détails
- J'ai vu qu'il y a une question qui ressemble à la mienne . Cependant, ce n'est pas pareil (et il n'a pas de réponse de toute façon)
- J'ai vu qu'il y a des images dédiées à mysql , mais je n'ai pas eu plus de succès avec elles
- Je
grep -v
peux me sentir bizarre. Certes, il existe peut-être un moyen plus propre de le faire. Mais lorsque j'attache mon image, je peux observer qu'elle a réellement fonctionné comme prévu (c'est-à-dire suppriméebind-address
). Et je peux voir dans le conteneur/var/log/mysql/error.log
:
Nom d'hôte du serveur (adresse de liaison): '0.0.0.0'; port: 3306 - '0.0.0.0' se résout en '0.0.0.0'; Socket serveur créé sur IP: '0.0.0.0'.
la source
Réponses:
Si votre hôte Docker MySQL fonctionne correctement, vous pouvez vous y connecter à partir de la machine locale, mais vous devez spécifier l'hôte, le port et le protocole comme ceci:
Remplacez 3306 par le numéro de port que vous avez transféré du conteneur Docker (dans votre cas, ce sera 12345).
Étant donné que vous exécutez MySQL dans le conteneur Docker, le socket n'est pas disponible et vous devez vous connecter via TCP. La définition de "--protocol" dans la commande mysql changera cela.
la source
--socket=/var/run/mysqld/mysqld.sock
2. Monter ce fichier en dehors du conteneur Docker 3. Spécifier le chemin du socket dans le client MySQL avec--socket=/host/mysql.sock
--protocol=tcp
enfin fait fonctionner la connexion. Merci @maniekq pour la belle réponse et votre explication sur les sockets via votre commentaire!Si vous utilisez "127.0.0.1" au lieu de localhost, mysql utilisera la méthode tcp et vous devriez pouvoir connecter le conteneur avec:
la source
Je recommande de vérifier docker-compose. Voici comment cela fonctionnerait:
Créez un fichier nommé, docker-compose.yml qui ressemble à ceci:
Ensuite, exécutez:
Remarques:
Maintenant, vous pouvez accéder à la console mysql ainsi:
Remarques:
Vous pouvez passer l'indicateur -d pour exécuter le conteneur mysql / mariadb en mode détaché / arrière-plan.
Le mot de passe est "wp" qui est défini dans le fichier docker-compose.yml.
Même conseil que maniekq mais exemple complet avec docker-compose.
la source
--protocol=tcp
tout réparé pour moi. Je vous remercie!La méthode simple consiste à partager le socket mysql unix avec la machine hôte. Puis connectez via la prise
Pas:
mkdir /host
docker run -it -v /host:/shared <mysql image>
./etc/my.cnf
et changez l'entrée de socket dans le fichier ensocket=/shared/mysql.sock
service mysql restart
dans le dockermysql -u root --socket=/host/mysql.sock
. Si le mot de passe utilise l'option -pla source
si vous exécutez docker sous docker-machine?
exécuter pour obtenir ip:
renvoie l'adresse IP de la machine et essayez de connecter mysql:
la source
Je fais cela en exécutant un conteneur docker temporaire sur mon serveur afin de ne pas avoir à m'inquiéter de ce qui est installé sur mon hôte. Tout d'abord, je définis ce dont j'ai besoin (que vous devez modifier selon vos besoins):
Je crée toujours un nouveau réseau docker dont tous les autres conteneurs auront besoin:
Démarrez un serveur de base de données mySQL:
Capturer l'adresse IP du nouveau conteneur de serveur
Ouvrez une interface de ligne de commande vers le serveur:
Ce dernier conteneur se supprimera lorsque vous quitterez l'interface mySQL, tandis que le serveur continuera de fonctionner. Vous pouvez également partager un volume entre le serveur et l'hôte pour faciliter l'importation de données ou de scripts. J'espère que cela t'aides!
la source
N'oubliez pas de modifier l'utilisateur, le port et l'hôte afin qu'ils correspondent à vos configurations. L'indicateur -p est requis si l'utilisateur de votre base de données est configuré avec un mot de passe
la source
Pour la conversion, vous pouvez créer un
~/.my.cnf
fichier dans l'hôte:Ensuite, la prochaine fois, lancez simplement le
mysql
client mysql pour ouvrir la connexion.la source
J'ai pu connecter mon sql server5.7 en cours d'exécution sur mon hôte en utilisant la commande ci-dessous: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p où l'adresse IP donnée est mon adresse IP d'hôte et 3307 est le port forwaded dans mysql docker .Après avoir entré la commande, tapez le mot de passe pour myql.that is it.Maintenant, vous êtes connecté au conteneur de docker mysql depuis votre machine hôte
la source
exécuter la commande suivante pour exécuter le conteneur
exécutez cette commande pour obtenir la base de données mysql sur la machine hôte
dans ton cas c'est
la source
--protocol=tcp
indicateur comme décrit dans plusieurs autres commentaires / réponses. Dans mon cas, c'était très déroutant car j'avais également une instance mysql locale non dockerisée. Par défaut, même lorsque le port est spécifié, même si le port est incorrect, la commande 'mysql' se connectera via le fichier socket à l'instance locale.mysql -u root -P <EXPOSED_DOCKER_PORT_HERE> -h <YOUR_HOST_IP_ADDRESS_HERE> --protocol=tcp -p
. L'indicateur,--protocol=tcp
est la clé pour que cela fonctionne.Dans votre terminal, exécutez:
docker exec -it container_name /bin/bash
Ensuite:mysql
la source
D'ACCORD. J'ai finalement résolu ce problème. Voici ma solution utilisée dans https://sqlflow.org/sqlflow .
La solution complète
Pour rendre la démo autonome, j'ai déplacé tout le code nécessaire vers https://github.com/wangkuiyi/mysql-server-in-docker .
La clé de la solution
Je n'utilise pas l'image officielle sur DockerHub.com https://hub.docker.com/r/mysql/mysql-server . Au lieu de cela, j'ai créé le mien en installant MySQL sur Ubuntu 18.04. Cette approche me donne la chance de démarrer mysqld et de le lier à 0.0.0.0 (toutes les adresses IP) .
Pour plus de détails, veuillez vous référer à ces lignes dans mon dépôt GitHub.
Pour vérifier ma solution
apt-get
.Se connecter à partir d'un autre conteneur sur le même hôte
Nous pouvons exécuter le client MySQL à partir d'un autre conteneur (sur le même hôte).
Se connecter depuis un autre hôte
Sur mon iMac, j'installe le client MySQL à l'aide de Homebrew.
Ensuite, je peux accéder à l'hôte Ubuntu ci-dessus (192.168.1.22).
Se connecter à partir d'un conteneur s'exécutant sur un autre hôte
Je peux même exécuter un client MySQL dans un conteneur fonctionnant sur l'iMac pour me connecter au serveur MySQL dans un conteneur sur mon poste de travail Ubuntu.
Un cas spécial
Dans le cas où nous exécutons le client et le serveur MySQL dans des conteneurs séparés s'exécutant sur le même hôte - cela peut se produire lorsque nous mettons en place un CI, nous n'avons pas besoin de créer notre propre image Docker de serveur MySQL. Au lieu de cela, nous pouvons utiliser le
--net=container:mysql_server_container_name
lorsque nous exécutons le conteneur client.Pour démarrer le serveur
Pour démarrer le client
la source
docker run -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306: 3306 mysql
docker exec -it sql-db bash
mysql -u racine -p
la source
ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
changez "localhost" en votre véritable adresse IP con
car c'est en mysql_connect ()
la source