Dokcer crea un contenedor MySQL y se conecta a la base de datos del contenedor MySQL en el host o la herramienta de visualización MySQL.

Este artículo resumirá cómo crear un contenedor mysql a través de Docker y conectar la base de datos del contenedor mysql a través del host o la herramienta de visualización mysql (hubo problemas en el medio y finalmente se resolvieron con éxito)

  • Error 1:ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2
  • Error 2:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Nota:
Estoy usando docker desktop for windows, basado WSL2 后端的y WSL2distribuido usando , se accede Ubuntua la mayoría de los comandos en los siguientes ejemplos de demostración a través de .UbuntuDocker

1. Docker crea un contenedor MySQL

1. Extraiga la imagen de MySQL

Extraiga la última versión de mysql

docker pull mysql

o

Extraiga la versión especificada de mysql (como 5.7)

docker pull mysql:5.7

De la siguiente manera, utilícelo docker images mysqlpara ver la imagen de MySQL extraída.

root@GC:~# docker images mysql
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
mysql        latest    99afc808f15b   4 weeks ago   577MB
mysql        5.7       92034fe9a41f   5 weeks ago   581MB
root@GC:~#

2. Cree y ejecute el contenedor MySQL.

Úselo para docker runcrear y ejecutar un contenedor mysql.
Úselo docker pspara ver los contenedores en ejecución.

root@GC:~# docker run -d --name mysql5.7 -p 33065:33065 -e MYSQL_ROOT_PASSWORD=1234qwer mysql:5.7
10124d6b026e8442e7250196a1c979ff3fdd7ad5021fc50865cb871cfa662ee6
root@GC:~# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                                           NAMES
10124d6b026e   mysql:5.7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   3306/tcp, 33060/tcp, 0.0.0.0:33065->33065/tcp   mysql5.7

docker run: Crear y ejecutar el contenedor
-d: Modo de ejecución en segundo plano
--name mysql5.7: Asigne un nombre al contenedor creado; si no se especifica, se generará uno predeterminado de forma aleatoria
-p 33065:33065: Asigne el puerto del contenedor al puerto del host (el primero es el puerto del host, y este último es mysql Puerto expuesto por el contenedor)
-e MYSQL_ROOT_PASSWORD=1234qwer: establezca una variable de entorno para el contenedor (establezca la contraseña del usuario raíz de myslq)
mysql:5.7: especifique el nombre y la etiqueta de la imagen utilizada para crear el contenedor, también puede usar la imagen identificación en lugar

Nota: Hay un problema con "-p 33065:33065" utilizado aquí, que se analizará más adelante.
(Esta también es una trampa que creé yo mismo y me atrapé por un día...)

3. Cree y ejecute el contenedor MySQL (mapeo de directorios)

En el uso real, los directorios importantes, como datos, registros y archivos de configuración en el contenedor de la ventana acoplable, deben asignarse al host local para evitar la pérdida de datos después de que se elimina el contenedor de la ventana acoplable.

Asignación al modo de directorio de Windows:

docker run -d -p 3306:3306 --name mysql5.7 ^
-v /e/mysql/docker-mysql/my.cnf:/etc/my.cnf ^
-v /e/mysql/docker-mysql/logs:/var/log/mysql ^
-v /e/mysql/docker-mysql/data:/var/lib/mysql ^
-e MYSQL_ROOT_PASSWORD=1234qwer ^
mysql:5.7

Método de asignación al directorio de Linux:

docker run -d -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=1234qwer \
mysql:5.7

En el comando anterior, :la parte antes de los dos puntos es la información de configuración del host y la parte después de los dos puntos es la información de configuración del contenedor.

2. Conéctese a la base de datos MySQL

1. En el contenedor MySQL, conéctese a MySQL.

Ingrese al contenedor MySQL y conecte mysql dentro del contenedor

root@GC:~# docker exec -it mysql5.7 /bin/bash
bash-4.2# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

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> exit
Bye

bash-4.2#

Como se indicó anteriormente, puede conectarse a la base de datos mysql normalmente en el contenedor mysql.

2. Conéctese a MySQL en la máquina host (problemas encontrados y soluciones)

root@GC:~# mysql -h 127.0.0.1 -P 33065 -u root -p
Enter password:
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2

Este problema me ha estado molestando durante un día. Busqué en Internet la palabra clave [ERROR 2013 (HY000): Se perdió la conexión al servidor MySQL al 'leer el paquete de comunicación inicial', error del sistema: 2] y encontré muchos artículos relacionados, pero ninguno. de ellos podría resolverlo.Pregunta.

Soluciones probadas (fallidas)

(Aunque ninguno de ellos resolvió mi problema, todavía lo enumero aquí):

1) Autorizar al usuario root de mysql a acceder a la red externa;

root@GC:~# docker exec -it mysql5.7 /bin/bash
bash-4.2# mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '1234qwer' WITH GRANT OPTION;   
mysql> FLUSH PRIVILEGES;

De hecho, esto es un poco redundante: después de crear el contenedor MySQL, este permiso se otorga de forma predeterminada
(puede averiguarlo a través de la siguiente declaración SQL. Tenga en cuenta que el comando de concesión anterior no se ejecuta después de crear el contenedor MySQL. Los resultados son los siguientes)

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

mysql>

2) Modificar my.cnfel archivo de configuración

(Ubicación general: /etc/my.cnfo /etc/mysql/my.cnf)
Coméntelo en el archivo de configuración bind-address = 127.0.0.1y [mysqld]agréguelo en configuraciónskip-name-resolve

Esta solución no me funciona porque bajo mi configuración no existe bind-address = 127.0.0.1y a la [mysqld]vez ya viene skip-name-resolveconfigurada por defecto.

Aquí está mi my.cnfconfiguración predeterminada:

bash-4.2# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

3) Apague el firewall del host donde se encuentra el contenedor mysql

(Estoy aquí Windows docker desktop(Use the WSL 2 based engine), la distribución predeterminada de Linux es Ubuntu)
Apagué Windowsel firewall (Ubuntu no inició el firewall en absoluto) y luego accedí a través de Windows cmd o Ubuntu bash, mysql -h 127.0.0.1 -P 33065 -u root -pse informaron todos los errores: Lost connection to MySQL server at 'reading initial communication packet'.

Entonces, la solución de apagar el firewall tampoco es válida para mí.

4) Reinicie el servicio MySQL

También se dice en Internet que reiniciar el servicio mysql solucionará el problema.
Pero reinicié el contenedor mysql aquí, e incluso reinicié el sistema Windows, pero no funcionó.

También probé otras soluciones, pero ahora no las recuerdo, de todos modos me llevó un día entero.



Solución final al problema (exitosa)

Después de terminar de cenar, recreé un contenedor mysql, y el mysql de este contenedor se podía conectar desde window cmd o ubuntu bash.

Aquí están las causas fundamentales y las soluciones:

¿Cuál es la diferencia entre este contenedor mysql recién creado y el creado originalmente?
La cuestión es: ¡puertos, puertos, puertos! ! !

El comando inicial de creación del contenedor MySQL:

root@GC:~$ docker run -d --name mysql5.7 -p 33065:33065 -e MYSQL_ROOT_PASSWORD=1234qwer mysql:5.7

El comando de creación de contenedores mysql creado más tarde:

root@GC:~$ docker run -d --name mysql5.7-2 -p 33062:3306 -e MYSQL_ROOT_PASSWORD=1234qwer mysql:5.7

La atención se centra -p <宿主机端口>:<容器的端口>en los parámetros.
<容器的端口>Se debe especificar como el puerto en el que escucha mysql, el valor predeterminado es 3306,
<宿主机端口>este puede ser cualquier número de puerto (siempre que no esté ocupado por otros programas);

En MySQL, puede show variables like 'port';ver el puerto de escucha de MySQL a través de declaraciones.

root@GC:~$ mysql -h 127.0.0.1 -P 33062 -uroot -p

mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306 |
+---------------+-------+
1 row in set (0.00 sec)

Si modifica el puerto de escucha del contenedor MySQL de la siguiente manera (se eliminan algunos comentarios), especifíquelo [mysqld]a continuación port=33065( porteste campo no está configurado de forma predeterminada y el servicio MySQL escuchará el puerto 3306 de forma predeterminada).

root@GC:~$ docker exec -it mysql5.7 /bin/bash
bash-4.2# vim /etc/my.cnf
bash-4.2# cat /etc/my.cnf
[mysqld]
port=33065
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

symbolic-links=0

#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

Después de la modificación, reinicie el contenedor mysql.
Luego verifique el puerto en el que está escuchando mysql, se ha cambiado a33065

root@GC:~$ docker restart mysql5.7
root@GC:~$ docker exec -it mysql5.7 /bin/bash
bash-4.2# mysql -uroot -p
mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 33065 |
+---------------+-------+
1 row in set (0.00 sec)

mysql>

-p 33605:33605En este momento, puede conectarse a la base de datos mysql del contenedor mysql que creó inicialmente a través de window cmd o ubuntu bash o herramienta de conexión remota .

root@GC:~$ mysql -h127.0.0.1 -P33065 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.43 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql>

Insertar descripción de la imagen aquí

Nota: Asegúrese de especificar -hlos parámetros y el valor es 127.0.0.1o<宿主机的网桥IP地址>

Insertar descripción de la imagen aquí

Otro error de conexión

Cuando el host se conecta al contenedor mysql, si -hlos parámetros no se especifican o si se especifican -h localhost, se informará el siguiente error:

root@GC:~$ mysql -P33065 -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
cyinl@GC:~$ mysql -hlocalhost -P33065 -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Esto se debe a que cuando se usan los -hparámetros predeterminados (o ), el cliente MySQL usa el método de archivo Unix Socket para conectarse al servidor de base de datos local de forma predeterminada , y el puerto expuesto por el contenedor mysql es el protocolo TCP.Usando o como host El nombre puede obligar al cliente MySQL a utilizar el método para conectarse. En lugar de conectarse, la conexión puede tener éxito.-h localhost127.0.0.1<宿主机的网桥IP地址>TCP/IPUnix Socket文件



En conclusión, la razón por la que encontré el problema anterior es que di por sentado que si pasaba -p <宿主机端口>:<容器端口>y <容器端口>especificaba como 33065, entonces el mysql creado y ejecutado escucharía 33065el puerto, y durante todo el proceso de solución de problemas, no pensé en comprobando qué puerto estaba escuchando mysql. (Es realmente tonto ahora que lo pienso)

Supongo que te gusta

Origin blog.csdn.net/B11050729/article/details/132802683
Recomendado
Clasificación