Docker使用教程(2): 数据卷的使用以及使用docker安装mysql

一. 前言

   许久没有更新, 是我偷懒了. 后果也是很严重的, 至少为了写这篇文章我又复习了半个小时, 哈哈. 今天写的是docker中的数据卷, 我们开始吧…

二. 什么是数据卷? 它有什么好处?

   回答上述两个问题之前我先提出一个问题: 经过上一篇文章的入门, 我们学会了docker的基本使用, 诸如拉取镜像、启动容器之类的操作. 那假如我们不小心把容器删除了, 那容器中的数据也会随之消失, 这显然是不对的. 这时我们就需要将容器中的文件备份出来才行, 怎么做?

   docker为我们提供了一个cp命令, 虽然不是本文主题, 但还是有必要提一下, 使用如下:
   docker cp 容器id:/源路径 /目标路径 —将容器下的文件拷贝到linux
   docker cp /源路径 容器id:/目标路径 —或者将linux下的文件拷贝到容器

这么看可能有迷…我来演示一下吧, 下图中, 我是将linux系统/home目录下的test.txt文件拷贝到docker容器的/opt目录下:

docker的cp命令.png

   很简单吧? 如果要将docker中的文件拷贝出来, 只需要对调源路径和目标路径就可以了. 不过这种方式虽然简单, 但显然满足不了我们备份的需求. 比如我们mysql的数据文件, 不可能写个脚本就干这事儿, 一是消耗性能, 二是可能数据还不一定同步.

   假如我们能把docker容器内部的文件和linux上的文件建立一个关联, 任何一边修改变动时, 另一边自动同步那该多好. 哈哈, 凑巧的是, docker的数据卷就是干这个事情的. ok, 下面我就来记录一下安装mysql并使用数据卷备份和同步数据文件到linux吧.

三. 使用docker搭建mysql并挂载数据卷

(1) 可以使用-v来挂载路径: docker run -it -v 主机目录:容器目录

(2) 拉取mysql:8镜像, docker pull mysql:8

(3) 启动mysql:8, docker run -d -it --rm -p 3306:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:8

参数说明:
--rm # 容器停止即删除实例, 可以不加
-e # 添加环境变量, MYSQL_ROOT_PASSWORD设置密码
-v # 挂载数据卷, 可以使用多个-v来挂载多个数据卷, 挂载之后, 挂载的两个目录下的文件会进行同步

(4) 不过我遇到一个问题, 就是将mysql容器内部的配置文件挂载到linux外部之后, 会启动失败或配置文件没有同步到宿主机. 具体原因在下也不知道, 欢迎留言告知. 不过, 据我测试, 只要将配置文件事先创建好, 再进行挂载就可以了. 以下是官网的说法:

docker-mysql配置文件.png

官网的示例中挂载的是一个目录, 显而易见那个/my/custom目录中已经存在一个自定义的配置文件, 而且还说是一个叫做config-file.cnf文件. 所以, 我也创建了一个扔在目录下, 并且什么都没配:

docker-mysql配置文件2.png

随后挂载并启动了它:

docker run -d -it --rm -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql01 mysql:8

然后它启动成功了, 不过我想应该是配置文件需要自己创建的原因, 因为我在不挂载配置文件的情况下进入过mysql的容器去查看配置文件, 里边儿的配置文件也是什么都没有配置.

(5) 总而言之, 配置相关只需要挂载文件夹, 然后自己定义配置内容, 配置文件的名称可以是config-file.cnf。

(6) 这时候, 就算不小心将mysql的容器删除了也没有关系, 只要再次指定数据卷的挂载路径, 数据就回来啦.

四. 挂载数据卷的三种方式及区别

挂载的方式分别有如下三种:

(1) 匿名挂载: -v 容器内路径.
比如: docker run -d -it --rm -p 8080:8080 --name tomcat01 -v /usr/local/tomcat/webapps tomcat:9
此时, tomcat的webapps会被挂载到宿主机的/var/lib/docker/volumes文件夹下, 并随机生成一个文件夹. 可以使用docker volumes ls命令查看有哪些匿名挂载的数据卷.

(2) 具名挂载: -v 卷名:容器内路径
比如: docker run -d -it --rm -p 8080:8080 --name tomcat01 -v tomcat01:/usr/local/tomcat/webapps tomcat:9
与匿名挂载的区别在于, 它在/var/lib/docker/volumes目录下生成的文件夹名不再是无意义的了, 而是你指定的名称, 如此处的tomcat01

(3) 指定路径挂载: -v 宿主机路径:容器内路径
这种方式就是上面演示的方式. 区别也是显而易见, 自定义了数据的保存位置.

好了, 数据卷的使用就记录到这里, 欢迎留言指正和交流

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享