美文网首页
Docker使用教程(2): 数据卷的使用以及使用docker安

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

作者: code养牧人 | 来源:发表于2021-05-07 22:42 被阅读0次

    一. 前言

       许久没有更新, 是我偷懒了. 后果也是很严重的, 至少为了写这篇文章我又复习了半个小时, 哈哈. 今天写的是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 -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 宿主机路径:容器内路径
    这种方式就是上面演示的方式. 区别也是显而易见, 自定义了数据的保存位置.

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

    相关文章

      网友评论

          本文标题:Docker使用教程(2): 数据卷的使用以及使用docker安

          本文链接:https://www.haomeiwen.com/subject/tqwedltx.html