Docker(五)进阶:Docker卷(volumes)
目录
- 前言
- 一、在Docker中管理数据
- 1、为什么要挂载?
- 2、选择正确的挂载方式
- 二、卷(volume)
- 1、卷的概述
- 2、卷的优点
- 3、卷的使用
- 4、实战:持久化数据
- 1)MySQL容器为什么挂载数据卷?
- 2)MySQL容器挂载数据卷
- 5、Volume命令
- 1)docker volume create
- 2)docker volume inspect
- 3)docker volume ls
- 4)docker volume prune
- 5)docker volume rm
- 6、匿名挂载和具名挂载
- 1)匿名挂载
- 2)具名挂载
- 3)如何区分挂载?
前言
学习本文需要一些了解Docker的概念以及一些名词。
个人网站:https://linzyblog.netlify.app/
一、在Docker中管理数据
1、为什么要挂载?
默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:
- 当该容器被删除时,数据也会被同样删除,如果有另一个进程需要数据,就很难从容器中取出数据。
- 容器的可写层与运行容器的宿主机紧密耦合,你无法将数据移动到其他地方。
- 写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序提供了一个联合文件系统,使用 Linux 内核。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能 。
Docker有两种方法:volumes 卷 和 bind mounts 绑定挂载 可以让容器在主机上存储文件,以便即使容器停止或删除后文件也能持久化保存。
Docker 还支持将文件存储在主机内存中的容器。此类文件不会持久保存。如果您在 Linux 上运行 Docker,则使用tmpfs 挂载将文件存储在主机的系统内存中。如果您在 Windows 上运行 Docker,命名管道用于将文件存储在主机的系统内存中。
2、选择正确的挂载方式
无论你选择那种挂载的方式,容器内的数据看起来都是一样的。数据以目录或文件系统中的单个文件的形式公开。
卷(volumes)、绑定挂载(bind mounts)和 tmpfs挂载(tmpfs mounts) 之间的差异就是数据在Docker主机上的位置不同。
- 卷(volumes):存储在由 Docker(/var/lib/docker/volumes/在 Linux 上)管理的主机文件系统的一部分中。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式。
- 绑定挂载(bind mounts):可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。
- tmpfs挂载(tmpfs mounts):仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。
二、卷(volume)
1、卷的概述
卷(volume)提供了将容器的特定文件系统路径连接回主机的能力,简单来说就是将容器的目录映射到主机上。如果容器中的目录已挂载,则该目录中的更改也会在主机上看到。如果我们在容器重启时挂载相同的目录,我们会看到相同的文件,这就是容器的持久化和同步操作。
- Docker Volume 命令能让容器从宿主机中读取文件,或从容器中持久化数据到宿主机中,让容器与容器产生的数据分离开来,一个容器可以挂载多个不同的目录。
- Volume的生命周期是独立于容器的生命周期之外的,即使容器删除了,Volume也会被保留下来,Docker不会因为这个Volume没有被容器使用而自动回收。
- 在容器中,添加或修改这个文件夹里的文件也不会影响到容器的联合文件系统。
2、卷的优点
卷是Docker容器生成和使用数据的首选保存机制。绑定挂载依赖于主机的目录结构和操作系统,但卷是完全由Docker管理。
- 卷比绑定挂载更容易备份或迁移数据。
- 卷可以直接使用Docker CLI 命令或 Docker API 管理。
- 卷可以在 Linux 和 Windows 容器上运行。
- 卷可以在多个容器之间更安全的共享。
- 卷允许将卷挂载到远程主机或云服务器上,以加密卷的内容或添加其他功能。
- 新卷的内容可以由容器预先填充。
- Docker Desktop 上的卷比 来自Mac 和 Windows 主机的绑定挂载具有更高的性能。
此外,与将数据持久化到容器的可写层相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,而且卷的内容存在于给定容器的生命周期之外
注意:如果你的容器需要生成非持久化状态数据,优先选择tmpfs 挂载以避免将数据永久存储在任何地方,并且避免写入容器的可写层来提高容器性能。
3、卷的使用
- 格式:
docker run -it -v 主机目录:容器内目录
- 测试:
- 使用卷将容器内/home目录挂载绑定到主机的E:/home/test目录下,Docker会自动在主机创建目录
- 用docker inspect 命令查看容器挂载数据,找到Mounts数据
- Type:挂载的类型,可以是bind、volume或 tmpfs。
- Source:主机内目录路径地址。
- Destination:Docker容器内目录的路径地址。
- 在容器的/home目录下进行操作
在主机目录也会同时创建一个test.go。
这是同步的过程,双方目录挂载后,双方各自的操作是双向绑定的。
- 停止Docker 容器后,修改主机目录内的文件内容,启动容器后,数据是否还是会同步到容器
是可以的,挂载目录是双向绑定的,以后只需在本地修改即可,容器内也会自动同步
4、实战:持久化数据
1)MySQL容器为什么挂载数据卷?
我们每次启动一个MySQL容器,数据库都是空的。删除容器后,数据也同样丢失,如果有其他进程也在访问这个数据库,就会取不出数据。
数据卷:设计用来持久化数据的,它的生命周期独立于容器,不会因为容器被删除后自动删除,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。
2)MySQL容器挂载数据卷
- 拉取MySQL镜像,运行容器的时候做挂载数据卷,启动MySQL容器需要配置密码
docker run -d -p 3310:3306 -v E:/home/mysql/conf:/etc/mysql/conf.d -v E:/home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysqltest mysql:5.7
可选项名称 | 说明 |
---|---|
-d | 在后台运行容器并打印容器 ID |
-p | -p xxxx:yyyy:宿主机上xxxx端口对应容器中yyyy端口,在外部访问时用的是宿主机上的端口 |
-v | 卷挂载 |
-e | 环境配置 |
–name | 容器名称 |
- 启动容器成功之后,本地用navicat连接数据库测试一下
3. 新建一个test数据库,建立test数据表,并插入几条数据。
- 删除MySQL容器,在重新运行后,测试一下数据是否还存在,数据是否是持久化的。
我们可以看到数据依旧存在,我们挂载在本地的数据并没有随着容器的删除而丢失,它的生命周期已经独立于容器,这就实现了容器数据持久化。
5、Volume命令
1)docker volume create
- 作用:创建数据卷
- 格式:
docker volume create [OPTIONS] [卷名]
- 说明
创建容器可以使用和存储数据的新卷。如果未指定名称,Docker 会生成一个随机名称。
- 可选项:
名称,简写 | 默认 | 描述 |
---|---|---|
–driver,-d | local | 指定卷驱动程序名称 |
–label | 为卷设置元数据 | |
–name | 指定卷名 | |
–opt,-o | 设置驱动程序特定选项 |
- 例子:
2)docker volume inspect
- 作用:显示一个或多个卷的详细信息
- 格式:
docker volume inspect [OPTIONS] 卷名 [卷名...]
- 说明:
返回有关卷的信息。默认情况下,此命令将所有结果呈现在 JSON 数组中。您可以指定替代格式来为每个结果执行给定的模板。Go 的 text/template包描述了该格式的所有细节。
- 可选项:
名称,简写 | 默认 | 描述 |
---|---|---|
–format,-f | 使用给定的 Go 模板格式化输出 |
- 例子:
- 当你创建一个Volume,Docker都会默认在宿主机的/var/lib/docker/volumes目录下自动创建一个子目录,默认情况下都是目录名都是一串UUID。
- 如果指定了名称,则目录名是Volume名称。Volume里的数据都存储在这个子目录的_data目录下。
3)docker volume ls
- 作用:查看本地数据卷列表
- 格式:
docker volume ls [OPTIONS]
- 说明:
列出 Docker 已知的所有卷。可以使用 -f or --filter标志进行过滤。
- 可选项:
名称,简写 | 默认 | 描述 |
---|---|---|
–filter,-f | 提供过滤器值(例如 ‘dangling=true’) | |
–format | 使用 Go 模板格式化打印卷 | |
–quiet,-q | 只显示卷名 |
- 例子:
4)docker volume prune
- 作用:删除所有未使用的本地卷
- 格式:
docker volume prune [OPTIONS]
- 说明:
删除所有未使用的本地卷。未使用的本地卷是那些未被任何容器引用的本地卷
- 可选项:
名称,简写 | 默认 | 描述 |
---|---|---|
–filter | 提供过滤器值(例如 ‘label=’) | |
–force,-f | 不提示确认 |
- 例子:
5)docker volume rm
- 作用:删除一个或多个卷
- 格式:
docker volume rm [OPTIONS] 卷名[卷名...]
- 说明:
删除一个或多个卷。您不能删除容器正在使用的卷。
- 可选项:
名称,简写 | 默认 | 描述 |
---|---|---|
–force,-f | 强制删除一个或多个卷 |
- 例子:
6、匿名挂载和具名挂载
1)匿名挂载
没有给数据卷名字的挂载。
除了最后一条由具体名字的挂载,其他都是匿名挂载的
格式:
docker run -d -P -v 容器内路径 镜像名:tag1
2)具名挂载
给数据卷指定名字的挂载。
最后一条是具名挂载的数据卷
格式:
docker run -d -P --name 容器名称 -v 卷名称:容器内路径 镜像名:tag
3)如何区分挂载?
如何区分匿名挂载、具名挂载还是指定路径挂载呢?
- 匿名挂载:-v 容器内路径
- 具名挂载 :-v 卷名:容器内路径
- 指定路径挂载:-v /宿主机路径:容器内路径
Docker(五)进阶:Docker卷(volumes)相关推荐
- Docker容器的数据卷(volumes)
目录 1.容器数据卷技术解决什么问题 docker可将应用和环境打包成一个镜像.容器是镜像的实例化. 我们的数据如果都在容器中,一旦容器删除,数据就会丢失. 数据卷技术可将容器产生的数据同步到本地,容 ...
- Docker(五):Docker 三剑客之 Docker Machine
上篇文章Docker(四):Docker 三剑客之 Docker Compose 介绍了 Docker Compose,这篇文章我们来了解 Docker Machine . Docker Machin ...
- Docker(五):Docker Volume
一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即***数据不随着Container的结束而结束***),需要将数据从宿主机挂载到容器中.目前Do ...
- Docker数据卷—Volumes
一.引入Docker数据卷的必然性 为了实现容器与主机之间.容器与容器之间共享文件,容器中数据的持久化,将容器中的数据备份.迁移.恢复等,Docker加入了数据卷(volumes)机制.简单的讲,就是 ...
- 【狂神说】Docker【进阶篇】
[狂神说Java]Docker进阶篇超详细版教程通俗易懂_哔哩哔哩_bilibili 官网:https://www.docker.com/ 文档地址: https://docs.docker.com/ ...
- Docker学习五:Docker 数据管理
前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...
- Docker 安装 命令 数据卷 应用部署 网络优化 Dockerfile 服务编排Compose 私有仓库
Docker 1. 初识docker 1.1 Docker是什么 了解Docker的前生LXC LXC与docker的关系 Docker 的特点 1.2 为什么使用Docker Docker的优势 缺 ...
- Docker 学习笔记 - 进阶四 Docker网络和 Docker compose
Docker 学习笔记 - 进阶四 Docker网络和 Docker compose 4. docker 网络 4.1 docker network是什么 4.1.1 docker不启动,默认网络情况 ...
- Docker基础讲解狂神笔记:容器数据卷,docker compose,docker swarm(2/2)未修订版欢迎留言补漏
L06 容器数据卷 相对于01-05难度加大 什么是容器数据卷 Docker理念:将应用和环境打包成一个镜像! 程序要保存数据,数据并不能放在容器里面,因为一旦数据放在容器,误操作删除掉容器,数据也随 ...
最新文章
- hdu 4751(dfs染色)
- Fiddler抓包使用教程-断点调试
- python函数内部变量能改变外部吗_python中,如何利用函数修改外部变量,注意我的要求...
- Ubuntu 设置程序开机启动(以指定用户身份)
- 一比特控制所有:通过一比特绕过Windows 10保护
- 【Python 必会技巧】使用 join() 方法将序列中的元素拼接成字符串
- 多任务学习模型之ESMM介绍与实现
- IOS ActivityIndicator 活动指示器使用
- C言语教程第四章: 数组(4)
- MySQL备份还原知识要点
- 机器学习十大经典算法-KMeans
- 计算机上已安装某个第三方应用程序,防止电脑第三方软件“被”安装 3招彻底屏蔽不明软件...
- gogo系统更新无服务器,gogo云服务器
- vue 数组元素替换_解决vue数组中对象属性变化页面不渲染问题
- python模拟登录163邮箱_selenium+python 模拟登陆网易邮箱
- 有哪些不错的家装风格?极家整装怎么样
- 西门子1200PLC程序远程上下载,远程在线调试原来是使用了巨控GRM530远程模块
- qq linux for android,腾讯QQ for android 糊弄还是敷衍?
- charles入门使用
- sqlserver 中使用sqlcmd 执行*.sql文件
热门文章
- Android给Activity取消title标题
- 移动APP测试用例设计实践经验(转载)
- 如何做一个基于python校园运动场地预约系统毕业设计毕设作品(Django框架)
- mysql导入excel表_mysql怎么导入excel数据?
- pdcp层的作用_【LTE基础知识】PDCP子层协议概述
- 全球回报最好的 40 个 VC 投资案例,我们可以从中学到什么?
- JS 手机号/身份证/银行账号/邮箱/QQ/电话 掩码处理
- Analog circuit----电路耦合、有源/无源滤波电路
- 关于LCD1602液显的使用细则
- 2016年头条校招笔试题