本篇已加入《.NET Core on K8S学习实践系列文章索引》(微信上暂无法访问,可以通过cnblogs博客园访问),可以点击查看更多容器化技术相关系列文章。本篇预计阅读时间为5分钟

01

Docker数据挂载到容器

在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:

(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式

    由上图可以知道,目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

  (2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式

  但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

  (3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式

  三种方式的示意图如下所示:

  

02

Volume的基本使用

2.1 管理卷

# docker volume create edc-nginx-vol // 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息

  例如,这里我们创建一个自定义的容器卷,名为"edc-nginx-vol":

  

2.2 创建使用指定卷的容器

  有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:

# docker run -d -it --name=edc-nginx -p 8800:80 \
# -v edc-nginx-vol:/usr/share/nginx/html nginx

  其中,-v代表挂载数据卷,这里使用自定数据卷edc-nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

  如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

  创建好容器之后,我们可以进入容器里面看看:

  

  可以看到有两个默认页,这时我们新启动一个SSH连接到宿主机去到刚刚创建的数据卷里边看看:

  

  可以看到,我们可以访问到容器里面的两个默认页面,由此可知,volume帮我们做的类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。

  这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉。

  

  由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是复用当前数据卷里面的文件。

  此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。

2.3 清理卷

  如果不再使用自定义数据卷了,那么可以手动清理掉:

# docker stop edc-nginx // 暂停容器实例
# docker rm edc-nginx // 移除容器实例
# docker volume rm edc-nginx-vol // 删除自定义数据卷

03

Bind Mounts的基本使用

3.1 使用卷创建一个容器

# docker run -d -it --name=edc-nginx \
# -v /app/wwwroot:/usr/share/nginx/html nginx

  这里指定了将宿主机上的 /app/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

  这时我们再次进入容器内部看看: 

  可以看到,与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。

  但是,我们可以将宿主机上的文件随时挂载到容器中:

  Step1.新建一个index.html

  

  Step2.在容器中查看

  

3.2 验证绑定

# docker inspect edc-nginx

  通过上述命令可以看到一大波配置,我们要关注的是:

  

3.3 清理

# docker stop edc-nginx
# docker rm edc-nginx

  同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。

3.4 应用案例

  在服务治理组件中,服务发现组件是一个最常用的组件之一,Consul是一个流行的服务发现开源项目,Consul推荐我们使用配置文件的方式注册服务信息。因此,我们常常会将填写好服务注册配置文件放在宿主机的一个文件目录下将其挂载到Consul的容器指定目录下,如下所示:

docker run -d -p 8500:8500 --restart=always \
-v /XiLife/consul/data/server1:/consul/data -v /XiLife/consul/conf/server1:/consul/config \
-e CONSUL_BIND_INTERFACE='eth0' --privileged=true \
--name=consul_server_1 consul:1.4.4 agent -server -bootstrap-expect=3 -ui -node=consul_server_1 -client='0.0.0.0' \
-data-dir /consul/data -config-dir /consul/config -datacenter=xdp_dc;

  可以看到,我们通过Bind Mounts的方式将宿主机上的/XiLife/consul/data/server1目录挂载到了容器的/consul/data目录下,还将/XiLife/consul/conf/server1目录挂载到了容器的/consul/config目录下,而容器下的两个目录/consul/data和/consul/config则是我们指定的存放agent数据和配置文件的地方。因此,宿主机上的配置文件的变化会及时反映到容器中,比如我们在宿主机上的目录下更新了配置文件,那么只需要reload一下Consul的容器实例即可:

# docker exec consul-server consul reload

  *.这里的consul-server是容器的名字,consul reload是重新加载的命令(非restart)。

04

小结

本文探索了Docker的数据卷及挂载数据到容器的两种主要方式Volumes和Bind Mounts,并介绍基本的使用方式和步骤,通过数据卷我们可以实现Docker的数据持久化,在实际应用中比较广泛。

参考资料:

(1)李振良,《Docker Volume详解》

(2)CloudMan,《每天5分钟玩转Docker容器技术》

(3)阿龙,《Docker存储卷详解》

传送门:

我在2019年最主要的博文《.NET Core on K8S学习实践系列文章索引》=>https://www.cnblogs.com/edisonchou/p/aspnet_core_k8s_artcles_index.html


点个在看少个bug ?

你必须知道的Docker数据卷相关推荐

  1. 你必须知道的Docker镜像仓库的搭建

    近期工作中发现用到的容器镜像越来越多(不多的时候没考虑过镜像仓库的问题),同一个容器镜像也存在多个版本,那么镜像仓库的搭建需求就涌现出来,本文就目前的几个常用镜像仓库的搭建进行介绍,我们可以根据需要选 ...

  2. 数据科学中必须知道的5个关于奇异值分解(SVD)的应用

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习算法那些事 前言:本文为大家介绍了5个关于奇异值 ...

  3. 精确的数据访问冲突_每个程序员都必须知道的8种通用数据结构

    快速介绍8种常用数据结构 数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作. 数据结构在计算机科学和软件工程领域具有广泛而多样的用途. 几乎所有已开发的程序或软件系 ...

  4. 数据人必须知道的SQL概念(A-Z)

    作为数据从业者,大家用的最多的应该就是SQL语言了,那么除了日常的select,你还了解哪些SQL相关的概念呢?今天就按照字母表的顺序(A-Z)来给大家简单介绍一下数据人必须知道的SQL概念大全. A ...

  5. 程序员们都必须知道的8种通用数据结构

    数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作. 数据结构在计算机科学和软件工程领域具有广泛而多样的用途. 几乎所有已开发的程序或软件系统都使用数据结构. 此外, ...

  6. [你必须知道的.NET]第二十一回:认识全面的null

    <你必须知道的.NET>网站 | Anytao技术博客  [你必须知道的.NET]第二十一回:认识全面的null 发布日期:2008.7.31 作者:Anytao © 2008 Anyta ...

  7. 《你必须知道的.NET》,蓄势待发;博客园开发者征途,又添新作

    博客园CLR基础研究团队|Anytao技术博客|<你必须知道的.NET>网站 <你必须知道的.NET>,蓄势待发:博客园开发者征途,又添新作 发布日期:2008.3.5 作者: ...

  8. 每个程序员都必须知道的8种数据结构

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://suo.im/6oo92L 快速 ...

  9. python语言必背代码-Python新手必须知道的25条知识点

    原标题:Python新手必须知道的25条知识点 1.到底什么是Python?你可以在回答中与其他技术进行对比 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,P ...

最新文章

  1. .vue文件中style标签的几个标识符
  2. null导入失败_当null检查非常失败时
  3. idea 新建的java项目没发run_IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程...
  4. 7647 余数相同问题
  5. R语言线性回归预测网页流量
  6. 专注NLP、推荐等AI算法招聘群,慢者无,包括几乎所有公司最新信息
  7. EF There is already an open DataReader associated with this Command
  8. java 解析m3u8的实例_ck播放器m3u8直连代码
  9. iOS高阶程序员必修——汇编
  10. 【数学建模】数据包络分析法
  11. oracle卸载和服务问题
  12. 广东四大姓氏,排名第三的是李姓,你的姓氏排名第几?
  13. Cadence之ORCAD:导出Bom清单
  14. 如何用Python抓网页,案例教程都总结到位了
  15. Codeforces Round #717 (Div. 2) 1516 A. Tit for Tat(模拟)
  16. mockjs的使用方法
  17. AUTOCAD——圆环
  18. 用水泥混凝土摊铺机进行作业时该做到的日常养护工作
  19. grbl源码解析——速度前瞻(1)
  20. 刷脸支付广泛应用于无人领域

热门文章

  1. 百度新闻 谷歌新闻_每日新闻摘要:到目前为止,Google I / O提供的最佳信息
  2. 网站运行java_定制化Azure站点Java运行环境(5)
  3. Asia Yokohama Regional Contest 2018 G题 What Goes Up Must Come Down(树状数组求逆序对)
  4. Java之品优购课程讲义_day20(5)
  5. L2-020. 功夫传人
  6. 【转】为什么自动车完全不可以犯错误
  7. 电热水器和插座之间的相亲故事
  8. 第二十五章补充内容 5 不能为0的变量
  9. MYSQL 表的修复(不断更新)
  10. Hey, everybody!