(C'est probablement une question idiote à cause de ma connaissance limitée de Docker ou de l'administration de MySQL, mais comme j'ai passé toute une soirée sur ce sujet, j'ose me poser la question.)}
En un mot
Je veux exécuter mysql dans un conteneur Docker et me connecter à partir de mon hôte. Jusqu'ici, le mieux que je réalise 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 la Dockerfile
suivante
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 j'attache à l'image, cela semble bien fonctionner:
# 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 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
grep -v
peut sembler étrange. Certes, il peut y avoir une façon plus propre de le faire. Mais lorsque je suis attaché à mon image, je peux observer que cela a réellement fonctionné comme prévu (c'est-à-dire: suppression du bind-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' est résolu en '0.0.0.0'; Socket serveur créé sur IP: '0.0.0.0'.
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 suit:
mysql -h localhost -P 3306 --protocol=tcp -u root
Remplacez 3306 par le numéro de port que vous avez transféré depuis le conteneur Docker (dans votre cas, ce sera 12345).
Comme vous utilisez MySQL dans le conteneur Docker, le socket n’est pas disponible et vous devez vous connecter via TCP. Définir "--protocol" dans la commande mysql changera cela.
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:
mysql -h 127.0.0.1 -P 3306 -u root
Je recommande de vérifier docker-compose. Voici comment cela fonctionnerait:
Créez un fichier nommé docker-compose.yml qui ressemble à ceci:
version: '2'
services:
mysql:
image: mariadb:10.1.19
ports:
- 8083:3306
volumes:
- ./mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: wp
Ensuite, lancez:
$ docker-composer
Remarques:
Maintenant, vous pouvez accéder à la console mysql de cette manière:
$ mysql -P 8083 --protocol = tcp -u racine -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>
Remarques:
Vous pouvez passer l'indicateur -d pour exécuter le conteneur mysql/mariadb en mode détaché/en arrière-plan.
Le mot de passe est "wp", défini dans le fichier docker-compose.yml.
Même conseil que maniekq mais exemple complet avec docker-compose.
La méthode simple consiste à partager le socket mysql unix vers la machine hôte. Puis connectez-vous 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 en socket=/shared/mysql.sock
service mysql restart
dans le menu fixemysql -u root --socket=/Host/mysql.sock
. Si le mot de passe utilise l'option -psi vous exécutez docker sous docker-machine?
exécutez pour obtenir l'ip:
docker-machine ip <machine>
retourne l'ip de la machine et essayez de connecter mysql:
mysql -h<docker-machine-ip>
Pour ce faire, j'exécute un conteneur de menu fixe temporaire sur mon serveur afin de ne pas avoir à m'inquiéter de ce qui est installé sur mon hôte. Premièrement, je définis ce dont j'ai besoin (que vous devriez modifier pour vos besoins):
export MYSQL_SERVER_CONTAINER=mysql-db
export MYSQL_ROOT_PASSWORD=pswd
export DB_DOCKER_NETWORK=db-net
export MYSQL_PORT=6604
Je crée toujours un nouveau réseau Docker dont tout autre conteneur aura besoin:
docker network create --driver bridge $DB_DOCKER_NETWORK
Démarrer un serveur de base de données MySQL:
docker run --detach --name=$MYSQL_SERVER_CONTAINER --net=$DB_DOCKER_NETWORK --env="MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" -p ${MYSQL_PORT}:3306 mysql
Capturer l'adresse IP du nouveau conteneur de serveur
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])')"
Ouvrez une interface de ligne de commande sur le serveur:
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"
Ce dernier conteneur se supprimera lorsque vous quitterez l'interface mySQL, tandis que le serveur continuera à 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!
mysql -u root -P 4406 -h localhost --protocol=tcp -p
N'oubliez pas de changer l'utilisateur, le port et l'hôte afin qu'ils correspondent à vos configurations. L'indicateur -p est requis si votre utilisateur de la base de données est configuré avec un mot de passe.
exécuter la commande suivante pour exécuter le conteneur
docker run --name db_name -e MYSQL_ROOT_PASSWORD=PASS--publish 8306:3306 db_name
lancez cette commande pour obtenir mysql db dans la machine hôte
mysql -h 127.0.0.1 -P 8306 -uroot -pPASS
dans votre cas c'est
mysql -h 127.0.0.1 -P 12345 -uroot -pPASS
Pour la conversion, vous pouvez créer un fichier ~/.my.cnf
dans l'hôte:
[Mysql]
user=root
password=yourpass
Host=127.0.0.1
port=3306
Ensuite, la prochaine fois, lancez mysql
pour que le client mysql ouvre la connexion.