Docker系列教程05-Docker数据卷(Data Volume)学习
引言
在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。要想实现数据的持久化,需要将数据从宿主机挂载到容器中。目前Docker提供了三种方式将数据从宿主机挂载到容器中。
Volume
普通数据卷,映射到/var/lib/docekr/volumes目录下。
bind mounts
绑定数据卷,映射到宿主机指定路径下
tmpfs mounts
临时卷,只存在于宿主机内存中
三种方式的示意图如下所示:
一、Volume的基本使用
1、创建数据卷
1、创建一个Volume
[root@qll251 ~]# docker volume create for_nginx
for_nginx
2、查看所有数据卷
[root@qll251 ~]# docker volume ls
DRIVER VOLUME NAME
local for_nginx
3、 查看指定数据卷详细信息
[root@qll251 ~]# docker volume inspect for_nginx
可以看到我们创建的
for_nginx卷,保存在宿主机/var/lib/docekr/volumes/下;以后针对该Volume的写操作都会保存在/var/lib/docekr/volumes/for_nginx/_data下。
2、挂载数据卷到容器
创建nginx容器,并挂载 for_nginx 数据卷
[root@qll251 ~]# docker run -itd -p 88:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx
c2124dd81a36e7a798b95276215a59a63d4a5f7d34ccb2bc31889494304ade56
mount参数后面跟的是键值对。source指定宿主机源文件位置。target指定数据卷在容器中的挂载位置。
使用docker inspect查看容器挂载信息:
红框标出的内容,相信您基本都能看懂,这里扩展一个小知识点:
RW: true,表示读写。如果希望数据卷对某个容器来说是只读的,可以通过添加readonly选项来实现,代码示例如下:
docker run -itd --mount source=for_nginx,target=/test,readonly nginx
3、修改nginx主页内容
[root@qll251 ~]# cd /var/lib/docker/volumes/
[root@qll251 volumes]# cd for_nginx/_data/
[root@qll251 _data]# ls
50x.html index.html
[root@qll251 _data]# echo "Hello world" > index.html
4、测试访问nginx主页
5、验证数据卷的持久化
1、强制删除nginx容器
[root@qll251 ~]# docker rm -f c2
c2
2、容器被删除,数据卷仍然存在
[root@qll251 ~]# cd /var/lib/docker/volumes/for_nginx/
[root@qll251 for_nginx]# more _data/index.html
Hello world
由此可以验证,容器卷与容器的生命周期无关,在删除容器时,docker不会自动删除卷,即使用Volume可以实现数据的持久化保存。
6、清理卷
如果不再使用本地容器卷,那么可以手动清理掉
[root@qll251 ~]# docker volume rm for_nginx
二、bind mounts 的基本使用
1、 使用卷创建容器
运行一个nginx容器,并将宿主机/webapp目录挂载至容器/usr/share/nginx/html目录:
[root@qll251 ~]# docker run -itd -p 81:80 --mount type=bind,source=/webapp,target=/usr/share/nginx/html nginx
690e779843933f735cf9044d7fd159a72ce6dcb833da61a010df58b0122b074e
上述命令等同于使用旧的-v参数,代码如下:
docker run -itd -p 81:80 -v /webapp:/usr/share/nginx/html nginx
2、验证挂载情况
3、进入容器
[root@qll251 ~]# docker exec -it 690 /bin/bash
root@690e77984393:/# cd /usr/share/nginx/html/
root@690e77984393:/usr/share/nginx/html# ls
进入该容器,会发现容器该目录本身存在的文件消失不见了。原因如下:
如果你使用
Bind mounts挂载宿主机目录到一个容器中的非空目录,那么此容器中的非空目录中的文件会被隐藏,容器访问这个目录时能够访问到的文件均来自于宿主机目录。这也是Bind mounts模式和Volumes模式最大的不同。
三、tmpfs mounts 的使用
tmpfs mountfs,顾名思义 是一种非持久化的数据存储。它仅仅将数据保存在宿主机的内存中,一旦容器停止运行,tmpfs mounts会被移除,从而造成数据丢失。
1、运行一个容器,并指定临时卷
[root@qll251 ~]# docker run -itd --mount type=tmpfs,target=/test ubuntu:18.04
fad68fbcdab580fad03db7fa1e4f40c4e694fb8a30dc292af38dc3efd556b140
[root@qll251 ~]#
2、在容器中写入数据
[root@qll251 ~]# docker exec -it fa /bin/bash
root@fad68fbcdab5:/# cd /test
root@fad68fbcdab5:/test# echo 123123 > tmp.txt
root@fad68fbcdab5:/test# cat tmp.txt
123123
3、重启容器,发现数据丢失
[root@qll251 ~]# docker restart fa
fa
[root@qll251 ~]# docker exec -it fa /bin/bash
root@fad68fbcdab5:/# cd /test
root@fad68fbcdab5:/test# cat tmp.txt
cat: tmp.txt: No such file or directory
4、tmpfs mounts的使用场景
当因为安全或其他原因,不希望将数据持久化到容器或宿主机上,那么可以使用tmpfs mounts模式。
结语
欢迎来到『开源Linux』,这里是 Linux 爱好者的聚集地。专注分享Linux/Unix相关内容(包括Linux运维、Linux系统开发、网络编程、以及虚拟化和云计算等技术干货)。风里雨里,我们在这里等您,期待与您相遇。
Docker系列教程05-Docker数据卷(Data Volume)学习的更多相关文章
- Docker 容器数据卷(Data Volume)与数据管理
卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必 ...
- Docker系列(20)- 数据卷容器
数据卷容器 什么是数据卷容器? 容器和容器之间实现数据共享 一个容器先于宿主机创建挂载方式,宿主机就会有改卷的目录 第二个容器使用命令--volumes-from 第一个容器,共享使用了第一个容器与宿 ...
- Docker系列教程05 容器常用命令
https://mp.weixin.qq.com/s?__biz=MzI4ODQ3NjE2OA==&mid=2247483890&idx=1&sn=2721f08624e6de ...
- Docker系列(19)- 数据卷之Dockerfile
初识Dockerfile Dockerfile就是用来构建docker镜像的构建文件!命令脚本! 通过这个脚本生成镜像,镜像是一层一层的,脚本与一个个的命令,每个命令都是一层! # 创建一个docke ...
- Docker之数据卷(Data Volumes)操作
目的: 前言 Docker宿主机和容器之间文件拷贝 数据卷 数据卷容器 前言 Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享, ...
- Docker数据管理-数据卷 data volumes和数据卷容器data volumes containers的使用详解
此文来源于:https://yq.aliyun.com/ziliao/43471 参考原文件之外,做了些修改. Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录 ...
- docker数据卷(Data Volumes)
Docker宿主机和容器之间文件拷贝docker copy 前言: Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享,这必然涉及 ...
- 数据卷(Data Volumes)
Docker宿主机和容器之间文件拷贝docker copy 前言: Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享,这必然涉及 ...
- docker系列四之docker镜像与容器的常用命令
docker镜像与容器的常用命令 一.概述 docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人 ...
随机推荐
- jQuery--选择器案例实战
1.案例需求 jquery最基础的选择器部分已经基本结束,来一个简单案例总结回顾下学的东西. 案例需求: 用一个按钮控制元素的显示与隐藏,页面如下,从第五个开始,不要最后一个,控制他们的显示和隐藏. ...
- Spring基于xml注入bean的几种方式?
(1)Set方法注入: (2)构造器注入:①通过index设置参数的位置:②通过type设置参数类型: (3)静态工厂注入: (4)实例工厂:
- Java中8种基本数据类型是哪些
1 public class Ceshi { 2 int a; 3 double b; 4 boolean c; 5 char d; 6 float f; 7 byte e; 8 long h; 9 ...
- RocketMQ实现分布式事务
相关文章:http://www.uml.org.cn/zjjs/201810091.asp(深入理解分布式事务,高并发下分布式事务的解决方案) 三种分布式事务: 1.基于XA协议的两阶段提交 2.消息 ...
- Jpa设置默认值约束
使用SpringDataJpa设置字段的默认值约束的2种方式 // 第一种方式是修改建表时的列定义属性 @Column(columnDefinition = "varchar(35) def ...
- Spring Framework 中有多少个模块,它们分别是什么?
Spring 核心容器 – 该层基本上是 Spring Framework 的核心.它包含以下模块: Spring Core Spring Bean SpEL (Spring Expression L ...
- 阿里低代码引擎 | LowCodeEngine - 如何配置并调用请求
首发于 语雀文档@blueju 前言 发送请求是前端中很重要也很常见的一部分,阿里低代码引擎自然也不会缺少这一块.在阿里低代码引擎中,请求是在数据源中配置,数据源位置如下图: 配置 配置界面如下图:其 ...
- Docker镜像构建之docker commit
我们可以通过公共仓库拉取镜像使用,但是,有些时候公共仓库拉取的镜像并不符合我们的需求.尽管已经从繁琐的部署工作中解放出来了,但是在实际开发时,我们可能希望镜像包含整个项目的完整环境,在其他机器上拉取打 ...
- iView 一周年了,同时发布了 2.0 正式版,但这只是开始...
两年前,我开始接触 Vue.js 框架,当时就被它的轻量.组件化和友好的 API 所吸引.之后我将 Vue.js 和 Webpack 技术栈引入我的公司(TalkingData)可视化团队,并经过一年 ...
- 让弹幕给 PPD 生个孩子
怎样才能跑起来我写的弹幕程序 资源下载 申请野狗后端云账号注册 创建应用: 复制appId到index.html的 var ref = new Wilddog("https://<ap ...