(Probablemente sea una pregunta tonta debido a mi conocimiento limitado con la administración de Docker o mysql, pero como pasé una noche entera con este tema, me atrevo a preguntar).
En una palabra
Quiero ejecutar mysql en un contenedor docker 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 a 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 tanto éxito con el 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 ninguna respuesta)
- He visto que hay imagenes dedicadas a mysql , pero no tuve más éxito con ellas
- Mi
grep -v
puede sentirse 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ó elbind-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 como '0.0.0.0'; Socket de servidor creado en IP: '0.0.0.0'.
mysql
docker
dockerfile
gturri
fuente
fuente
Respuestas:
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:
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.
fuente
--socket=/var/run/mysqld/mysqld.sock
2. Montar este archivo fuera del contenedor Docker 3. Especificar la ruta del socket en el cliente MySQL con--socket=/host/mysql.sock
--protocol=tcp
finalmente hice que la conexión funcionara. ¡Gracias @maniekq por la buena respuesta y su explicación en sockets a través de su comentario!Si usa "127.0.0.1" en lugar de localhost, mysql usará el método tcp y debería poder conectar el contenedor con:
fuente
Recomiendo revisar docker-compose. Así es como funcionaría:
Cree un archivo llamado docker-compose.yml que tenga este aspecto:
A continuación, ejecute:
Notas:
Ahora, puede acceder a la consola mysql de la siguiente manera:
Notas:
Puede pasar la marca -d para ejecutar el contenedor mysql / mariadb en modo separado / 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.
fuente
--protocol=tcp
arregló todo para mí. ¡Gracias!El método simple es compartir el socket mysql unix con la máquina host. Luego conecte a través del enchufe
Pasos:
mkdir /host
docker run -it -v /host:/shared <mysql image>
./etc/my.cnf
y cambie la entrada de socket en el archivo asocket=/shared/mysql.sock
service mysql restart
en la ventana acoplablemysql -u root --socket=/host/mysql.sock
. Si la contraseña usa la opción -pfuente
si está ejecutando docker bajo docker-machine?
ejecutar para obtener ip:
devuelve la ip de la máquina e intenta conectar mysql:
fuente
Hago esto ejecutando un contenedor de ventana acoplable temporal en mi servidor para no tener que preocuparme por lo que está instalado en mi host. Primero, defino lo que necesito (que debe modificar para sus propósitos):
Siempre creo una nueva red Docker que cualquier otro contenedor necesitará:
Inicie un servidor de base de datos mySQL:
Capturar la dirección IP del nuevo contenedor del servidor
Abra una interfaz de línea de comandos al servidor:
Este último contenedor se eliminará solo cuando salga de la interfaz mySQL, mientras que el servidor seguirá funcionando. También puede compartir un volumen entre el servidor y el host para facilitar la importación de datos o scripts. ¡Espero que esto ayude!
fuente
Recuerde cambiar el usuario, el puerto y el host para que coincida con sus configuraciones. La marca -p es necesaria si el usuario de su base de datos está configurado con una contraseña
fuente
Para la conversión, puede crear un
~/.my.cnf
archivo en el host:Luego, la próxima vez, ejecute el
mysql
cliente mysql para abrir la conexión.fuente
Pude conectar mi servidor sql5.7 ejecutándose en mi host usando el siguiente comando: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p donde la ip dada es mi ip de host y 3307 es la puerto forwaded en mysql docker.Después de ingresar el comando, escriba la contraseña para myql.Eso es.Ahora está conectado el contenedor de mysql docker desde su hostmachine
fuente
ejecutar el siguiente comando para ejecutar el contenedor
ejecute este comando para obtener mysql db en la máquina host
en tu caso es
fuente
--protocol=tcp
bandera como se describe en varios otros comentarios / respuestas. En mi caso, fue más confuso porque también tenía una instancia de mysql local, no acoplada, ejecutándose. De forma predeterminada, incluso cuando se especifica el puerto, incluso si el puerto es incorrecto, el comando 'mysql' se conectará a través del archivo de socket a la instancia local.mysql -u root -P <EXPOSED_DOCKER_PORT_HERE> -h <YOUR_HOST_IP_ADDRESS_HERE> --protocol=tcp -p
. La bandera,--protocol=tcp
es la clave para hacer que esto funcione.En su terminal, ejecute:
docker exec -it container_name /bin/bash
Entonces:mysql
fuente
OKAY. Finalmente resolví este problema. A continuación, mi solución utilizada en https://sqlflow.org/sqlflow .
La solución completa
Para que la demostración sea autónoma, moví todo el código necesario a https://github.com/wangkuiyi/mysql-server-in-docker .
La clave de la solución
No uso la imagen oficial en DockerHub.com https://hub.docker.com/r/mysql/mysql-server . En cambio, hice el mío instalando MySQL en Ubuntu 18.04. Este enfoque me da la oportunidad de iniciar mysqld y vincularlo a 0.0.0.0 (todas las direcciones IP) .
Para obtener más detalles, consulte estas líneas en mi repositorio de GitHub.
Para verificar mi solución
apt-get
.Conectarse desde otro contenedor en el mismo host
Podemos ejecutar el cliente MySQL incluso desde otro contenedor (en el mismo host).
Conectarse desde otro host
En mi iMac, instalo el cliente MySQL usando Homebrew.
Luego, puedo acceder al host de Ubuntu anterior (192.168.1.22).
Conectarse desde un contenedor que se ejecuta en otro host
Incluso puedo ejecutar el cliente MySQL en un contenedor que se ejecuta en el iMac para conectarme al servidor MySQL en un contenedor en mi estación de trabajo Ubuntu.
Un caso especial
En el caso de que ejecutemos el cliente y el servidor MySQL en contenedores separados que se ejecutan en el mismo host, esto podría suceder cuando estamos configurando un CI, no necesitamos construir nuestra propia imagen de Docker del servidor MySQL. En su lugar, podemos usar el
--net=container:mysql_server_container_name
cuando ejecutamos el contenedor del cliente.Para iniciar el servidor
Para iniciar el cliente
fuente
Docker ejecutar -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306: 3306 mysql
docker exec -it sql-db bash
mysql -u root -p
fuente
ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded
cambie "localhost" a su dirección IP real
porque es mysql_connect ()
fuente