Windows使用docker教程(四):挂载MySQL并完成本地映射

前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者 
网络工程师 前端工程师 项目经理 阿里云社区博客专家 

email: 337674757@qq.com
vx: 文章最下方有vx链接
资料/交流群: vx备注docker

前文链接:
Windows使用docker教程(一):配置与安装docker
Windows使用docker教程(二):镜像与容器的介绍和使用
Windows使用docker教程(三):容器的基本使用命令


提示:最终挂载以 MySQL5.7版本为例,碍于篇幅和讲述内容,本文不介绍 MySQL的具体使用方法

安装和挂载MySQL

首先拉取MySQL5.7.19,命令为docker pull mysql:5.7.19,其次是运行mysql,命令为docker run -d -p 3306:3306 --name firstmysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.19(建议学习时直接复制),如下图所示:
安装mysql
图片中蓝色框的是数据库的根密码,即在连接数据库时需要输入的密码,这里设置为123456

命令-e是用来设置环境变量(Environment Variables)

此外,mysql的端口号为3306,这里也做了端口映射,回想一下,之前wordpress的则是80端口

这个环境变量哪来的?在docker hubmysql的介绍中,如下图所示:
密码命令
在这个介绍页中还有例如数据库名、数据库用户环境变量,如下图所示:
环境变量
碍于篇幅,这里不对上述环境变量一一测试,感兴趣的小伙伴可以在学习后自行测试

实际上,此刻就可连接MySQL,打开navicat for mysql,点击左上角的连接按钮,选择mysql,如下图所示:
选择Mysql
然后输入设置的密码123456,如下图所示:
输入密码
现在可看到mysql已出现在本地与数据库的连接中,如下图所示:
查看mysql
但是这里时间不对(笔者写时为下午3点),可看MySQL后端返回给前端的时间变了(时区问题)

当我们关闭容器后,再次运行就会显示2003 - Can't connect to MySQL server on 'localhost'(10038)的报错,如下图所示:
关闭数据库

navicat中双击mysql,可以看到很多表,这些是系统的表,是MySQL内部用于管理用户权限、存储过程、事件调度等核心功能所必需的表

但现在我们应该怎么使用mysql?右键localhost_3306,选择新建数据库,即可创建自己的数据库了
新建数据库

容器开启MySQL与小皮面板启动MySQL的区别

因为在B站的项目后台管理系统使用的是小皮面板,所以这边也说一下两者的区别

使用mysql前提都需要sql语言基础,这里的区别主要是指环境配置方面

  • 学习成本:小皮面板傻瓜式操作,无需docker命令和Linux命令基础,比docker方便
  • 可移植性:小皮面板不同的操作系统需要安装不同的软件,docker在不同的操作系统其实也需要安装docker,但是如果一个项目的环境十分复杂,那么小皮面板迁移的难度就比较高,这一点还是看项目的复杂度,如果像项目只在小皮面板开启一个数据库用来玩,那两者都差不多,毕竟sql文件在哪都一样;如果项目复杂, 那docker镜像可以轻松的在其他(不同内核)机器部署,非常方便
  • 资源管理:docker能够给出很细致的占用情况docker stats,小皮面板这方面支持的不多,但也有,如下图所示:
    资源状态
  • 更新维护:在docker可以随便安装不同的mysql版本,但在小皮面板受支持的不多,一般只有5.78.0,这还是仅仅讨论mysql,所以docker在需要更新和维护的时候更胜一筹
  • 环境隔离:docker可以同时开启多个容器,换句话说同时运行多个数据库管理系统,且互相隔离,在小皮面板单个数据库管理系统运行多个数据库**(关键)**

测试容器的环境隔离

为了更清楚的展示容器环境隔离的强大,现在可以做一个测试

现在我们在navicatmysql中新建一个名为test的数据库,并创建一个名为user的表,如下图所示:
创建user表
然后我们再启动一个容器,但端口号为3307,如下所示:
第二个容器
注意:此时是2个MySQL数据库管理系统,而不是2个数据库

接着在navicat连接secondmysql,可以看到没有任何问题,如下图所示:
同时连接两个mysql

容器的数据存储

我们有很多情况都会删除容器,特别是短期的任务,那删除之后容器相关的数据怎么办?

进入容器内部

每一个容器就是一个小型的操作系统,里面包含了Linux的核心文件。先输入exec -it命令进入容器内部,如下图所示:
进入容器内部
这里的/bin/bash是指使用bash,这是用来与操作系统交互的,执行后即进入了linux的操作系统,输入ls(linux命令,用于列出当前的目录内容),可看到当前处于系统的根目录,有/bin/boot/dev等,所以说每一个容器就是一个小型的操作系统

进入MySQL的存储目录

我们要处理的,就是要把MySQL的存储文件和设置文件,映射到本地的机器,换句话说,就是本地有个文件夹,与linux中保存MySQL的文件夹映射起来,现在的问题是,MySQLlinux的存储目录在哪里?两个不同的操作系统(windowslinux)之间映射需要注意什么?

设置文件
存储位置
通过阅读文档,可以知道MySQL的设置文件和存储数据的所在地,那么下一步就是映射了

本地目录映射与卷映射

在文档中,也给出了映射的命令,即-v /my/custom:/etc/mysql/conf.d-v /my/own/datadir:/var/lib/mysql,但这是同为linux操作系统的前提下

目录映射的命令格式为-v '/本地目录':'映射目录

目录映射卷映射的区别在于,目录映射不会带有原来的文件,而卷映射会和linux内的文件保持一致

另外,即使本地有文件,也就是这个MySQL,他本身就有配置文件,如下图所示:
mysql配置文件
如果执行了目录映射MySQL会读取不到本身的配置文件,从而可能导致出问题,可以看下面的例子:
空目录
因为进行了目录映射,所以访问的是容器外的目录,而容器外的目录在执行命令的时候自动创建,是空的,所以执行ls也是空,如果映射的文件是有关启动容器的,而容器外的目录为空,那么容器就会启动失败

而如果是卷映射,就会在执行命令的时候在docker生成一个卷(volume)

卷映射的命令格式为-v '卷名':'映射目录,注意!此时没有/开头,卷不是路径!!

下面来看一个例子:
卷
通过docker volume inspect '卷名'可以查看卷的位置,可以看到卷也是处于容器外的,现在通过docker desktop看一下卷里面有没有mysql的配置文件,答案是有原文件的,如下图所示:
原文件
当然,也可以通过命令cd /var/lib/docker/volumes/myconf/_data去找到这个文件,前提是linux,但我们讲的是在windows上运行,所以使用桌面平台也是一个不错的选择

那么当完成映射之后,数据就不会丢失了,一个是可以存在本地,一个是可以存在docker的卷,这两个位置都是容器外的,即使容器被删除了,也不会影响到

如果想在新的容器继续使用原来容器的数据(假设原来的容器被删了),那么就可以通过映射命令,将新容器的存储文件目录指向容器外的存储目录

windows目录映射的小细节

windows的映射其实与linux并无多大不同,需要注意的是文件的路径,例如想映射到C盘,就需要在路径前加上 C:,代码如下所示:

docker run -d -p 3306:3306 ^
-v C:/app/myconf:/etc/mysql/conf.d ^
-v C:/app/mydata:/var/lib/mysql ^
-e MYSQL_RANDOM_ROOT_PASSWORD=123456
mysql:5.7.19

这里的^是命令行的换行符

经过测试,C:\app\myconf:/etc/mysql/conf.d这样也会在本地创建目录,即/也行,\也行

Windows使用docker教程(五):内部网络及容器互通案例

本节命令总结

  • 设置环境变量:-e👉环境即Environment
  • 进入容器:exec -it
  • 目录映射:-v /目录路径:容器目录路径
  • 卷映射: -v 卷名:容器目录路径
  • 查看卷:docker volume inspect '卷毛'
欢迎关注csdn前端领域博主: 前端小王hs,喜欢可以点个赞!您的支持是我不断更新的动力!🔥🔥🔥

前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者 
网络工程师 前端工程师 项目经理 阿里云社区博客专家 

email: 337674757@qq.com
vx: 文章最下方有vx链接
资料/交流群: vx备注docker
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小王hs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值