• Docker核心:深入理解Docker容器数据卷


    在这里插入图片描述

    容器数据卷介绍

    Docker容器运行时产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。例如:容器中部署了MYSQL数据库,如果有一天将部署MySQL数据库的容器删除了,存放的数据也就丢失。为了能保存数据在Docker中我们使用卷来实现容器内数据与我们指定的目录文件同步,当某一方数据发生修改时,另一方也随之改变。

    因此,容器的持久化和同步操作!容器间数据也是可以共享的!

    使用数据卷

    方式一:使用命令进行挂载数据 -v

    docker run -it -v 主机目录:容器内目录
    
    • 1

    测试一下:
    将主机/home/ceshi与容器中的/home目录进行绑定

    在这里插入图片描述

    查看当前容器的详细信息:docker inspect 容器ID

    在这里插入图片描述

    ① 在容器内创建了一个test.java文件,自动同步到了主机内:

    在这里插入图片描述

    ② 在主机内创建了一个haha.java然后自动同步到容器内:

    在这里插入图片描述

    ③ 退出容器,此时容器停止运行

    在这里插入图片描述

    修改主机上的test.java文件,添加如下内容

    在这里插入图片描述

    重新启动容器

    在这里插入图片描述

    查看容器中的test.java文件,发现数据依然同步成功!

    在这里插入图片描述

    这时就实现了主机与容器数据的同步和共享!!

    MySQL 数据同步

    ① 拉取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 mysql01 mysql:5.7
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    ③ 启动成功,使用数据库连接工具进行连接

    在这里插入图片描述

    连接成功

    在这里插入图片描述

    ④ 查看本地主机,数据挂载成功

    在这里插入图片描述
    ⑤ 使用数据库连接工具创建数据库

    在这里插入图片描述

    主机数据同步成功

    在这里插入图片描述

    ⑥ 测试删除容器,数据是否存在

    在这里插入图片描述

    数据依旧存在:

    在这里插入图片描述
    MySQL数据本地持久化测试成功!!

    具名挂载和匿名挂载

    匿名挂载

    -v 容器内路径 (不指定主机名,只指定容器内路径)

    docker run -d -P --name nginxtest -v /etc/nginx nginx
    
    • 1

    在这里插入图片描述

    查看所有 volume 信息

    docker volume ls
    
    • 1

    在这里插入图片描述

    在之前只指定容器内路径,没有写容器外路径,这就是匿名数据卷,类似于上图的格式。

    具名挂载

    -v 卷名:容器内路径

    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
    
    
    • 1
    • 2

    在这里插入图片描述

    查看数据卷具体的位置

    docker volume inspect 名称
    
    • 1

    在这里插入图片描述
    Docker中所有的数据卷,如果没有指定目录的情况下,都在/var/lib/docker/volumes/ 目录下。

    如何确定是具名挂载匿名挂载指定路径挂载

    -v 容器内路径 匿名挂载
    -v 卷名:容器内路径 具名挂载
    -v /主机路径:容器内路径 指定路径挂载

    拓展

    通过 -v 容器内路径:ro ( rw ) 改变读写权限
    ro readonly 只读
    rw readwrite 可读可写
    一旦设置容器权限,容器对挂载出的内容就有限定

    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
    docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
    
    • 1
    • 2

    初始Dockerfile

    方式二:Dockerfile挂载数据卷

    Dockerfile就是用来构建docke镜像的构建文件,是一段命令脚本,通过脚本可以生成镜像,镜像是一层一层的,脚本是一行一行的命令,每个命令都是一层!!

    ① 编写dockerfile脚本 (指令都是大写)

    FROM centos
    
    VOLUME ["volume1","volume2"]
    
    CMD echo "-----end-----"
    
    CMD /bin/bash
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ② 构建镜像

    docker build -f dockerfile全路径 -t 镜像名称 .
    
    • 1

    在这里插入图片描述
    构建成功,生成镜像

    在这里插入图片描述

    ③ 启动容器

    docker run -it 8eb8e022a7af /bin/bash
    
    
    • 1
    • 2

    在这里插入图片描述

    生成的数据卷与外部一定有一个同步的目录。

    在容器中创建一个文件`container.txt

    在这里插入图片描述

    在这里插入图片描述

    查看数据卷挂载的路径:

    在这里插入图片描述

    查看在容器中创建的 文件是否同步到主机

    在这里插入图片描述
    发现数据同步成功!!

    数据卷容器

    容器和容器之间的数据进行同步!

    在这里插入图片描述

    ① 启动3个容器
    启动docker01

    在这里插入图片描述
    启动docker02

    在这里插入图片描述
    ② 在docker01中volume1目录下创建docker01文件

    在这里插入图片描述
    ③ 查看docker02中volume1目录下是否存在docker01文件

    在这里插入图片描述
    docker01中的数据挂载到了docker02上,实现数据同步,docker01叫做数据卷容器!

    ④ 启动docker03容器挂载docker01

    在这里插入图片描述
    ⑤ 在docker03中创建数据,在docker01中查看也是存在的。

    在这里插入图片描述在这里插入图片描述
    ⑥ 删除docker01容器,数据依旧可以访问!

    ⑦ 多个mysql实现数据共享

     docker run -d -p 3306:3306  -v /etc/mysql/conf.d
     -v /var/lib/mysql 
     -e MYSQL_ROOT_PASSWORD=123456 
       --name mysql01 mysql:5.7
    
     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 mysql02 --volumes-from mysql01 mysql:5.7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    最后总结

    • 容器数据卷的本质就是实现数据的持久化、数据的共享!
    • 三种实现方式:1.手动-v 命令。2.使用Dockerfile构建镜像,自动挂载数据。3.使用--volumes-from实现容器之间的数据共享,数据同步
    • 容器之间配置信息的传递,数据卷容器的生命后期一直持续到没有容器为止!

    在这里插入图片描述

  • 相关阅读:
    【转存】异或运算的妙用
    freeswitch的3XX重定向
    multisim仿真电路图红绿灯
    jwt判断解析失败还是令牌过期
    算法分析与设计CH11:关于分治的其他算法——矩阵乘法的分治、最大子数组和的分治求解
    在deepin上使用Fleet开发SpringBoot 3.0.0项目
    Linux磁盘挂载脚本
    Transmit v5.10.3(FTP客户端)
    2022.07 排列组合
    抖音矩阵系统,抖音矩阵系统源码定制 tell me
  • 原文地址:https://blog.csdn.net/Zp_insist/article/details/127716728