Docker学习-Docker存储

Docker 为容器提供了两种存放数据的资源:

  • 由 storage driver 管理的镜像层和容器层。
  • Data Volume。

storage driver

docker的镜像分层结构,如下所示:

Docker镜像中引入层layer的概念,镜像的制作过程中的每一步擦欧总,都会生成一个新的镜像层

容器由最上面一个可写的容器层,以及若干只读的镜像层组成,容器的数据就存放在这些层中。这样的分层结构最大的特性是 Copy-on-Write:

  • 新数据会直接存放在最上面的容器层。
  • 修改现有数据会先从镜像层将数据复制到容器层,修改后的数据直接保存在容器层中,镜像层保持不变。
  • 如果多个层中有命名相同的文件,用户只能看到最上面那层中的文件。
    分层结构使镜像和容器的创建、共享以及分发变得非常高效,而这些都要归功于 Docker storage driver。正是 storage driver 实现了多层数据的堆叠并为用户提供一个单一的合并之后的统一视图。
    Docker 支持多种 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它们都能实现分层的架构,同时又有各自的特性。
    Docker会优先使用 Linux 发行版默认的 storage driver。
    Docker 安装时会根据当前系统的配置选择默认的 driver。默认 driver 具有最好的稳定性,因为默认 driver 在发行版上经过了严格的测试。
    运行Docker info可查看当前系统使用的Storage driver


centos默认的driver用的是overlay2,底层的文件系统是xfs,各层数据存放在/var/lib/docker

对于某些容器如busybox只是个工具箱,不需要保存数据以后使用,使用完成后直接退出,容器删除时存放在容器层中的工作数据也一起被删除。

Docker数据管理

docker容器中持久化数据一般采用两种存储方式:
volume
bind mount

无论是volume还是bind mount,其本质上是宿主机文件系统中的目录或者文件
无论是volume还是bind mount,其上存放的数据生命周期对立于容器,即容器删除之后,volume或者bind mount上的数据,依旧存在

Volume

Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。Volume 有以下特点:

  • Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
  • 容器可以读写 volume 中的数据。
  • volume 数据可以被永久的保存,即使使用它的容器已经销毁。

因为 volume 实际上是 docker host 文件系统的一部分,所以 volume 的容量取决于文件系统当前未使用的空间。

volume使用注意事项:

  • volume的内容存在容器的生命周期之外;删除后依旧存在
  • 挂载volume时,不需要指定mount源,指定mount point即可,Docker会在/var/lib/docker/volumes路径下为每个volume生成一个目录,作为mount源
  • 若mount point指向容器中已有的目录,则该目录下的数据会被copy到volume中
  • 若mount point指向容器中的空目录,则会自动创建所需目录。
  • 若启动挂载上不存在的卷的容器,Dokcer会自动创建卷
  • Volume再使用时,可通过ro参数将容器戳volume的权限设置为只读

bind mount

bind mount 是将 host 上已存在的目录或文件 mount 到容器。

bind mount实际上是一个inode替换的过程。

bind mount机制主要作用,允许一个目录或者文件(不是整个设备)挂载到一个指定的目录上,而且在该挂载点上进行任何的操作,只是发生在被挂载的目录或者文件上,而原挂载点的内容则会被隐藏起来不受影响。

bind mount使用注意事项:

  • 容器运行过程中,对bind mount目录中改动的数据,将被保存,删除容器后,bind mount中的数据任然存在。
  • bind mount可以挂载在一个目录到容器,也可以挂载一个文件到容器,但必须要指定的目录或文件的路径,即mount源,当然也必须指定mount point,这也限制了容器的可移植性
  • 若将bind mount也绑定到容器上的某非空目录下,则会隐藏容器目录下的现有内容,若不希望容器的整个目录被覆盖,可单独挂载某个文件
  • 若mount源指向的文件或者目录在宿主机上不存在,则会自动创建
  • bind mount时,可以通过ro参数将容器对数据的权限设置为只读,设置ro参数后,容器无法对数据进行修改,但宿主机依旧有权修改其内容。

bind mount的用法是使用-v选项将host已经存在的目录或者文件mount到容器
如下所示:

-v 的格式为 <host path>:<container path>。/usr/local/apache2/htdocs 就是 apache server 存放静态文件的地方。由于 /usr/local/apache2/htdocs 已经存在,原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据,这与 linux mount 命令的行为是一致的。

数据共享

数据共享是volume的关键特性,主机与容器数据共享:

  • bind mount:将host上的目录或者文件mount到容器中
  • volume:将Host上的数据copy到容器的volume中
    容器间的数据共享:
    bind mount:将host上目录或文件mount到多个容器中
    volume:将volume挂载到多个容器
    volume container:先通过volume或bind mount将数据挂载到一个container中,其他容器再引用这个container中的数据

volume container是专门为其他容器提供volume的容器。

volume生命周期管理

备份

因为 volume 实际上是 host 文件系统中的目录和文件,所以 volume 的备份实际上是对文件系统的备份

恢复

volume 的恢复也很简单,如果数据损坏了,直接用之前备份的数据拷贝

迁移

如果使用更新版本的 Registry,这就涉及到数据迁移,方法是:

  • docker stop 当前 Registry 容器。
  • 启动新版本容器并 mount 原有 volume。

销毁

volume删除后数据是找不回来的,注意
docker 不会销毁 bind mount,删除数据的工作只能由 host 负责,再在执行 docker rm 删除容器时可以带上 -v 参数,docker 会将容器使用到的 volume 一并删除,但前提是没有其他容器 mount 该 volume。

操作实验

volume挂载操作

创建一个卷,并挂载一个httpd容器
docker run -d -p 8080:80 -v /usr/local/apache2/htdocs httpd
-v 将其mount到httpd容器

-v格式为<host path>:<container path>。/usr/local/apache2/htdocs就是Apache Server存放静态文件的地方,
由于 /usr/local/apache2/htdocs 已经存在,原有数据会被隐藏起来,取而代之的是 host $HOME/htdocs/ 中的数据。
检查volume信息

docker volume ls

查看容器的volume挂载信息,同时得到volume路径,Type=volume

docker inspect d5db6a048612

查看volume中的数据

 cd /var/lib/docker/volumes/6189c90831d019229a2e8593453fe1c334faec1fcc56db80b9f99773d21c9c55/_data

查看容器中相应的数据,结果:容器中的数据=volume中数据

进入容器更新index.html文件内容

docker exec -it d5db6a048612 bash
cd htdocs && echo "update the index" > index.html


再次查看volume中的内容,已经同步跟新

由此实现容器和Host的数据共享。

强制删除容器,然后查看volume中的数据,可以看到依旧存在

docker rm -f d5db6a048612

bind mount

将宿主机的/root/htdocs目录以只读的方式挂载给一个名为httpd1的httpd容器,映射端口8081

docker run --name httpd1 -d -p 8081:80 -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd

查看容器挂载信息。Type=bind

docker inspect httpd1

在宿主机host上跟新index.html文件数据,印证httpd1容器中的数据也一起跟新

由此 ,容器和Host的实现了数据共享

进入httpd1容器中更新index.html文件数据,提示Read-only

将宿主机/root/htdocs挂载给名为httpd2的http容器,映射端口8082,不设置ro

docker run --name httpd2 -d -p 8082:80 -v /root/htdocs/:/usr/local/apache2/htdocs httpd


进入httpd2容器中更新index.html

docker exec -it httpd2 bash

分别查看宿主机、http1,http2中的数据,三者数据一致

此时印证容器间的数据实现共享

原文地址:https://blog.51cto.com/11555417/2437999

时间: 2024-08-09 22:31:50

Docker学习-Docker存储的相关文章

Docker学习---&gt;&gt;Docker的认识,安装,及常用命令熟悉

Docker是什么? 在平常的软件开发中,会面临着开发不同的程序或服务需要不同的环境.而在该环境上开发完成后,想要在其他的环境上部署,则需要自己去重新部署,而Docker的出现使得这样的迁移变得容易.举一个老生常谈的例子,也就是常说的集装箱,在以前运送货物的时候,不同的货物放到一起运送的话彼此会互相影响,比如运送水果的碰见运送铁块的.一不小心在货轮上会使得水果被压坏.而集装箱的出现则大大改变了这一情况.将水果放在一个集装箱中,将铁块放到另一个集装箱中.这样即使集装箱摞起来,彼此之间也不会影响.D

docker学习---docker基础知识

目录 docker的基础 1.安装docker 2.使用镜像 3.镜像迁移|导入和导出 4.docker Hub介绍 5.搭建私有镜像仓库 5.1.docker开源的镜像分发工具--docker Registry 5.2.harbor部署 6.使用容器 7.容器导出和导入 8.数据卷 9.网络访问 10.dockerfile 10.1.基础指令 10.2.控制指令 10.3.引入指令 10.3.执行指令 10.4.配置指令 10.5.特殊用法 docker的基础 1.安装docker yum i

docker学习-docker安装

win10之外的系统:https://www.docker.com/products/docker-toolbox win10系统:        https://www.docker.com/products/docker#/windows boot2docker.ios下载地址:http://pan.baidu.com/s/1qYyc0ag 然后重新启动docker: 使用命令docker version检查下是否启动成功,若出现了Client和Server两部分内容说明安装成功了: doc

docker学习-docker仓库

docker仓库中心:https://hub.docker.com/ 网易蜂巢仓库中心:https://c.163.com/hub#/m/home/

docker学习-docker镜像

docker就是一系列文件,

docker学习-docker核心技术

镜像:集装箱     ---build 仓库:超级码头  ----ship 容器:运行程序的地方    ----run docker运行一个程序的过程:去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器:

docker学习-docker容器运行

docker run是启动容器的方法,可以用三种指定的方式指定容器启动时执行的命令.(1)CMD指令(2)ENTRYPOINT指令(3)在docker run中命令行中指定但是docker run并不能长期保持running状态,我们经常需要进入到容器中去做一些工作,比如查看日志.调试.启动其他进程等.有两种进入容器的方式:attach和exec. docker attach 首先启动一个容器,保持后台长期运行 docker run -d ubuntu /bin/bash -c "while t

Docker 学习笔记【2】 Docker 基础操作实,Docker仓库、数据卷,网络基础学习

Docker 学习笔记[3] Docker 仓库实操,创建私有仓库,实操数据卷.数据卷容器,实操 网络基础  ---------高级网络配置和部分实战案例学习 ============================================================= Docker 学习笔记[1]Docker 相关概念,基本操作--------实操记录开始 ============================================================= 被

Docker学习笔记2

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口. 官网:https://www.docker.com/相关资料:1.Docker入门教程 http://dockone.io/article/1112.Docker_百度百科 http://baike.baidu.com/view/11854949.htm3.史上最全Docker资料集粹 ht