项
目
实
践
关注后,回复“教程”,查看完整案例
01
下载mysql8.0镜像
下载mysql8.0的Docker镜像文件

查看镜像下载的镜像文件

02
启动mysql8.0容器
启动容器
docker run -p 3306:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=admin123 -d mysql:8.0
备注:
-p 容器端口映射
--name 容器名称
-e 配置信息,配置root密码
-d 设置镜像名称

查看启动的容器信息
docker ps

03
修改Mysql中root密码
进入Mysql容器
docker exec -it mysql8.0 bash
进入MySQl数据库命令行
mysql -uroot -p

查询MySQL数据库中用户信息
select host,user,plugin,authentication_string from mysql.user;

如果这里存在2个root信息,可以删除host=%的用户。(%代表可以所有IP均可以访问,localhost代表只能本机访问数据库)
使用以下MySQL命令删除host=%的root用户
use mysql
DELETE FROM user where host='%';
flush privileges;

再次登录数据库,查看用户信息

使用MySQL命令修改root密码
ALTER user 'root'@'localhost' IDENTIFIED BY 'Admin123*';

04
创建ncov数据库
使用MySQl命令创建ncov数据库及相应的ncov用户,并设置了密码为123456
CREATE USER `ncov`@`%` IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON ncov.* TO 'ncov'@'%';
FLUSH PRIVILEGES;
create database ncov;
在本地开发机器,使用navicat客户端连接远程的MySQL数据库

使用ncov用户可以成功连接ncov数据库

使用root用户无法连接,因为root用户设置的只能在localhost本地访问

通过下面的SQL语句创建数据表
create table students(
id int(11) not null auto_increment,
name varchar(20) not null,
sex char(1) default null,
add_time datetime default null ,
primary key(id)
)ENGINE=InnoDB AUTO_INCREMENT=1, DEFAULT CHARSET=utf8;
在客户端执行SQL语句

通过下面的SQL语句插入数据
insert into students(name,sex,add_time) value ('李四','男',now());
在客户端执行SQL语句

数据插入成功

在MySQL容器中使用命令行访问数据库
use ncov;
show tables;
select * from students;

将当前的MySQL数据库容器删除(一会我们再创建一个容器,看看ncov数据库是否保留)
docker rm -f mysql8.0

在云服务器重启一个新的MySQL数据库容器

进入新的容器,查看数据库信息,看看ncov数据库是否还存在
docker exec -it mysql8.0 bash
mysql -uroot -p
show databases;

可以发现,如果容器删除,之前在容器中创建的数据库也不存在了。
05
Docker数据持久化
在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),通过docker run -v命令可以将数据卷挂载到对应的容器目录空间
针对MySQL数据库,希望数据库的配置文件和数据库数据文件不能随着C容器的结束而结束,因此需要找到MySQL的配置文件和数据文件的位置。
查看Mysql的配置文件位置


查看MySQL配置文件内容

查看数据文件内容

通过上面的分析,可以确定配置文件和数据文件的位置
配置文件:/etc/mysql/my.cnf
数据文件:/var/lib/mysql/
在宿主机上,创建MySQl配置文件和数据文件的挂载路径
mkdir -p /usr/local/mysql/conf
mkdir -p /usr/local/mysql/data

将Mysql配置文件拷贝到宿主机
docker cp mysql8.0:/etc/mysql/my.cnf usr/local/mysql/conf

删除容器
docker rm -f mysql8.0

启动新的Mysql8容器,使用数据卷(包含了MySQL的配置文件和数据文件)创建容器
docker run --name mysql8.0 \
-p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin123 \
-v usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v usr/local/mysql/data:/var/lib/mysql \
-d mysql:8.0

这里指定了将宿主机上的/usr/local/mysql/conf/my.cnf绑定到容器的/etc/mysql/my.cnf(这个文件是MySQL的配置i文件),宿主机上的/usr/local/mysql/data 目录挂载到容器的/var/lib/mysql目录(这个目录是MySQl的数据目录)
查看数据卷绑定信息
docker inspect mysql8.0

进入容器中,通过MySQl命令创建ncov数据库(一会我们删除这个容器再新建一个容器看看数据卷能否实现持久化)
docker exec -it mysql8.0 bash
mysql -uroot -p
show databases;

create database ncov;
show databases;

创建完成ncov数据库后,删除这个容器
查看宿主机的/usr/local/mysql/data/目录内容
docker rm -f mysql8.0
ls /usr/local/mysql/data/

可以看到数据文件还存在
使用数据卷创建一个新的容器

进入容器,查看ncov数据库是否存在

可以看到,ncov数据库是存在的。
现在可以把root密码修改一下,禁止远程连接。并设置一个可以远程连接的账号,只能操作ncov数据库。(步骤略)
现在我们再也不怕容器出问题导致数据丢失了。但是如果云服务器出问题,那么我们的数据也还是会丢失的,大家考虑一下怎么才能定期备份我们的数据呢?或者我们可否做一个主从同步的数据库?这些我们会在后面的章节中给大家介绍。
END


让我知道你在看





