一. 前言
许久没有更新, 是我偷懒了. 后果也是很严重的, 至少为了写这篇文章我又复习了半个小时, 哈哈. 今天写的是docker中的数据卷, 我们开始吧...
二. 什么是数据卷? 它有什么好处?
回答上述两个问题之前我先提出一个问题: 经过上一篇文章的入门, 我们学会了docker的基本使用, 诸如拉取镜像、启动容器之类的操作. 那假如我们不小心把容器删除了, 那容器中的数据也会随之消失, 这显然是不对的. 这时我们就需要将容器中的文件备份出来才行, 怎么做?
docker为我们提供了一个cp
命令, 虽然不是本文主题, 但还是有必要提一下, 使用如下:
docker cp 容器id:/源路径 /目标路径
---将容器下的文件拷贝到linux
docker cp /源路径 容器id:/目标路径
---或者将linux下的文件拷贝到容器
这么看可能有迷...我来演示一下吧, 下图中, 我是将linux系统/home目录下的test.txt文件拷贝到docker容器的/opt目录下:
很简单吧? 如果要将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外部之后, 会启动失败或配置文件没有同步到宿主机. 具体原因在下也不知道, 欢迎留言告知. 不过, 据我测试, 只要将配置文件事先创建好, 再进行挂载就可以了. 以下是官网的说法:
官网的示例中挂载的是一个目录, 显而易见那个/my/custom目录中已经存在一个自定义的配置文件, 而且还说是一个叫做config-file.cnf文件. 所以, 我也创建了一个扔在目录下, 并且什么都没配:
随后挂载并启动了它:
docker run -itd -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 --name mysql mysql:8
redis同理:
但是需要下载一份儿配置文件, 如果想要自定义配置的话:
wget http://download.redis.io/redis-stable/redis.conf
由于容器可能取不到宿主机的东西, 给它开放权限: chmod 666 redis.conf
另外注意, 如果docker使用-d参数, 则表示守护进程模式启动, 所以配置文件中的daemonize需要保持为no
daemonize no
docker run -itd -p 6379:6379 -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf -v /mydata/redis/data:/data --name redis5 redis:5.0.14 redis-server /etc/redis/redis.conf
然后它启动成功了, 不过我想应该是配置文件需要自己创建的原因, 因为我在不挂载配置文件的情况下进入过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 宿主机路径:容器内路径
这种方式就是上面演示的方式. 区别也是显而易见, 自定义了数据的保存位置.
好了, 数据卷的使用就记录到这里, 欢迎留言指正和交流