(1)Docker 安装及基本用法

(2)Docker 镜像

(3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境

(4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源

(5)Docker 网络

(6)若干企业生产环境中的容器网络方案

(7)Docker 存储 - AUFS

(8)Docker 存储 - Volume

1. Docker volume 的几种形态

有状态容器都有数据持久化需求。前一篇文章中提到过,Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的容器层。在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储。Docker volume 有如下几种形态。

1.1 无 - 不使用 Docker volume

默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。

1.2 Data volume (数据卷)

一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。有如下几种方式来使用 data volume:

(1)使用 “-v 容器内目录” 形式

  1. docker run -d -P --name web -v /webapp training/webapp python app.py

使用 docker inspect 命令可以看出,Docker 将本地一个 _data 目录 mount 为容器内的 webapp 目录了:

  1. "Mounts": [
  2. {
  3. "Name": "f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b",
  4. "Source": "/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data",
  5. "Destination": "/webapp",
  6. "Driver": "local",
  7. "Mode": "",
  8. "RW": true,
  9. "Propagation": ""
  10. }
  11. ],

其实,在 web 容器被删除后,/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data 目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。

(2)使用 -v 来挂载一个主机上的目录到容器的目录

  1. docker run -d -P --name web2 -v /src/webapp:/webapp training/webapp python app.py

主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。

其实这种形式和第一种没有本质的区别,容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标。

(3)使用 -v 来挂载主机上的一个文件到容器内的一个文件

  1. docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash

1.3 使用 data container

如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。比如:

创建一个 data container:

  1. docker create -v /dbdata --name dbstore training/webapp  /bin/true

启动一个 app container:

  1. docker run -d -P --name web3 --volumes-from dbstore training/webapp python app.py

其实,对 web3 这个容器来说,volume 的本质没变,它只是将 dbstore 容器的 /dbdata 目录映射的主机上的目录映射到自身的 /dbdata 目录。

  1. "Mounts": [
  2. {
  3. "Name": "5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330",
  4. "Source": "/var/lib/docker/volumes/5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330/_data",
  5. "Destination": "/dbdata",
  6. "Driver": "local",
  7. "Mode": "",
  8. "RW": true,
  9. "Propagation": ""
  10. }
  11. ],

但是,其好处是,可以不管其目录的临时性而不断地重复使用它。

1.4 使用 docker volume 命令

Docker 新版本中引入了 docker volume 命令来管理 Docker volume。

(1)使用默认的 ‘local’ driver 创建一个 volume

  1. root@docker1:/home/sammy# docker volume create --name vol1
  2. vol1
  3. root@docker1:/home/sammy# docker volume inspect vol1
  4. [
  5. {
  6. "Name": "vol1",
  7. "Driver": "local",
  8. "Mountpoint": "/var/lib/docker/volumes/vol1/_data",
  9. "Labels": {},
  10. "Scope": "local"
  11. }
  12. ]

(2)使用这个 volume

  1. docker run -d -P --name web4 -v vol1:/volume training/webapp python app.p

结果还是一样的,即将 vol1 对应的主机上的目录挂载给容器内的 /volume 目录。

  1. "Mounts": [
  2. {
  3. "Name": "vol1",
  4. "Source": "/var/lib/docker/volumes/vol1/_data",
  5. "Destination": "/volume",
  6. "Driver": "local",
  7. "Mode": "z",
  8. "RW": true,
  9. "Propagation": "rprivate"
  10. }
  11. ],

1.5 Volume 删除和孤单 volume 清理

1.5.1 在删除容器时删除 volume

可以使用 docker rm -v 命令在删除容器时删除该容器的卷。

  1. root@docker1:/home/sammy# docker run -d -P --name web5 -v /webapp training/webapp python app.py
  2. 69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
  3. root@docker1:/home/sammy# docker volume ls
  4. DRIVER VOLUME NAME
  5. local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
  6. local 838f4dd99721a9445be22a6b42d35e04cb43ad145ecf26107a9025f428587f76
  7. local vol1
  8. root@docker1:/home/sammy# docker rm -vf web5
  9. web5
  10. root@docker1:/home/sammy# docker volume ls
  11. DRIVER VOLUME NAME
  12. local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
  13. local vol1

1.5.2 批量删除孤单 volumes

从上面的介绍可以看出,使用 docker run -v 启动的容器被删除以后,在主机上会遗留下来孤单的卷。可以使用下面的简单方法来做清理:

  1. root@docker1:/home/sammy# docker volume ls -qf dangling=true
  2. 244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236
  3. c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46
  4. f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b
  5. root@docker1:/home/sammy# docker volume rm $(docker volume ls -qf dangling=true)
  6. 244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236
  7. c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46
  8. f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b
  9. root@docker1:/home/sammy# docker volume ls
  10. DRIVER VOLUME NAME
  11. local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
  12. local vol1

github 上有很多脚本可以自动化地清理孤单卷,比如:

1.6 小结

对以上内容的两点小结:

  • 容器内的数据是临时性的,它会随着容器生命周期的结束而消失
  • 默认的 Docker volume (driver = ‘loclal’)不管是哪种形式,本质上都是将容器所在的主机上的一个目录 mount 到容器内的一个目录,因此,它不具备可移植性。

2. Flocker:容器的分布式存储平台

第一部分提到过,原生的 Docker volume 不具备可移植性。于是,出现了Docker 的分布式卷解决方案 Flocker。先来看看 Flocker volume 和 Docker 原生 volume 的对比:

启动一个使用 Flocker 卷的容器:

  1. docker run --volume-driver flocker -v flocker-volume:/container/dir --name=container-xyz

它带来的好处包括:

  • 容器的数据会被写入 Flocker 后端存储而不是主机上,因此,在主机出现故障时可以保证数据不丢失
  • 在容器迁移时,Flocker 会自动地将卷从一个 host 移植到另一个 host

Flocker 的结构:

理解Docker(8):Docker 存储之卷(Volume)的更多相关文章

  1. Docker 存储之卷(Volume)

      理解Docker(8):Docker 存储之卷(Volume) (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespa ...

  2. Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken

    前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...

  3. docker——数据卷volume:文件共享

    volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享? 数据卷volume功能特性 数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和 ...

  4. Docker 基础知识 - 使用卷(volume)管理应用程序数据

    卷(volumes)是 Docker 容器生产和使用持久化数据的首选机制.绑定挂载(bind mounts)依赖于主机的目录结构,卷(volumes)完全由 Docker 管理.卷与绑定挂载相比有几个 ...

  5. Docker数据卷Volume实现文件共享、数据迁移备份(三)

    数据卷volume功能特性 数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定.数据卷 是被设计用来持久化数据的对于数据卷你可以理解为NFS中的 ...

  6. docker学习5--docker数据卷(volume)

    https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...

  7. Docker之数据卷Volume(七)

    一.简介   Docker数据卷(volume)机制.volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 1)v ...

  8. docker数据卷(volume)

    1.什么是数据卷volume https://blog.csdn.net/dream_broken/article/details/52314993 为了了解什么是Docker Volume,首先我们 ...

  9. Centos7——docker持久化存储和卷间状态共享(笔记)

    docker持久化存储和卷间状态共享(笔记)  本章介绍 存储卷的介绍 存储卷的两种类型 宿主机好额容器之间如何共享数据 容器之间如何共享数据 存储卷的声明周期 存储卷之间的数据管理和控制模式 就像在 ...

  10. Docker系列教程05-Docker数据卷(Data Volume)学习

    引言 在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失.要想实现数据的持久化,需要将数据从宿主机挂载到容器中.目前Docker提供了三种方式将数据从宿主机挂载到 ...

随机推荐

  1. 解析大型.NET ERP系统 十三种界面设计模式

    成熟的ERP系统的界面应该都是从模板中拷贝出来的,各类功能的界面有规律可遵循.软件界面设计模式化或是艺术性的创作,我认可前者,模式化的界面客户容易举一反三,降低学习门槛.除了一些小部分的功能界面设计特 ...

  2. HTML5移动开发学习笔记之Canvas基础

    1.第一个Canvas程序 看的是HTML5移动开发即学即用这本书,首先学习Canvas基础,废话不多说,直接看第一个例子. 效果图为: 代码如下: <!DOCTYPE html> < ...

  3. MSSQLSERVER执行计划详解

    序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博 ...

  4. 【.net深呼吸】动态类型(娱乐篇)

    有朋友跟老周说,动态类型是干吗的,他不太熟悉,希望老周可以讲一讲.没事,这事情老周也比较TMD乐意做的,因为老周写的这些烂文本来就是为了普及基础知识的,坚定不移地为社会基础教育而服务. 首先,咱们要知 ...

  5. JavaScript权威设计--事件冒泡,捕获,事件句柄,事件源,事件对象(简要学习笔记十八)

    1.事件冒泡与事件捕获 2.事件与事件句柄   3.事件委托:利用事件的冒泡技术.子元素的事件最终会冒泡到父元素直到跟节点.事件监听会分析从子元素冒泡上来的事件. 事件委托的好处:     1.每个函 ...

  6. React.js入门必须知道的那些事

    首先,React.js是facebook在2013年5月开源的一个前端框架,React不是一个MVC框架,它是构建易于可重复调用的web组件,侧重于UI, 也就是view层, React为了更高超的性 ...

  7. asp.net分页控件

    一.说明 AspNetPager.dll这个分页控件主要用于asp.net webform网站,现将整理代码如下 二.代码 1.首先在测试页面Default.aspx页面添加引用 <%@ Reg ...

  8. macOS 升级到了10.12.1

    除了明面上的一些更新,但我感觉最重要的是触摸板的行为特征又还原了.

  9. 20个非常有用的Java程序片段

    下面是20个非常有用的Java程序片段,希望能对你有用. 1. 字符串有整型的相互转换 String a = String.valueOf(2); //integer to numeric strin ...

  10. AOP的实现原理

    1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字节码或字节码加载后动态创建代理类的字节码,以下是各种实现机制的比较. 类别 ...