Conéctese a mysql en un contenedor acoplable desde el host
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 -v
sienta 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 archivobind-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'.
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.
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
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.
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.cnf
y cambie la entrada del socket en el archivo asocket=/shared/mysql.sock
- Reinicie el servicio MySQL
service mysql restart
en 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