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

news2024/12/23 2:42:22

文章目录

  • 一、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
Bye

bash-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 -p

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

修改完后,重启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.coloradmin.cn/o/1003916.html

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

相关文章

2023年9月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

性能测试 —— Jmeter事务控制器

事务&#xff1a; 性能测试中&#xff0c;事务指的是从端到端&#xff0c;一个完整的操作过程&#xff0c;比如一次登录、一次 筛选条件查询&#xff0c;一次支付等&#xff1b;技术上讲&#xff1a;事务就是由1个或多个请求组成的 事务控制器 事务控制器类似简单控制器&…

力扣:94. 二叉树的中序遍历(Python3)

题目&#xff1a; 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 示例&#xff1a; 示例 1&#xff1a; 输…

问道管理:突然飙涨!10分钟暴拉10倍

杠杆资金动手了&#xff0c;还是大手笔&#xff01; Wind数据显现&#xff0c;9月11日融资客净买入255.41亿元&#xff0c;创2020年7月14日以来新高。这一方面因为&#xff0c;9月11日起&#xff0c;融资保证金份额首次下调正式落地&#xff0c;投资者融资买入证券时的融资保证…

通达信指标编写,16进制颜色对照表,妈妈再也不用担心颜色不够用了!!

★★★★★博文创作不易&#xff0c;我的博文不需要打赏&#xff0c;也不需要知识付费&#xff0c;可以白嫖学习小技巧&#xff0c;喜欢的老铁可以多多点赞收藏分享置顶&#xff0c;小红牛在此表示感谢。★★★★★ #龙虎榜小红牛系统&#xff0c;官方微信公众号&#xff1a;g…

机器学习算法详解3:逻辑回归

机器学习算法详解3&#xff1a;逻辑回归 前言 ​ 本系列主要对机器学习上算法的原理进行解读&#xff0c;给大家分享一下我的观点和总结。 本篇前言 ​ 本篇对逻辑回归的算法原理进行解读。 目录结构 文章目录 机器学习算法详解3&#xff1a;逻辑回归1. 引子2. sigmoid函数3. 原…

C++之shared_ptr、unique_ptr、make_shared、make_unique的区别(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

vue3之pinia简单使用

一、 Pinia介绍 pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。就是和vuex一样的实现数据共享。 依据Pinia官方文档&#xff0c;Pinia是2019年由vue.js官方成员重新设计的新一代状态管理器&#xff0c;更替Vuex4成为Vuex5。 Pinia 目前也已经是 vue 官方正式…

PackML 学习笔记(2) OPCUA /PackML

2020年11月11日&#xff0c;OPC 基金会发布了PackML 的配套规范&#xff08;OPC 30050: PackML - Packaging Control&#xff09;。意味着可以使用OPCUA 信息模型来构建PackML 模型了。 如果写一篇技术简介往往是简单的&#xff0c;要去实现这门技术却很难。首先&#xff0c;OP…

浅谈Dead reckoning实现原理以及常用算法

0. 简介 航位推算是一个很常见的定位方法。在知道当前时刻的位置&#xff0c;然后通过imu等传感器去估计下一个时刻的位置。在自动驾驶车辆定位的时候&#xff0c;GPS提供10Hz的定位信息。这每个GPS信息来临的0.1s的间隔里面&#xff0c;车辆位置也会移动很多。那么这个时候就…

Android.bp语法和使用方法讲解

Android.bp语法和使用方法讲解 Android.bp 文件是什么&#xff1f; Android.bp 文件首先是 Android 系统的一种编译配置文件&#xff0c;是用来代替原来的 Android.mk文件的。在 Android7.0 以前&#xff0c;Android 都是使用 make 来组织各模块的编译&#xff0c;对应的编译…

抖店评价有礼怎么设置|成都瀚网科技

随着电商行业的不断发展和竞争的加剧&#xff0c;如何吸引消费者、提高店铺的口碑成为了每个卖家关注的焦点。其中&#xff0c;抖音电商平台的礼貌评价功能受到广大卖家的青睐。那么&#xff0c;如何设置抖店评论才能有礼貌呢&#xff1f;我们一起来讨论一下吧。 如何设置抖店评…

go-zerogo web集成gorm实战

前言 上一篇&#xff1a;go-zero&go web集成redis实战 从零开始基于go-zero搭建go web项目实战-04集成gorm实战 源码仓库地址 源码 https://gitee.com/li_zheng/treasure-box golang gorm 官网地址&#xff1a;https://gorm.io/zh_CN/docs/index.html GORM介绍 Gorm是…

Postman —— HTTP请求基础组成部分

一般来说&#xff0c;所有的HTTP Request都有最基础的4个部分组成&#xff1a;URL、 Method、 Headers和body。 &#xff08;1&#xff09;Method 要选择Request的Method是很简单的&#xff0c;Postman支持所有的请求方式。 &#xff08;2&#xff09;URL 要组装一条Request…

Pytorch Advanced(二) Variational Auto-Encoder

自编码说白了就是一个特征提取器&#xff0c;也可以看作是一个降维器。下面找了一张很丑的图来说明自编码的过程。 自编码分为压缩和解码两个过程。从图中可以看出来&#xff0c;压缩过程就是将一组数据特征进行提取&#xff0c; 得到更深层次的特征。解码的过程就是利用之前的…

python-爬虫-urllib

网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又叫网络蜘蛛、网络机器人&#xff0c;是一种自动化数据采集程序 数据采集 → 数据处理 → 数据存储 常见的工作流程如下&#xff1a; 1.定义采集的目标&#xff08;网站、APP、公众号、小程序&#xff09;&#xff…

RP9学习-2

1.基本元素2 1.1树 可以收起 添加子菜单 选中树的节点即可添加 移动层级 编辑树属性 选中某行文字&#xff0c;点击Edit Tree Properties 可以把箭头变成加减&#xff0c;另外也可以导入自己的图标 注意要使用自己的图标&#xff0c;需要勾选Show Icon 也可以给某个节点单…

开放式耳机也会有巅峰音质体验-南卡NANK OE PRO

前言 这两年&#xff0c;开放式耳机市场发展迅猛&#xff0c;新品层出不穷&#xff0c;各大耳机厂商也都相继推出了自家的产品。而在众多的厂家中&#xff0c;作为国内开发式耳机的TOP1&#xff0c;南卡通过多年来在业内领域的经验和专业的技术能力&#xff0c;为广大音乐爱好…

fastadmin在前端调用 /api/common/upload 返回未上传文件或超出服务器上传限制

第一步&#xff1a;在api目录直接调用 域名/api/common/upload 上传图片的时候要在Common.php文件里面把验证登录的 protected $noNeedLogin [init]; 方法注释掉。 // protected $noNeedLogin [init];protected $noNeedLogin *;protected $noNeedRight *; 第二步&#…

计算机竞赛 大数据分析:基于时间序列的股票预测于分析

1 简介 Hi&#xff0c;大家好&#xff0c;这里是丹成学长&#xff0c;今天向大家介绍一个大数据项目 大数据分析&#xff1a;基于时间序列的股票预测于分析 2 时间序列的由来 提到时间序列分析技术&#xff0c;就不得不说到其中的AR/MA/ARMA/ARIMA分析模型。这四种分析方法…