docker通过数据卷挂载到本地实现mysql配置本地化、数据本地化

在参考了大量文章之后,终于弄懂了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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章