文章主人公:帅哥BUG

文章路人: 路人 路人

目录

一.安装mysql并配置文件

1.下载相关镜像

2.在宿主机中创建相关目录,用于挂载容器的相关数据

3.conf目录

4.data目录(创建mysql5.7容器)

二.使用Navicat远程连接mysql容器

1.ip addr 获取ip

2.点击连接选择MySql

3.输入ip,密码123456

4.点击测试一下连接

三.mysql容器的持久化测试

1.新建一个数据库

2.删除移除mysql容器

3.再次创建mysql容器


一.安装mysql并配置文件

1.下载相关镜像

docker pull mysql/mysql-server:5.7

注:指令解释

mysql/mysql-serve:镜像的仓库名称和镜像名称

后面的mysql标签是版本号,可选择,有:5.5/5.6/5.7/8.0

常见的mysql的版本是5.几和 8.几的

2.在宿主机中创建相关目录,用于挂载容器的相关数据

:为什么要挂载容器的相关数据?

:容器里面是不能存放重要文件的,如果容器被删除,容器里的数据将不复存在,

假设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 查看

3.conf目录

必须提前上传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命令可以去网上找选择方法

4.data目录(创建mysql5.7容器)

数据保存到宿主机中,下次需要的时候重启容器,原有数据都能被加载,不会丢失数据

创建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远程连接mysql容器

连接软件有很多,我用的是Navicat

1.ip addr 获取ip

2.点击连接选择MySql

3.输入ip,密码123456

4.点击测试一下连接

欧克 ,连接到了,我们现在持久化测试一下看看

三.mysql容器的持久化测试

1.新建一个数据库

在数据库里面创建一个表aa编写两个字段id和name

录入一点数据

2.删除移除mysql容器(测试一下数据是否会消失)

直接删除移除mysql容器,在重新创建

docker rm -f mysql

删除之后我们在去Navicat刷新一下,发现出bug了,如果按照以前的方式去使用容器,容器一删除,数据就会消失不见了,

3.再次创建mysql容器

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

是一样的道理


好啦 文章内容到这里就结束了 你学到了吗

觉得有用的记得关注点赞加收藏哦 我的Docker专栏还有其他关于Dokcer的技术点哦~

我敲BUG的Docker专栏:http://t.csdn.cn/ypXDz