Conéctese a mysql en un contenedor acoplable desde el host

Resuelto gturri asked hace 9 años • 22 respuestas

En una palabra

Quiero ejecutar mysql en un contenedor acoplable y conectarme a él desde mi host. Hasta ahora, lo mejor que he logrado es:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Más detalles

Estoy usando lo siguiente 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

En el directorio donde está este archivo, puedo construir con éxito la imagen y ejecutarla con:

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

Cuando adjunto la imagen, parece funcionar 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.
[...]

Sin embargo, no tengo mucho éxito por parte del anfitrión:

> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Aún más detalles

  • He visto que hay una pregunta que se parece a la mía. . Sin embargo, no es lo mismo (y de todos modos no tiene respuestas)
  • He visto que hay imágenes dedicadas a mysql. , pero no tuve más éxito con ellas.
  • Puede que me grep -vsienta raro. Es cierto que puede haber una forma más limpia de hacerlo. Pero cuando adjunto mi imagen, puedo observar que realmente funcionó como se esperaba (es decir, eliminó el archivo bind-address). Y puedo ver en el contenedor /var/log/mysql/error.log:

Nombre de host del servidor (dirección de enlace): '0.0.0.0'; puerto: 3306 - '0.0.0.0' se resuelve en '0.0.0.0'; Socket de servidor creado en IP: '0.0.0.0'.

gturri avatar Oct 08 '15 03:10 gturri
Aceptado

Si su host Docker MySQL se está ejecutando correctamente, puede conectarse a él desde la máquina local, pero debe especificar el host, el puerto y el protocolo de esta manera:

mysql -h localhost -P 3306 --protocol=tcp -u root

Cambie 3306 al número de puerto que ha reenviado desde el contenedor Docker (en su caso será 12345).

Debido a que está ejecutando MySQL dentro del contenedor Docker, el socket no está disponible y necesita conectarse a través de TCP. Configurar "--protocol" en el comando mysql cambiará eso.

jozala avatar Dec 28 '2015 08:12 jozala

Si usa "127.0.0.1" en lugar de localhost, mysql usará el método tcp y debería poder conectar el contenedor con:

mysql -h 127.0.0.1 -P 3306 -u root
Vasili Pascal avatar Oct 20 '2016 16:10 Vasili Pascal

Recomiendo consultar Docker-compose. Así es como funcionaría:

Cree un archivo llamado docker-compose.yml que se vea así:

version: '2'

services:

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

A continuación, ejecute:

$ docker-componer

Notas:

  • Para ver la etiqueta de imagen de mariadb más reciente, consulte https://hub.docker.com/_/mariadb/

Ahora puedes acceder a la consola MySQL de la siguiente manera:

$ mysql -P 8083 --protocol=tcp -u raíz -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>

Notas:

  • Puede pasar el indicador -d para ejecutar el contenedor mysql/mariadb en modo independiente/en segundo plano.

  • La contraseña es "wp", que se define en el archivo docker-compose.yml.

  • El mismo consejo que maniekq pero ejemplo completo con docker-compose.

l3x avatar Jan 02 '2017 18:01 l3x

El método simple es compartir el socket MySQL Unix con la máquina host. Luego conéctelo a través del enchufe.

Pasos:

  • Cree una carpeta compartida para la máquina host, por ejemplo:mkdir /host
  • Ejecute el contenedor acoplable con la opción de montaje de volumen docker run -it -v /host:/shared <mysql image>.
  • Luego cambie el archivo de configuración de MySQL /etc/my.cnfy cambie la entrada del socket en el archivo asocket=/shared/mysql.sock
  • Reinicie el servicio MySQL service mysql restarten la ventana acoplable
  • Finalmente conéctese al servidor MySQL desde el host a través del socket mysql -u root --socket=/host/mysql.sock. Si la contraseña usa la opción -p
Jobin avatar Nov 13 '2015 06:11 Jobin