Dokcer创建MySQL容器,并在宿主机或mysql可视化工具中连接mysql容器的数据库

文章目录

  • 一、Docker 创建 MySQL容器
    • 1. 拉取 MySQL 镜像
    • 2. 创建并运行 MySQL 容器
    • 3. 创建并运行 MySQL 容器(目录映射)
  • 二、连接 MySQL 数据库
    • 1. 在 MySQL 容器内,连接MySQL
    • 2. 在宿主机连接 MySQL(遇到问题及解决方案)
      • 尝试过的方案(失败)
        • 1)给mysql的root用户授权外网访问权限;
        • 2)修改`my.cnf`配置文件
        • 3)关闭mysql容器所在的宿主机的防火墙
        • 4)重启 MySQL 服务
      • 最终解决问题的方案(成功)
      • 另外一个连接报错

本文将总结如何通过docker创建mysql容器,并且通过宿主机或mysql可视化工具连接mysql容器的数据库(中间有遇到问题,并最终成功解决了)

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

说明:
我使用的是docker desktop for windows,并且是基于WSL2 后端的,并且WSL2分发使用的是Ubuntu,下面演示示例中,大部分命令都是通过Ubuntu来访Docker的。

一、Docker 创建 MySQL容器

1. 拉取 MySQL 镜像

拉取最新版本的mysql

docker pull mysql

拉取指定版本的mysql(如 5.7)

docker pull mysql:5.7

如下,使用docker images mysql查看已拉取的mysql镜像

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. 创建并运行 MySQL 容器

使用docker run创建并运行mysql容器
使用docker ps查看正在运行的容器

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:创建并运行容器
-d:后台运行方式
--name mysql5.7:给创建的容器起个名字,如果不指定则随机生成一个默认的
-p 33065:33065:将容器的端口映射到宿主机的端口(前者是宿主机的端口,后者是mysql容器暴露的端口)
-e MYSQL_ROOT_PASSWORD=1234qwer:给容器设置一个环境变量(设置myslq的root用户密码)
mysql:5.7:指定用来创建容器的镜像的名称和tag,也可以用image id代替

注意:这里使用的"-p 33065:33065"是有问题的,后面会说。
(这也是我自己造了一个坑,把自己困了一天。。。)

3. 创建并运行 MySQL 容器(目录映射)

在实际使用中,需要将docker容器中的数据、日志、配置文件等重要目录,映射到宿主机本地,防止docker容器被删除后数据丢失的问题。

映射到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

映射到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

上述命令中,冒号:前面的部分都是宿主机的配置信息,后面的部分都是容器的配置信息。

二、连接 MySQL 数据库

1. 在 MySQL 容器内,连接MySQL

进入MySQL容器,并在容器内连接mysql

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
Byebash-4.2#

如上,可以在mysql容器内,正常连接mysql数据库。

2. 在宿主机连接 MySQL(遇到问题及解决方案)

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

这个问题困扰我一天了,在网上通过搜索关键词【ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 2】,找了N多相关文章,都没有能解决问题。

尝试过的方案(失败)

(虽然都没有解决我的问题,我这里还是列出来):

1)给mysql的root用户授权外网访问权限;

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;

其实这个有些多余,mysql容器创建完成后,已经默认给了这个权限
(通过如下sql语句,查看得知,注意mysql容器创建完后未执行上面的grant命令,查看结果如下)

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)修改my.cnf配置文件

(一般位置为:/etc/my.cnf/etc/mysql/my.cnf
在配置文件中注释掉bind-address = 127.0.0.1,同时在[mysqld]配置下新增skip-name-resolve

这个方案对我也无效,因为我的配置下,本来就没有bind-address = 127.0.0.1,同时在[mysqld]下默认已有skip-name-resolve配置了

如下是我的my.cnf默认配置:

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)关闭mysql容器所在的宿主机的防火墙

(我这里是通过Windows docker desktop(Use the WSL 2 based engine),Linux默认分发是Ubuntu)
我把Windows的防火墙关闭了(Ubuntu 压根没有启动 防火墙),再通过Windows的cmd,或Ubuntu的bash,访问mysql -h 127.0.0.1 -P 33065 -u root -p,都是报错:Lost connection to MySQL server at 'reading initial communication packet'

所以关闭防火墙的方案对我来说也是无效的。

4)重启 MySQL 服务

网上还有说重启mysql服务就好了。
但是我这里重启了mysql容器,甚至重启了Windows系统,都不好使

还尝试了一些其他方案,现在已不记得了,总之折腾了一天。



最终解决问题的方案(成功)

当我吃完晚饭后,重新创建了一个mysql容器后,这个容器的mysql竟然可以从 window cmd 或 ubuntu bash 连接。

下面是问题根源及解决方案:

这个新创建的mysql容器与最开始创建的那个区别在哪里?
重点是:端口、端口、端口!!!

最开始的mysql容器的创建命令:

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

后来创建的mysql容器创建命令:

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

重点是-p <宿主机端口>:<容器的端口> 参数。
<容器的端口> 一定要指定为mysql监听的端口,默认为3306
<宿主机端口> 这个可以是任意端口号(只要未被其他程序占用即可);

在mysql内,可以通过show variables like 'port';语句查看mysql监听端口

root@GC:~$ mysql -h 127.0.0.1 -P 33062 -uroot -pmysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306 |
+---------------+-------+
1 row in set (0.00 sec)

假如你修改了mysql容器的监听端口,如下(删掉了部分注释),在[mysqld]下指定了port=33065(默认没有port这个字段配置,mysql服务默认会监听3306端口)

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=mysqlsymbolic-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/

修改完后,重启mysql容器。
然后再查看mysql监听的端口,已经改为了33065

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>

这时候再通过 window cmd 或 ubuntu bash 或 远程连接工具 就可以连接到 最开始创建的 -p 33605:33605 那个mysql容器的mysql数据库了。

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>

在这里插入图片描述

注意:一定要指定-h参数,并且值为127.0.0.1<宿主机的网桥IP地址>

在这里插入图片描述

另外一个连接报错

在宿主机连接mysql容器时,如果未指定-h参数,或者指定了-h localhost,那么将会报错如下:

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)

这是因为在缺省-h参数(或-h localhost)时,MySQL客户端默认使用Unix Socket文件方式来连接本地数据库服务器,而mysql容器暴露端口是tcp协议的,使用127.0.0.1<宿主机的网桥IP地址>作为主机名可以强制MySQL客户端使用TCP/IP方式连接而不是Unix Socket文件方式连接,因此可连接成功。



最后总结,之所以遇到上述问题,就是我想当然的以为通过-p <宿主机端口>:<容器端口><容器端口>指定为33065,那么创建并运行的mysql就会监听33065端口,而且整个排错过程中,都没有想着查看一下mysql监听的是哪个端口。(现在想想真的挺傻的)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/82436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【kafka】可视化工具KAFKA EAGLE安装分享

目录 准备&#xff1a; 开始&#xff1a; 1.解压 2.环境变量配置 3.生效环境变量配置文件 3.修改配置文件 1.修改zookeeper集群信息 2.修改mysql配置信息 4.启动 5.异常排查 6.页面 创作不易&#xff0c;你的动力是我创作的动力&#xff0c;如果有帮助请关注我&…

路由器端口转发

什么是路由器端口转发 路由器端口转发是一种网络配置技术&#xff0c;用于将公共网络&#xff08;如互联网&#xff09;上的请求转发到私有网络中的特定设备或服务。它允许外部设备通过路由器访问内部网络中的设备或服务&#xff0c;实现网络上的通信和互动。 路由器端口转发…

计算机竞赛 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

《YOLOv5/YOLOv7/YOLOv8最新改进大作战》专栏介绍 CSDN独家改进创新实战 专栏目录

&#x1f4a1;&#x1f4a1;&#x1f4a1;YOLOv5/YOLOv7/YOLOv8最新改进大作战&#xff0c;独家首发创新&#xff08;原创&#xff09;&#xff0c;持续更新&#xff0c;适用于Yolov5、Yolov7、Yolov8等各个Yolo系列&#xff0c;专栏文章提供每一步步骤和源码&#xff0c;轻松带…

uniapp之uni-forms表单组件封装的双向数据绑定

前言 在uniapp中, 封装组件的props单向数据流更为严格, 不允许改变子组件的props属性, 所以记录下uniapp下的form表单的组件是如何封装的, 双向数据是如何绑定的. 版本: "dcloudio/uni-ui": "^1.4.27", "vue": "> 2.6.14 < 2.7&quo…

安卓毕业设计各种app项目,Android毕设设计,Android课程设计,毕业论文

作为一位从事软件开发多年的专业人士&#xff0c;您积累了丰富的经验和技能&#xff0c;解决了许多不同类型的问题。除了开发原创项目&#xff0c;您还愿意分享您的知识&#xff0c;指导实习生和在校生。这种乐于助人的行为对于行业的发展和新一代软件开发者的成长都起着积极的…

《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹

系列文章导航 《优化接口设计的思路》系列&#xff1a;第一篇—接口参数的一些弯弯绕绕 《优化接口设计的思路》系列&#xff1a;第二篇—接口用户上下文的设计与实现 《优化接口设计的思路》系列&#xff1a;第三篇—留下用户调用接口的痕迹 前言 大家好&#xff01;我是sum…

阿里云交互式建模(PAI-DSW)训练并微调推理ChatGLM模型

参考内容为《轻量微调和推理ChatGLM模型实践》 点击“交互式建模&#xff08;DSW&#xff09;”&#xff0c;然后选择“创建实例” 写上实例名称&#xff0c;然后选择GPU规格&#xff0c;选择“ecs.gn6v-c8g1.2xlarge(8 vCPU&#xff0c;32GB)” 页面往下拉选择“pytorch:…

Leetcode162. 寻找峰值

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即…

物理内存分配

目录 内核物理内存分配接口 内存分配行为&#xff08;物理上&#xff09; 内存分配的行为操作 内存 三个水位线 水线计算 水位线影响内存分配行为 内存分配核心__alloc_pages 释放页 1、内核物理内存分配接口 struct page *alloc_pages(gfp_t gfp, unsigned int ord…

Redis 三种特殊的数据类型 - Geospatial地理位置 - Hyperloglog基数统计的算法 - Bitmaps位图(位存储)

目录 Redis 三种特殊的数据类型&#xff1a; Geospatial&#xff1a;地理位置 Geospatial类型常用的命令&#xff1a; GEOADD&#xff1a;添加地理位置 GEOPOS&#xff1a;获取地理位置 GEODIST&#xff1a;返回两个给定位置之间的距离 GEORADIUS&#xff1a;以给定的经纬…

Seata 源码篇之AT模式启动流程 - 上 - 02

Seata 源码篇之AT模式启动流程 - 02 自动配置两个关键点 初始化初始化TM初始化RM初始化TC 全局事务执行流程TM 发起全局事务GlobalTransactional 注解处理全局事务的开启 TM 和 RM 执行分支事务IntroductionDelegatingIntroductionInterceptorDelegatePerTargetObjectIntroduct…

在华为云服务器上CentOS 7安装单机版Redis

https://redis.io/是官网地址。 点击右上角的Download。 可以进入https://redis.io/download/——Redis官网下载最新版的网址。 然后在https://redis.io/download/页面往下拉&#xff0c;点击下图超链接这里。 进入https://download.redis.io/releases/下载自己需要的安装…

【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合

目录 一、结构体 1.结构的声明 2.特殊的声明 3.结构的自引用 4.结构体变量的定义和初始化 5.结构体内存对齐&#xff08;重点来了&#xff09; 6.为什么会存在内存对齐 7.修改默认对齐数 8.结构体传参 二、位段 1.什么是位段 2.位段的内存分配 3.位段的跨平台问题…

ajax day4

1、promise链式调用 /*** 目标&#xff1a;把回调函数嵌套代码&#xff0c;改成Promise链式调用结构* 需求&#xff1a;获取默认第一个省&#xff0c;第一个市&#xff0c;第一个地区并展示在下拉菜单中*/let pname axios({url: http://hmajax.itheima.net/api/province,}).t…

21天学会C++:Day11----运算符重载

CSDN的uu们&#xff0c;大家好。这里是C入门的第十一讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 运算符重载 2.1 operator<() 2.2 operator() 2.3 o…

jvm中对象创建、内存布局以及访问定位

对象创建 Java语言层面&#xff0c;创建对象通常&#xff08;例外&#xff1a;复制、反序列化&#xff09;仅仅是一个new关键字即可&#xff0c;而在虚拟机中&#xff0c;对象&#xff08;限于普通Java对象&#xff0c;不包括数组和Class对象等&#xff09;的创建又是怎样一个过…

小米华为,化干戈为玉帛!

近日来&#xff0c;手机圈又掀起了各大厂家推出新品的高潮。首先是华为Mate60的推出&#xff0c;其自研的麒麟9000S芯片瞬间点燃了国内手机市场&#xff0c;得到了国内甚至国外业界人士的认可和好评。 而近日网上盛传的小米创始人雷军的“愿意加入华为技术生态圈”的邀请&…

Redis缓存实现及其常见问题解决方案

随着互联网技术的发展&#xff0c;数据处理的速度和效率成为了衡量一个系统性能的重要指标。在众多的数据处理技术中&#xff0c;缓存技术以其出色的性能优化效果&#xff0c;成为了不可或缺的一环。而在众多的缓存技术中&#xff0c;Redis 以其出色的性能和丰富的功能&#xf…

JDK jps命令复习

之前写过jdk命令工具的博文&#xff0c;下面复习jps命令&#xff1b; jps 是 Java Process Status Tool 的简称,它的作用是为了列出所有正在运行中的 Java 虚拟机进程和相关信息&#xff1b; jps 命令参数 -q 只输出进程 ID,省略主类的名称 -m 输出虚拟机进程启动时传递…