在参考了大量文章之后,终于弄懂了mysql容器实现配置本地化、数据本地化的方法。下面我将详细介绍,如果对大家有用的话希望大家关注或者评论一下!在过程中哪一步报错了也可以在评论中说下!
1.先把局域网内连接mysql容器
第一步:从docker中拉取MySQL镜像
docker pull mysql
第二步:生成mysql容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci
参数说明:
-e MYSQL_ROOT_PASSWORD="123456":设置root用户密码
--character-set-server=utf8:设置字符集为utf8
--collation-server=utf8_general_cli:设置字符比较规则为utf8_general_cli
第三步:测试连接MySQL
这里我使用navicat远程连接,连接MySQL前需要防火墙开放端口或者关闭防火墙。
开放端口:
$ sudo firewall-cmd --add-port=3306/tcp
关闭防火墙:
$ sudo systemctl stop firewalld
一般这个时候用navicat会报错连接不了,如果连接成功可以跳过
解决方案如下:
1.输入docker exec -it mysql bash进入容器
2.接着输入mysql -uroot -p进入mysql 密码是生成mysql容器时指定的MYSQL_ROOT_PASSWORD
3.输入ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
此时就能连接上了
若在输入ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';报错
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'
则依次输入:
use mysql;
select user,host from user;
#此时会输出:
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| admin | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| zhangj | localhost |
+------------------+-----------+
注意我的root,host是'%' 若你的是localhost,则命令改为:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
此时用navicat就可以连接成功了!
2.实现docker挂载数据卷到本地 mysql实现容器配置本地化
当希望在本地上配置容器中的mysql时,发现一个问题,本地需要完整的配置文件目录,如果本地是空目录,那么容器中的配置目录也是空的所以不能运行镜像,这里解决这个问题,思路是任意运行一个容器,把里面的配置目录复制到本地,然后删除这个容器,再创建新的容器,并把复制出来的配置目录和容器中的配置目录同步。
第一步:创建一个本地配置目录
输入命令:mkdir -p /root/DockerCommonConfig/MysqlConfig/,建立文件夹路径。
然后进入到该目录下 cd /root/DockerCommonConfig/MysqlConfig
第二步:创建任意一个镜像并映射配置目录
docker run --name tempMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd"):/app -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci
注意:暂时把本地配置目录和容器中的app文件夹关联(不能直接关联容器配置目录,由于文件同步原因这会导致容器配置目录为空无法启动容器),后续会把容器的配置文件复制到app,达到复制容器文件的目的。
参数解释:
-v 表示挂载数据卷,格式是 -v localPath:containerPath 本地目录:容器目录
$("pwd") 表示当前目录的路径,具体自己控制台输入 echo $("pwd") 尝试。
-e 参数必须有 否则容器无法启动
输入docker ps -a 查看status是Up的就算启动成功
第三步:复制配置目录到本地
docker exec -it tempMysql /bin/bash 进入容器命令行,
通过指令:cp -r /etc/mysql /app 指令把etc目录下的mysql文件夹,复制到app目录下,由于之前做了本地同步,所以能看到本地文件夹内有mysql文件夹,如下
第四步:删除容器并创建新容器再同步配置目录
通过docker rm -f tempMysql 删除容器,然后本地进入mysql文件夹和容器中的mysql文件夹做同步。
docker run --name localMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd")/mysql:/etc/mysql -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci
参数说明:
--privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
-v $("pwd")/mysql:/etc/mysql:映射配置文件
输入docker ps -a 查看status是Up的就算启动成功
那么如何检查有没有起作用呢?
我们可以通过修改刚刚同步过来的mysql文件,然后再进容器里查看是否奏效
cd root/DockerCommonConfig/MysqlConfig/mysql
vim my.cnf
然后在最下面添加一行注释,按esc退出后 输入:wq保存
然后我们再次进入到这个容器里 docker exec -it localMysql /bin/bash
输入 cd etc/mysql 进入到配置文件目录下
然后输入cat my.cnf 擦看该配置文件 发现最后一行已经多出了刚刚添加的注释
我们的mysql实现容器配置本地化就算成功了
3.最后实现容器数据本地化
第一步:创建一个本地的数据存储目录
mkdir root/docker/mysql/data
第二步:进入到宿主机内存储mysql数据的目录下,把数据文件复制到第一步创建的存储目录中
cd /var/lib/mysql
cp -r /var/lib/mysql /root/docker/mysql/data
若宿主机没有安装过mysql,就先安装再复制
第三步:创建新容器再同步配置目录与数据目录
注意要把上面创建的localMysql先删掉:docker rm -f localMysql
docker run --name localMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd")/mysql:/etc/mysql -v /docker/mysql/data/mysql:/var/lib/mysql -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci
输入docker ps -a 查看status是Up的就算启动成功
那么如何检查有没有起作用呢?
我们可以先进入该容器 docker exec -it localMysql /bin/bash
再进入到mysql里 mysql -uroot -p
输入密码123456
然后创建一个数据库 create database TestDB;
然后我们把该容器删除,再用上面的命令重新创建一个
先输入一次exit退出mysql,再输入一次exit退出容器
然后执行 docker rm -f localMysql
然后再创建容器
docker run --name localMysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v $("pwd")/mysql:/etc/mysql -v /docker/mysql/data/mysql:/var/lib/mysql -d mysql --character-set-server=utf8 --collation-server=utf8_general_ci
创建成功后我们进入到该容器再进入到mysql里
docker exec -it localMysql /bin/bash
mysql -uroot -p
输入命令show databases;
发现TestDB已经存在,说明我们数据本地化也已经实现了
注意:
1.每次容器想要远程连接时,都要像第一点那样进入到mysql里然后输入
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
2.我们只是把mysql的数据复制过来了/root/docker/mysql/data这个目录而已,实际上宿主机内的mysql数据还是会存放在/var/lib/mysql中。因此要更改宿主机内的mysql配置 参考这篇博文:https://blog.csdn.net/qq_21573899/article/details/78843075