Docker 使用 MySQL

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Docker 使用 MySQL

      使用 Docker 来管理 MySQL、Redis 等各种中间件是十分方便的,无论是生产环境,还是开发环境都非常方便。今天来说一下我用 Docker 来管理 MySQL 时遇到的一个小坑。


在 Docker 下部署 MySQL

       在 Docker 下部署 MySQL 是很方便的,通过几条命令就可以轻轻松松的下载镜像并完成安装部署。

        首先,拉取MySQL镜像:

%dockerpullmysql:latestlatest:Pullingfromlibrary/mysqla076a628af6f:Alreadyexistsf6c208f3f991:Pullcomplete88a9455a9165:Pullcomplete406c9b8427c6:Pullcomplete7c88599c0b25:Pullcomplete25b5c6debdaf:Pullcomplete43a5816f1617:Pullcomplete1a8c919e89bf:Pullcomplete9f3cf4bd1a07:Pullcomplete80539cea118d:Pullcomplete201b3cad54ce:Pullcomplete944ba37e1c06:PullcompleteDigest:sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8cStatus:Downloadednewerimageformysql:latestdocker.io/library/mysql:latest

       上面的命令是拉取最新的MySQL镜像。然后查看下载的镜像。

%dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmysqllatestc8562eaf9d812monthsago546MB

       从结果可以看到,已经有了 mysql 的 image,然后我们启动运行容器,命令如下。

%dockerrun-itd--namemysql-test-p3306:3306-eMYSQL_ROOT_PASSWORD=123456mysql19949fb03dd9700bb9e57524317fca477c0407d82ae1ff0cbdd4669b0af6c778

       我们来查看容器的状态。

%dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES19949fb03dd9mysql"docker-entrypoint.s…"53secondsagoUp52seconds0.0.0.0:3306->3306/tcp,33060/tcpmysql-test

       此时就可使用 Navicat 等客户端工具来连接 MySQL 了。当然也可以进入 Docker 中进行管理。

%dockerexec-itmysql-test/bin/bashroot@19949fb03dd9:/# mysql -u root -pEnterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis42726Serverversion:8.0.23MySQLCommunityServer-GPLCopyright(c)2000,2021,Oracleand/oritsaffiliates.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>

       使用 docker exec 命令进入 Docker 后,然后直接使用 mysql 的命令来操作 MySQL。


       无论是创建库,还是创建表,包括写一些 SQL 命令看起来一切安好。


小坑

       上面看起来还都不错,但是在运行本地的程序时竟然出现了一个报错,报错如下:

badSQLgrammar[];nestedexceptionisjava.sql.SQLSyntaxErrorException:Table'test.SYS_CONFIG'doesn't exist

        上面的报错是提示表不存在,但是经过确认后该表是存在的,可能是表名大小写的问题?查看一下。

mysql>showvariableslike'%case%';+------------------------+-------+|Variable_name|Value|+------------------------+-------+|lower_case_file_system|OFF||lower_case_table_names|0|+------------------------+-------+2rowsinset(0.00sec)

       配置中 lower_case_table_names 的值为 0,该参数被指定为 0 的时候,那么存储时是按照指定的大小写进行存储的,且在读取时是区分大小写的。该参数如果为 1 时,那么在存储时是使用小写进行存储的,且在读取时是不区分大小的。该值的配置还有 2,这里就不讨论了,而且文档中介绍,只要使用 InnoDB,无论在哪个平台(Linux、MacOS、Windows)下,该参数都要给 1。

       那么我们就需要将 lower_case_table_name 的值设置为 1 才可以

       通常情况下,这种参数我们会通过 my.cnf 来进行设置,因此在my.cnf文件中,增加配置项:

lower_case_table_names=1

      修改完配置,然后重启 MySQL 的容易,命令如下。

%dockerrestart19949fb03dd9

      其中 19949fb03dd9 替换为自己的 container id。在命令行重启后没有什么提示,但是 MySQL 不能使用。检查日志,发现启动失败,在日志中存在错误提示:

[ERROR][MY-011087][Server]Differentlower_case_table_namessettingsforserver('1')anddatadictionary('0').

       配置文件与数据字典的配置不同,从而导致无法启动。数据字典是在 MySQL 数据库服务器初始化时设置的,而配置则不能与数据字典不一致,这是 MySQL 的一个限制。因此,我们需要重新创建一个 MySQL 的容器,并在启动时给 lower-case-table-names 参数设置为 1 即可。

%dockerrun-itd--namemysql-new-p3306:3306-eMYSQL_ROOT_PASSWORD=123456mysql--lower-case-table-names=15669d0d7c1776d2dc296a334484855f3c0c0a7d48d917e98d532e3a50b9c66d5%dockerexec-itmysql-new/bin/bashroot@5669d0d7c177:/# mysql -u root -pEnterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis86Serverversion:8.0.23MySQLCommunityServer-GPLCopyright(c)2000,2021,Oracleand/oritsaffiliates.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>showvariableslike'%case%';+------------------------+-------+|Variable_name|Value|+------------------------+-------+|lower_case_file_system|OFF||lower_case_table_names|1|+------------------------+-------+2rowsinset(0.00sec)

     这样 MySQL 的小坑就解决了。


总结

       以前使用 MySQL 没有遇到过此类的问题,这也是在 Docker 中使用 MySQL 时遇到的问题。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
关系型数据库 MySQL Linux
Docker安装Mysql5.7,解决无法访问DockerHub问题
当 Docker Hub 无法访问时,可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的问题。本文介绍了如何在 CentOS 上一键配置国内镜像加速,并成功拉取 MySQL 5.7 镜像。
488 2
Docker安装Mysql5.7,解决无法访问DockerHub问题
|
1月前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
104 1
|
2月前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
68 3
|
2月前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库如何设置忽略表名大小写?
【10月更文挑战第1天】使用Docker部署的MySQL数据库如何设置忽略表名大小写?
219 1
|
2月前
|
弹性计算 关系型数据库 MySQL
Docker安装MySQL
这篇文章详细介绍了如何使用Docker安装MySQL数据库服务,包括拉取镜像、配置数据卷以及启动容器的步骤。
364 0
Docker安装MySQL
|
2月前
|
关系型数据库 MySQL 数据库
如何使用Docker部署MySQL数据库?
【10月更文挑战第1天】如何使用Docker部署MySQL数据库?
190 0
|
2月前
|
关系型数据库 MySQL 数据库
docker mysql表名和数据库名不区分大小写
docker mysql表名和数据库名不区分大小写
21 0
|
3月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
4月前
|
关系型数据库 MySQL Linux
一文教会你如何在Linux系统中使用Docker安装Mysql 5.7版本 【详细过程+图解】
这篇文章提供了在Linux系统中使用Docker安装Mysql 5.7版本的详细过程和图解,包括安装指定版本、创建实例、启动、使用Navicat连接测试、文件挂载与端口映射、进入容器、配置文件修改以及重新启动容器等步骤。
一文教会你如何在Linux系统中使用Docker安装Mysql 5.7版本 【详细过程+图解】
|
4月前
|
关系型数据库 MySQL Docker
Docker 安装 MySQL
Docker 安装 MySQL
114 1