web-dev-qa-db-fra.com

Se connecter à mysql dans un conteneur de menu fixe à partir de l'hôte

(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

  • J'ai vu qu'il y avait une question qui ressemble à la mienne . Cependant, ce n'est pas vraiment le même (et il n'a de toute façon pas de réponse)
    • J'ai vu qu'il y avait des images dédiées à mysql , mais je n'ai pas eu plus de succès avec elles
    • Mon 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'.

46
gturri

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.

80
maniekq

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
30
Vasili Pascal

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.

15
l3x

La méthode simple consiste à partager le socket mysql unix vers la machine hôte. Puis connectez-vous via la prise 

Pas:

  • Créer un dossier partagé pour la machine hôte, par exemple: mkdir /Host
  • Exécutez le conteneur Docker avec l'option de montage en volume docker run -it -v /Host:/shared <mysql image>.
  • Puis changez le fichier de configuration mysql /etc/my.cnf et changez l'entrée de socket dans le fichier en socket=/shared/mysql.sock
  • Redémarrez le service MySQL service mysql restart dans le menu fixe
  • Enfin, connectez-vous au serveur MySQL à partir de l'hôte via le socket mysql -u root --socket=/Host/mysql.sock. Si le mot de passe utilise l'option -p
11
Jobin

si 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>
6
Gerardo Rochín

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!

3
COwnby
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.

3
Hamfri

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
0
Nitin

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.

0
Rod Terry