前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者
网络工程师 前端工程师 项目经理 阿里云社区博客专家
email: 337674757@qq.com
vx: 文章最下方有vx链接
资料/交流群: vx备注docker
前文链接:
Windows使用docker教程(一):配置与安装docker
Windows使用docker教程(二):镜像与容器的介绍和使用
Windows使用docker教程(三):容器的基本使用命令
进入容器(Linux)映射端口实现挂载MySQL
提示:最终挂载以
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
(建议学习时直接复制),如下图所示:
图片中蓝色框的是数据库的根密码,即在连接数据库时需要输入的密码,这里设置为123456
命令-e
是用来设置环境变量(Environment Variables) 的
此外,mysql
的端口号为3306
,这里也做了端口映射,回想一下,之前wordpress
的则是80
端口
这个环境变量哪来的?在docker hub
的mysql
的介绍中,如下图所示:
在这个介绍页中还有例如数据库名、数据库用户等环境变量,如下图所示:
碍于篇幅,这里不对上述环境变量一一测试,感兴趣的小伙伴可以在学习后自行测试
实际上,此刻就可连接MySQL
,打开navicat for mysql
,点击左上角的连接按钮,选择mysql
,如下图所示:
然后输入设置的密码123456
,如下图所示:
现在可看到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.7
和8.0
,这还是仅仅讨论mysql
,所以docker
在需要更新和维护的时候更胜一筹 - 环境隔离:
docker
可以同时开启多个容器,换句话说同时运行多个数据库管理系统,且互相隔离,在小皮面板是单个数据库管理系统运行多个数据库**(关键)**
测试容器的环境隔离
为了更清楚的展示容器环境隔离的强大,现在可以做一个测试
现在我们在navicat
的mysql
中新建一个名为test
的数据库,并创建一个名为user
的表,如下图所示:
然后我们再启动一个容器,但端口号为3307
,如下所示:
注意:此时是2
个MySQL数据库管理系统,而不是2
个数据库
接着在navicat
连接secondmysql
,可以看到没有任何问题,如下图所示:
容器的数据存储
我们有很多情况都会删除容器,特别是短期的任务,那删除之后容器相关的数据怎么办?
进入容器内部
每一个容器就是一个小型的操作系统,里面包含了Linux
的核心文件。先输入exec -it
命令进入容器内部,如下图所示:
这里的/bin/bash
是指使用bash
,这是用来与操作系统交互的,执行后即进入了linux
的操作系统,输入ls(linux命令,用于列出当前的目录内容)
,可看到当前处于系统的根目录,有/bin
、/boot
、/dev
等,所以说每一个容器就是一个小型的操作系统
进入MySQL的存储目录
我们要处理的,就是要把MySQL
的存储文件和设置文件,映射到本地的机器,换句话说,就是本地有个文件夹,与linux
中保存MySQL
的文件夹映射起来,现在的问题是,MySQL
在linux
的存储目录在哪里?两个不同的操作系统(windows
和linux
)之间映射需要注意什么?
通过阅读文档,可以知道MySQL
的设置文件和存储数据的所在地,那么下一步就是映射了
本地目录映射与卷映射
在文档中,也给出了映射的命令,即-v /my/custom:/etc/mysql/conf.d
和-v /my/own/datadir:/var/lib/mysql
,但这是同为linux
操作系统的前提下
目录映射的命令格式为-v '/本地目录':'映射目录
目录映射和卷映射的区别在于,目录映射不会带有原来的文件,而卷映射会和linux
内的文件保持一致
另外,即使本地有文件,也就是这个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