文章主人公:帅哥BUG😎
文章路人: 路人 🤨 路人 😛
目录
一.安装mysql并配置文件
1.下载相关镜像
3.conf目录
4.data目录(创建mysql5.7容器)
1.ip addr 获取ip
2.点击连接选择MySql
3.输入ip,密码123456
4.点击测试一下连接
三.mysql容器的持久化测试
1.新建一个数据库
2.删除移除mysql容器
3.再次创建mysql容器
docker pull mysql/mysql-server:5.7
注:指令解释
mysql/mysql-serve:镜像的仓库名称和镜像名称
后面的mysql标签是版本号,可选择,有:5.5/5.6/5.7/8.0
常见的mysql的版本是5.几和 8.几的
🤨:为什么要挂载容器的相关数据?
😎:容器里面是不能存放重要文件的,如果容器被删除,容器里的数据将不复存在,
假设1:容器挂载了一个宿主机目录,容器和宿主机的目录是同步的,那么数据也是同步的,就算我们不小心删除了容器,没事!,创建一个容器再次挂载之前的宿主机目录,容器好是有之前的数据
假设2:容器是基于镜像创建的,那么好,下方图中是两种基础镜像,
容器a是基于apline创建的
容器b是基于centos创建的
要执行 vi 或 vim 编辑文件的时候
容器b有较完整的系统可以编辑文件,
但是容器a不能编辑文件,
因为根据alpine镜像创建的容器系统是不完整的,还要自己去下载,
但是我们可以让容器a挂载宿主机目录,我们在宿主机目录或者文件夹当放上配置文件或指令
在容器创建的时候挂载宿主机目录,就算在容器基于镜像alpine创建之后里面的指令不完善,但是由于容器挂载了宿主机目录,还是可以正常执行指令的,
😛:我不能直接配置文件或着指令下载到容器里面吗?
😎:可以,但是如果你再次创建容器的时候,这些配置文件和和指令还要重新下载,但是我们在宿主机目录或者文件夹当放上配置文件或指令,容器再次创建的时候去挂载宿主机目录就可以了,不用去重复的操作,
创建目录专门用来放mysql的数据,给容器挂载
mkdir -p /data/mysql/{conf,data}
注:指令解释
mkdir:新建文件夹的意思
-p 多级创建 就算没有data文件夹或者mysql,也会帮你自动创建
{conf,data}:在mysql目录下创建两个文件
cd 进入 ll 查看
必须提前上传my.cnf文件到/data/conf目录 并且它与window中的配置文件my.ini后缀名是不一样
my.cnf是配置文件里面内容如下:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
##官方的配置
skip-host-cache
skip-name-resolve
#datadir=/var/lib/mysql!!!!!!!!!这是容器当中mysql的存储位置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
# default: sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# modeified:
sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_allowed_packet=10M
default-time_zone='+8:00'
default_authentication_plugin=mysql_native_password
我用的是连接工具 可以直接复制进去 , 你们可以用rz上传,显示没有rz命令可以去网上找选择方法
数据保存到宿主机中,下次需要的时候重启容器,原有数据都能被加载,不会丢失数据
创建mysql5.7容器
docker run -p 3306:3306\
--name mysql \
-v /data/mysql/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/data:/var/lib/mysql \
--privileged=true \
--restart=always \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql/mysql-server:5.7
指令解释:
\ :是换行的意思
run:创建并运行
ip:用宿主机的3306映射容器的3306
--name:给容器取名字
-v:是进行目录挂载
-v /data/mysql/conf/my.cnf:/etc/my.cnf 意思是把宿主机的my.cnf挂载到容器的myc.nf,容器没有这个文件会自动创建
-v /data/mysql/data:/var/lib/mysql 把宿主机的data文件夹和容器的数据存储位置挂载到一起,/var/lib/mysql 这个目录要和my.cnf配置的路径一样哦
--privileged=true:让里面的用户有权限。使用该参数,container内的root拥有真正的root权限, 否则,container内的root只是外部的一个普通用户权限
--restart=always:可以不用这个指令
表示当前是否进行重启,一直重启或者总是重启
容器自动启动参数,其值可以为[no,on-failure,always]
no为默认值,表示容器退出时,docker不自动重启容器
on-failure表示,若容器的退出状态非0,则docker自动重启容器,
还可以指定重启次数,若超过指定次数未能启动容器则放弃
always表示,只要容器退出,则docker将自动重启容器
-e MYSQL_ROOT_PASSWORD=123456:设置root的密码
-d mysql/mysql-server:5.7:后台启动模式及使用的镜像
我们在创建完容器之后 cd 进入data ll 查看 ,可以看到生成了很多文件,这是msql自动给你放进来的
5.进入容器mysql
docker exec -it mysql bash
6.登录mysql
mysql -uroot -p 密码:123456
7.修改mysql允许Navicat远程连接
(1).查看四个库
show databases;
msql这个库是比较重要的 是跟用户相关的数据
(2).使用mysql库
use mysql;
(3).查看用户表所有信息
select * from user;
(4).查看用户表user中的字段user和host所有信息
select user,host from user;
可以看到有一个root用户,其他三个是不能用的,可以自己去新建一个,我们主要看root后面的host,host表示当前能够登录的主机,localhost表是本地进行登录,如果你希望root在任何地方都能进行远程登录可以改成%,如果希望太某个ip登录可以,那你可以把这个IP给它写死
(5).给用户授权
grant all privileges on *.* to root@'%' identified by '123456';
我们把root主机改成%好号之后就意味着,这个用户可以远程登录了
在使用select user,host from user; 查看字段信息 root 的主机变成%了
(5).把权限重新更新
flush privileges;
更新权限后,外部就可以使用native进行连接了
连接软件有很多,我用的是Navicat
欧克 ,连接到了 ,我们现在持久化测试一下看看
在数据库里面创建一个表aa编写两个字段id和name
录入一点数据
直接删除移除mysql容器,在重新创建
docker rm -f mysql
删除之后我们在去Navicat刷新一下,发现出bug了,如果按照以前的方式去使用容器,容器一删除,数据就会消失不见了,
docker run -p 3306:3306 --name mysql -v /data/mysql/conf/my.cnf:/etc/my.cnf -v /data/mysql/data:/var/lib/mysql --privileged=true --restart=always -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:5.7
创建之后我们在去Navicat刷新一下,又有数据了,就意味着我们就算把容器给删除了,数据也不会丢失,再次创建的时候还有数据
数据还在的原理是,我们所有的MySQL数据都没有放在人里面,而是放在了temp文件里
我们cd 进入 /data/mysql/data 使用 ll 查看可以发现 temp 文件 数据都在temp里面
容器因为挂载了宿主机目录!只要宿主机的数据还在,那不管容器在怎么删除,也不会丢失数据,
我们可以备份一下temp文件
mysqldump -uroot -p123456 temp > a.sql
mysqldump:备份
-uroot -p123456:登录mysql 密码是123456
temp:要备份的文件
a.sql:备份到a.sql里面
ls 查看一下 ,可以看到有这个备份文件了,但是不行,因为现在的备份文件在容器里,容器一删除,备份文件就没了
我们可以在宿主机专门创建一个文件夹放备份文件
这个操作和在Navicat
是一样的道理
我敲BUG的Docker专栏:http://t.csdn.cn/ypXDz