【Docker】7、数据卷详解:具名挂载、匿名挂载、初识DockerFile、数据卷容器

1、什么是容器数据卷?

docker的理念回顾

  • 应用环境打包成一个镜像!

    • 如果数据都在容器中,那么容器删除,数据就会丢失!需求:数据可以持久化。如:MySQL,容器删除了,MySQL数据可以存储在本地!
  • 容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术!目录的挂载,将容器内的目录,挂载到Linux上面!

在这里插入图片描述

卷的作用

  • 容器数据的持久化和同步操作!
  • 容器间数据共享!

2、使用数据卷

方式一 :直接使用命令挂载 -v 宿主机目录:容器内目录

-v, --volume list                    Bind mount a volume

docker run -it -v 主机目录:容器内目录  -p 主机端口:容器内端口

# 把容器内的home目录,挂载(映射)到宿主机的/home/test目录
docker run -it -v /home/test:/home centos /bin/bash

在这里插入图片描述

  • 查看挂载情况
# 该命令在宿主机环境下;容器内没有这个命令
docker inspect 容器id

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

测试

  • 容器中修改文件,宿主机下查看

在这里插入图片描述

  • 宿主机中修改文件,容器下查看

在这里插入图片描述

在这里插入图片描述

  • 删除容器,查看宿主机下文件

在这里插入图片描述

3、测试安装 MySql

目的:需要将 MySql 中的配置信息和数据文件,同步到容器外部;如果 MySql 容器被删除时,数据依然存在

  • 搜索下载 mysql
# 搜索 mysql
docker search mysql

# 下载 mysql 镜像;此处仅为测试;建议下载5.7,高版本mysql会有密码的加密规则
docker pull mysql:5.7

在这里插入图片描述

  • 启动 mysql

    • 数据挂载:-v 宿主机目录:mysql容器内文件或目录,可以有多个挂载 -v
    • 配置密码:-e MYSQL_ROOT_PASSWORD=密码
# 运行容器
# 需要做数据挂载
# 安装启动 mysql,需要配置密码
# 参考官网hub 
# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

# 启动
# -d 后台运行
# -p 端口映射
# -v 卷挂载
# -e 环境配置
# -- name 容器名字
docker run -d -p 3310: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

在这里插入图片描述

  • 查看挂载目录

在这里插入图片描述

  • 外部连接测试

    在虚拟机之外用 Navicat 连接

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 删除 MySql 容器,查看挂载点数据

在这里插入图片描述

4、具名挂载和匿名挂载

1)匿名挂载

# 匿名挂载:不推荐
# -v 只有容器内路径!不指定宿主机目录;会生成随机的宿主机挂载目录
docker run -d -P --name 容器名称 -v 容器内路径

# 查看所有的 volume 的情况
docker volume ls

在这里插入图片描述

2)具名挂载

# 具名挂载:推荐
# 指明挂载点的文件名(卷名),不是路径
docker run -d -P --name nginx02 -v nginx02:/etc/nginx nginx

在这里插入图片描述

  • 查看特定的卷
docker volume inspect 卷名

在这里插入图片描述

所有的 docker 容器内的卷,没有指定目录的情况下都是在宿主机/var/lib/docker/volumes/xxxx/_data下,如果指定了目录,docker volume ls 是查看不到的

在这里插入图片描述

3)三种挂载区分

区别挂载命令查看特定的卷卷名卷在宿主机中位置
匿名-v 只指定容器内路径docker volume inspect 卷名随机/var/lib/docker/volumes/xxxx/_data
具名
[推荐]
-v 卷名:容器内路径docker volume inspect 卷名指定/var/lib/docker/volumes/xxxx/_data
指定路径-v 宿主机指定路径:容器内路径--按指定路径

4)读写权限

在容器内路径后面加 :ro:rw

  • ro readonly 只读;容器内无法修改,只能在宿主机的挂载点操作
  • rw readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx

5、初识DockerFile

方式二:使用DockerFile生成卷挂载

  • DockerFile 就是用来构建docker镜像的构建文件!
  • 这种方式使用的十分多,因为项目开发后会构建自己的镜像!
  • 通过脚本生成镜像
# 创建一个dockerfile文件,名字可以随便 建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash
#这里的每个命令,就是镜像的一层!

在这里插入图片描述

  • 生成镜像
# -f : file缩写;指的是dockerfile文件路径,下面例子为dockerfile1文件的所在目录下
# -t : target缩写;指的是生成镜像的名称,不是路径,前面不要加 /
# .  : 生成在当前目录下
docker build -f dockerfile1 -t tuwer/centos .

在这里插入图片描述

在这里插入图片描述

  • 启动镜像
docker run -it tuwer/centos /bin/bash

在这里插入图片描述

  • 查看卷挂载

在这里插入图片描述

在这里插入图片描述

  • 同步测试

在这里插入图片描述

在这里插入图片描述

6、数据卷容器

不同容器间的挂载,可以实现数据同步

--volumes-from 被挂载容器

在这里插入图片描述

  • 启动被挂载容器
# 指定容器名称为 centos01
docker run -it --name centos01 tuwer/centos

在这里插入图片描述

  • 启动挂载容器
# 指定容器名称为 centos02
# --volumes-from centos01 挂载到容器 centos01 上
docker run -it --name centos02 --volumes-from centos01 tuwer/centos

在这里插入图片描述

  • 测试容器间数据同步
    • 在容器centos01下,进入volume01挂载目录,创建文件 test.txt
    • 在容器centos02下,进入对应的挂载目录volume01查看,发现目录内也有 test.txt,文件实现了同步

在这里插入图片描述

  • 启动第三个容器,挂载第二个容器

在这里插入图片描述

  • 容器3中创建文件,容器1和容器2中查看

在这里插入图片描述

  • 删除容器1,查看容器2和容器3

在这里插入图片描述

在这里插入图片描述

结论:

  • 容器间挂载后,数据的传递,不是简单的共享(不像windows中的快捷方式),而是复制(备份),有多少个挂载容器,就会存在多少份数据,当一个容器中的挂载数据变化后,会同步到其它容器;当删除任意一个容器后,其它容器中的数据不受影响;所以数据卷容器的生命周期一直持续到没有容器使用为止,只要有一个挂载容器存在,数据就不会丢失。
  • 如果数据挂载到外部宿主机,那么即使所有容器删除,宿主机中的对应数据也是不会删除的!
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土味儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值