在上一篇中《在CentOS7中使用Docker安装MySql》中介绍了怎样在Docker
中安装Mysql
,但存在两个问题:
1、用户密码和字符集等的设置,需要安装完MySql
后,进入到MySql
中去设置,非常麻烦;
2、配置文件和数据文件都在MySql
的容器内,不是很安全。
本文将介绍怎样在创建容器时通过参数的配置来解决上面两个问题。
环境
CentOS:7.4
Docker:1.13.1
MySql:8.0.11
设置环境变量
设置环境变量和镜像的参数,可以来解决第一个问题,环境变量使用-e
的方式设置在镜像名称的前面;镜像的参数需要配置在镜像名称的后面
1docker run -d -p 4306:3306
2-e MYSQL_USER="fengwei"
3-e MYSQL_PASSWORD="pwd123"
4-e MYSQL_ROOT_PASSWORD="rootpwd123"
5--name mysql001
6mysql/mysql-server
7--character-set-server=utf8
8--collation-server=utf8_general_ci
环境变量说明:
-e MYSQL_USER="fengwei":添加用户fengwei
-e MYSQL_PASSWORD="pwd123":设置fengwei的密码伟pwd123
-e MYSQL_ROOT_PASSWORD="rootpwd123":设置root的密码伟rootpwd123
镜像参数说明:
--character-set-server=utf8:设置字符集为utf8
--collation-server=utf8_general_ci:设置字符比较规则为utf8_general_ci
使用SQLyog
进行测试,用户名和密码使用上面环境变量中添加的用户fengwei
和密码pwd123
,出现下图的错误

执行命令进入到容器中的MySql
中,执行下面的Sql
语句
1ALTER USER 'fengwei'@'%' IDENTIFIED WITH mysql_native_password BY 'password123';
再用SQLyog
测试,连接成功

上面连接不成功的问题也可以添加镜像参数--default-authentication-plugin=mysql_native_password
来解决,完整命令如下
1docker run -d -p 4306:3306
2-e MYSQL_USER="fengwei"
3-e MYSQL_PASSWORD="pwd123"
4-e MYSQL_ROOT_PASSWORD="rootpwd123"
5--name mysql001
6mysql/mysql-server
7--character-set-server=utf8
8--collation-server=utf8_general_ci
9--default-authentication-plugin=mysql_native_password
数据和配置挂载到宿主机
为了安全性,我们应该将数据和配置放到宿主机中,首先执行下面的命令创建data
目录和config
目录
1mkdir mysqltest
2cd mysqltest
3mkdir data
4mkdir config
执行下面命令进入到config
目录中,并在该目录中创建my.cnf
配置文件
1cd config
2touch my.cnf
my.cnf
配置文件内容如下
1[mysqld]
2user=mysql
3character-set-server=utf8
4default_authentication_plugin=mysql_native_password
5
6[client]
7default-character-set=utf8
8
9[mysql]
10default-character-set=utf8
执行下面命令创建容器
1docker run -d -p 4306:3306
2--restart always
3--privileged=true
4--name mysql001
5-e MYSQL_USER="fengwei"
6-e MYSQL_PASSWORD="pwd123"
7-e MYSQL_ROOT_PASSWORD="rootpwd123"
8-v=/mysqltest/config/my.cnf:/etc/my.cnf
9-v=/mysqltest/data:/var/lib/mysql
10mysql/mysql-server
参数说明
--restart always:开机启动
--privileged=true:提升容器内权限
-v=/mysqltest/config/my.cnf:/etc/my.cnf:映射配置文件
-v=/mysqltest/data:/var/lib/mysql:映射数据目录
特别说明
如果没有添加--privileged=true
参数,容器创建后不能正常启动,查看日志发现有权限的错误

容器正常创建启动后,可以用客户端工具进行连接测试。
总结和思考
1、不只是MySql
,应该是所有涉及到数据和配置的,都不应该放在容器内部。
2、使用-v
参数挂接外部数据时,如果data
目录已经存在容器能正常启动吗?
3、在docker run
命令中添加镜像参数和直接在my.cnf
中设置有什么区别?

本文分享自微信公众号 - 不止dotNET(moredotnet)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/187759/blog/4369315