Docker安装多个不同版本的mysql

下载镜像

由于我们可能需要安装不同版本的mysql,这里我决定同时装两个版本的mysql
拉取最新版本:

docker pull mysql

拉取指定版本:

docker pull mysql:5.7.25

 

创建目录和配置

首先我们根据两个不同版本的mysql创建以下目录结构:
/docker/{mysql57,mysql8x}
再在两个mysql目录下,各创建一个conf目录和data目录用来存放配置文件和数据
如果只是装一个版本的mysql,创建成这样既可:
/docker/mysql/{conf,data}

在两个conf目录下分别创建my.cnf配置文件
touch /docker/mysql/conf/my.cnf

my.cnf添加如下内容:

[mysqld]
log_timestamps=SYSTEM
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
lower_case_table_names=1
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

解析:
log_timestamps=SYSTEM:日志记录使用UTC时区,需要修改成系统时区
character-set-server=utf8:设置字符集为utf8
default_authentication_plugin:mysql8.0后的默认认证插件是caching_sha2_password,会导致我们用Navicat连接不上的问题,避免麻烦直接改成以前的认证方式
lower_case_table_names=1
因为windows默认是1,linux默认是0,Mac OS X默认是 2,开发中很容易因为本地数据库和线上数据库配置不统一,而导致出问题(windows和mac不能设置为0,最多改成1和2)
下面比较的意思是指:在代码里sql用到表名的地方,用大写表名能否查出数据库里的小写表名。
0:创建的时候区分大小写,查询比较的时候也区分大小写
1:代表创建表是一律小写的,但比较的时候不区分大小写(输入大写表名也能查到)
2:代表创建表区分大小写,但比较的时候是小写的(应该是不区分的意思,mac系统没用过也不懂,以后估计也用得少就不管它了)。

 

启动

5.7版本的mysql

docker run -d -p 3506:3306 --name mysql57 --privileged=true -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data57:/var/lib/mysql  -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25 

为了方便查看分析,下面几行是上面那条指令的详细内容
docker run -d -p 3506:3306 --name mysql57 --privileged=true -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data57:/var/lib/mysql -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.25

 
8.x版本的mysql,注意挂载的data和conf目录不一样了

docker run -d -p 3806:3306 --name mysql8x --privileged=true -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/logs:/logs -v /docker/mysql/data8x:/var/lib/mysql -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

为了方便查看,下面几行是上面那条指令的详细内容
docker run -d -p 3806:3306 --name mysql8x --privileged=true -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/logs:/logs -v /docker/mysql/data8x:/var/lib/mysql -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=123456 mysql:latest

参数说明:
-p 3806:3306:把容器内的3306端口映射到本机的3806端口,我们远程连接的时候也是连3806
–privileged=true:大约在0.6版,privileged被引入docker。
使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
-v /docker/mysql/conf/my.cnf:/etc/my.cnf:映射配置文件
-v /docker/mysql/data:/var/lib/mysql:映射数据目录
-v /etc/localtime:/etc/localtime:映射linux时间文件(为了让容器时间和主机时间同步)
设置环境变量参数说明,这里我为了方便只设置了root密码:
-e MYSQL_USER=“woniu” :添加woniu用户
-e MYSQL_PASSWORD=“123456”:设置添加的用户密码
-e MYSQL_ROOT_PASSWORD=“123456”:设置root用户密码

 

远程连接

5.7.25版本的配置远程连接
首先进入容器
docker exec -it mysql57 /bin/bash
登录mysql
mysql -uroot -p123456
给权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
刷新权限
FLUSH PRIVILEGES;
退出
EXIT;

然后是8.x版本的配置远程连接
首先进入容器
docker exec -it mysql8x /bin/bash
登录mysql
mysql -uroot -p
选择mysql库
use mysql;
查询user表数据,用户信息都存在这个库的user表中
select host, user, authentication_string, plugin from user;
授权root用户可以远程登陆
GRANT ALL ON *.* TO 'root'@'%';
刷新权限
FLUSH PRIVILEGES;
修改加密规则
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
更新 root 用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
刷新权限
FLUSH PRIVILEGES;

另外退出docker容器的方法是按住Ctrl+p+q

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值