理解Docker(8):Docker 存储之卷(Volume)

(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 容器内目录” 形式

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

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

"Mounts": [
            {
                "Name": "f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b",
                "Source": "/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data",
                "Destination": "/webapp",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

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

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

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

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

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

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

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

1.3 使用 data container

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

创建一个 data container:

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

启动一个 app container:

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

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

"Mounts": [
            {
                "Name": "5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330",
                "Source": "/var/lib/docker/volumes/5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330/_data",
                "Destination": "/dbdata",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

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

1.4 使用 docker volume 命令

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

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

[email protected]:/home/sammy# docker volume create --name vol1
vol1
[email protected]:/home/sammy# docker volume inspect vol1
[
    {
        "Name": "vol1",
        "Driver": "local",
        "Mountpoint": "/var/lib/docker/volumes/vol1/_data",
        "Labels": {},
        "Scope": "local"
    }
]

(2)使用这个 volume

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

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

"Mounts": [
            {
                "Name": "vol1",
                "Source": "/var/lib/docker/volumes/vol1/_data",
                "Destination": "/volume",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

1.5 Volume 删除和孤单 volume 清理

1.5.1 在删除容器时删除 volume

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

[email protected]:/home/sammy# docker run -d -P --name web5 -v /webapp training/webapp python app.py
69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
[email protected]:/home/sammy# docker volume ls
DRIVER              VOLUME NAME
local               5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local               838f4dd99721a9445be22a6b42d35e04cb43ad145ecf26107a9025f428587f76
local               vol1
[email protected]:/home/sammy# docker rm -vf web5
web5
[email protected]:/home/sammy# docker volume ls
DRIVER              VOLUME NAME
local               5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local               vol1

1.5.2 批量删除孤单 volumes

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

[email protected]:/home/sammy# docker volume ls -qf dangling=true
244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236
c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46
f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b
[email protected]:/home/sammy# docker volume rm $(docker volume ls -qf dangling=true)
244a23f3ab11f17345a68e77f96bb46a8dbaf445760dd86ab0faa07dfbd84236
c864cfac232e8728b1805abc8c363d324124b38e6297544a8cbbf61d883c7e46
f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b
[email protected]:/home/sammy# docker volume ls
DRIVER              VOLUME NAME
local               5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local               vol1

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

1.6 小结

对以上内容的两点小结:

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

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

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

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

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

它带来的好处包括:

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

Flocker 的结构:

时间: 2024-10-10 17:22:31

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

Docker之数据卷Volume(七)

一.简介 Docker数据卷(volume)机制.volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利. 1)volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件 2)volume能在不同的容器之间共享和重用 3)对volume中数据的操作会马上生效 4)对volume中数据的操作不会影响到镜像本身 5)volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器

关于Docker默认存储位置及Docker系统默认池存储、卷存储限制空间修改

一.Docker默认存储位置 Docker默认存储位置在/var/lib/docker,通过命令 docker info | grep "Docker Root Dir"进行查看.有时候因为磁盘空间的问题,我们需要对其进行修改,下面有几种方法来解决docker默认存储位置的问题: 直接将数据盘挂载到/var/lib/docker目录上: 基于软连接的方式进行修改:数据盘挂载在/data目录下面,我们这样操作 mv /var/lib/docker /data/dockerln &

docker深入1-docker的数据卷

参考: http://docs.docker.com/userguide/dockervolumes/ 针对数据的存储,有个data volume的概念. 使用参数: -v 在container中创建一个volume,或者类似目录映射的方式,挂载一个数据盘或者目录到docker的container中. 环境准备: [[email protected] ~]# yum install docker-io -y [[email protected] ~]# docker -v Docker vers

Kubernetes核心概念之Volume存储数据卷详解

在Docker中就有数据卷的概念,当容器删除时,数据也一起会被删除,想要持久化使用数据,需要把主机上的目录挂载到Docker中去,在K8S中,数据卷是通过Pod实现持久化的,如果Pod删除,数据卷也会一起删除,k8s的数据卷是docker数据卷的扩展,K8S适配各种存储系统,包括本地存储EmptyDir,HostPath,网络存储NFS,GlusterFS,PV/PVC等,下面就详细介绍下K8S的存储如何实现. 一.本地存储 1,EmptyDir ①编辑EmptyDir配置文件 vim empt

Docker:网络及数据卷设置 [四]

一.Docker网络设置 默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射 提示:生产场景一般不使用随机映射,但是随机映射的好处就是由docker分配,端口不会冲突 案例1:使用docker启动nginx随机映射配置 [[email protected] ~]# docker run -d -P nginx 63cbe30165c8fb2ce7789a8173db6f2060705028ce6c326d1f0cd467bd

docker 12 docker容器数据卷

数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ♣还有一种情况,就是希望容器之间能共享数据,这时也需要容器数据卷. ♣一句话,数据卷就是用来解决数据持久化和数据共享的. ♣卷就是目录或者文件,存在一个或者多个容器中,由docker宿主机挂载到容器上,但是不属于联合文件系统,因此能绕过联合文件系统提供一些用于持久化存储或者共享数据的特性. ♣卷的

Docker学习-Docker存储

Docker 为容器提供了两种存放数据的资源: 由 storage driver 管理的镜像层和容器层. Data Volume. storage driver docker的镜像分层结构,如下所示:Docker镜像中引入层layer的概念,镜像的制作过程中的每一步擦欧总,都会生成一个新的镜像层 容器由最上面一个可写的容器层,以及若干只读的镜像层组成,容器的数据就存放在这些层中.这样的分层结构最大的特性是 Copy-on-Write: 新数据会直接存放在最上面的容器层. 修改现有数据会先从镜像层

docker解决数据存储问题的方案

如今docker在云计算领域发展的势头非常猛,各个公司不论大小都開始研究这个开源工具和技术.环绕docker的开源项目和创业公司也多如牛毛,就是一个简单管理container的web ui都有非常多开源项目.只是还是一个人说的好.docker必须要是集群才好玩.并且越大越好玩. 当然这是从玩技术的人眼中看待的问题,假设要真正用于生产还是有非常多问题须要解决,非常多方案须要设计,非常多容错须要处理. 今天看资料学习到了docker是如何解决容器里面数据存储的问题的方案,曾经做PAAS遇到过这样的问

Docker五种存储驱动原理及应用场景和性能测试对比

Docker最开始采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可以共享同一个image.但由于AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题,在Docker 0.7版本中引入了存储驱动, 目前,Docker支持AUFS.Btrfs.Device mapper.OverlayFS.ZFS五种存储驱动.就如Docker官网上说的,没有单一的驱动适合所有的应用场景,要根据不同的场景选择合适的存储驱动,才能有效的提高Docker的性能.如何选择

Docker——网络和存储

iptables -t nat -vnL |grep docker 查看docker桥接网卡:brctl show 本地端口随机映射到docker容器的80端口上: docker run -d -P nginx 查看日志:docker logs 容器_id nginx 必须放在前台运行 本地端口指定映射到docker容器的80端口上:#81是宿主机端口,80是dokcer容器里面的端口 docker run -d -p 81:80 nginx 存储: 数据卷:所有的docker都能连接到上面 挂