• 六、数据管理


    于2021年9月29日重新编辑

    一、数据卷简介

    1.1 什么是数据卷

    数据卷就是将容器里的数据挂载出来,保存在宿主机上或者专门的容器上,相当于虚拟机挂载宿主机共享文件夹,用来实现数据的持久化。

    1.2 两种方式

    1)数据卷

    将容器内数据直接挂载到宿主机上。

    2)数据卷容器

    将容器数据挂载到特定的容器上,让其在容器和主机、容器和容器之间可以共享数据。

    1.3 数据卷的特性

    • 可以在容器之间共享数据
    • 对数据卷内的数据会立刻生效
    • 删除了容器,数据卷的数据也不会消失

    二、数据卷管理

    使用run命令时可以使用--mount选项来使用数据卷,它支持三种类型的数据卷,如下

    • volume:普通数据卷,映射到宿主机/var/lib/docker/volumes路径下
    • bind:绑定数据卷,映射到主机指定路径下
    • tmpfs:临时数据卷,存在内存中

    2.1 指定路径挂载

    为了方便对比,先介绍绑定数据卷,也叫指定路径挂载

    1)在宿主机创建一个存放容器数据的目录

    mkdir /opt/data
    

    2)将宿主机的/opt/data挂载到容器的/data目录

    docker run -dit --name c1 --mount type=bind,source=/opt/data,destination=/data centos:latest /bin/bash
    :"
    这里--mount指定类型为bind,绑定数据卷,后面source接宿主机地址,destination为容器地址
    "
    
    #可简写为
    docker run -itd -v /opt/data:/data --name c1 centos:latest /bin/bash
    

    3)查看挂载

    docker inspect c1
    

    image-20210929192719878

    2.2 匿名挂载

    前面介绍了绑定数据卷,普通数据卷就很好理解了,普通数据卷会将容器路径自动挂载到宿主机/var/lib/docker/volumes路径下,不需要我们提前在宿主机创建挂载目录。

    普通数据卷的方式分为

    • 匿名数据卷

      不写挂载的数据卷名,随机生成卷名

    • 具名数据卷

      自定义数据卷名

    1)匿名挂载

    这里-v选项后不写宿主机挂载目录,只写容器目录

    docker run -d -P --name nginx01 -v /etc/nginx nginx
    

    查看挂载信息

    docker inspect nginx01
    

    image-20210929204253052

    可以看到不写数据卷名,docker会为我们随机生成一串字符作为数据卷名

    PS:这里我修改过容器存放路径,所以不是默认的路径,关于修改容器存放路径看这篇

    查看数据卷信息

    docker volume ls
    

    image-20210929200400236

    2.3 具名挂载

    这里同样不写宿主机目录,只写一个名字nginxconfig

    docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx nginx
    
    :'
    注意这里是写的nginxconfig,不是目录
    /nginxconfig才是目录
    '
    

    查看数据卷信息

    docker volume ls
    

    image-20210929201620004

    发现有一个nginxconfig容器卷名

    查看挂载信息

    docker inspect nginx02
    

    image-20210929201828204

    会发现宿主机目录是一个名为nginxconfig的数据卷。

    2.3 挂载权限

    容器挂载数据卷的默认权限是rw,可以更改为ro,让其无法更改数据卷内的文件。

    /etc/nginx:ro 这里的ro是只读,这样容器就只能对nginx的配置文件只读,但是宿主机可以修改,这样就可以不进入容器修改配置文件,方便又安全。

    docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
    

    2.4 数据卷容器

    数据卷容器是一个专门提供数据卷给其他容器挂载的容器。

    1)创建一个名为db01的容器作为数据卷容器

    docker run -itd --name db01  -v docker_data:/data  centos:latest
    :'
    这里容器卷容器挂载的是默认宿主机路径,卷名叫docker_data
    '
    

    2)创建db02容器并使用—volumes-from命令挂载数据卷容器db01

    docker run -itd --volumes-from db01 --name db02 centos:latest
    

    此时读写data目录中的文件对三个容器是实时更新的

    除此之外还可以从其他已经挂载了容器卷的容器里挂载数据卷

    docker run -d --name db03 --volumes-from db02 centos:latest
    

    使用--volumes-from参数所挂载数据卷的容器自身不需要保持在运行状态

    3)删除容器卷

    数据卷是跟容器是不搭边的,即使删除了挂载数据卷的容器如之前挂载容器db01,db02和db03,数据卷也不会被删除,他还是保存在宿主机上,下面几种删除方式

    #-v参数删除容器的同时删除数据卷
    docker rm –v db01 db02 db03
    
    #删除数据卷,删除前先查看有哪些数据卷在宿主机中
    docker volume ls
    docker volume rm data
    
    #清理无主的数据卷,腾出空间
    docker volume prune
    

    三、数据迁移

    3.1 备份数据

    备份容器内的数据到宿主机当前目录下

     docker run 
     -v $(pwd):/backup 
     --name worker centos:latest 
     tar cvf /backup/backup.tar /data
     
     #查看备份文件大小
     ls -sh
     :'
    上述命令解释如下
    1)将宿主机的当前目录挂载到worker容器的/backup目录
    2)tar命令将容器/data目录的数据打包放在/backup/目录下
    3)在宿主机当前目录下就能看见已打包的容器数据了
    '
    

    3.2 迁移数据

    docker run 
    -v $(pwd):/backup 
    --name worker02 centos:latest 
    tar xvf /backup/backup.tar
    
    :"
    挂载宿主机当前目录文件,解压从worker容器备份的文件,即完成数据迁移
    "
    

    四、命令总结

    4.1 创建数据卷

    1)创建数据卷

    创建一个名为test的本地数据卷,该数据卷默认存放路径为宿主机/var/lib/docker/volumes/test目录下

     docker volume create  -d local  test
    

    4.2 查看数据卷

    2)查看数据卷的详细信息

    docker volume inspect test
    

    image-20210930104100089

    我这里改了docker的存放路径,方便管理,默认存放路径为/var/lib/docker/volumes/test

    3)列出已有数据卷

    docker volume ls
    

    image-20210930104237161

    4.3 删除数据卷

    1)清理未在使用的数据卷

    此操作会把未在使用的数据卷删除,请谨慎使用

    docker volume prune
    

    2)删除数据卷

    删除名为ubuntu的数据卷

    docker volume rm ubuntu
    

    3)-v参数删除容器的同时删除挂载的数据卷

    docker rm –v db1 db2 data
    

    五、小实验

    5.1 mysql数据持久化实验

    使用MySQL容器,再将mysql容器的数据挂载出来,这样就能实现MySQL数据持久化。

    1)创建宿主机挂载目录

    mkdir -p /home/mysql/conf
    mkdir -p /home/mysql/data
    

    2)下载MySQL容器并启动,挂载数据卷

    docker run -d -p 3306:3306 
    -v /home/mysql/conf:/etc/mysql/conf.d 
    -v /home/mysql/data:/var/lib/mysql 
    -e MYSQL_ROOT_PASSWORD=123456 
    --name mysql mysql:5.7
    
    :'
    -p:将容器的3306端口映射到宿主机的3306端口,3306(宿主机端口):3306(容器端口)
    -v: 将mysql的配置文件挂载出来,mysql的数据挂载出来
    -e: 修改mysql的密码为123456
    '
    

    这样我们就能通过修改宿主机的配置文件,修改容器的mysql配置文件;

    MySQL数据也能存放在宿主机上。

    3)使用Navicat连接数据库

    image-20210929195734994

    查看数据库版本

    image-20210929200042103

    六、参考资料

    《Docker技术入门与实践》第三版

    狂神说docker

    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    beeframework开发笔记1
    CentOS 6.0最小化编译安装Nginx+MySQL+PHP+Zend
    (转)Android-Mac电脑如何进行APK反编译-使用apktool、jd-gui
    (转)【Android测试工具】03. ApkTool在Mac上的安装和使用(2.0版本)
    淘宝PHPSDK2.0 剔除 lotusphp框架---兄弟连教程
    (转载)postgresql navicat 客户端连接验证失败解决方法:password authentication failed for user
    (转载)CentOS6下 源代码方式安装openERP7.0
    在阿里云 centos 6.3上面安装php5.2(转)
    php自动转换pfx到pem和cer(dem格式)到pem
    WebSocket获取httpSession空指针异常的解决办法
  • 原文地址:https://www.cnblogs.com/tz90/p/12234963.html
Copyright © 2020-2023  润新知