理解docker镜像,容器和存储驱动

理解docker镜像,容器和存储驱动

201695

14:40

镜像

镜像作为docker中最基本的概念,有以下几个特性:

  1. 分层,每个镜像都由一个或多个镜像层组成
  2. 可通过在某个镜像加上一定的镜像层得到新镜像(此过程可通过编写dockerfile或在容器中commit实现)
  3. 每个都分层拥有唯一ID
  4. 镜像在存储和使用时共享相同的镜像层(根据ID),所以在pull镜像时,已有的镜像层会自动跳过下载
  5. 每个镜像层都是只读,即使启动成容器,也无法对其真正的修改,修改只会作用于最上层的容器层 


镜像 vs容器

 

  • 镜像加上一层可读写层(容器层)组成该镜像对应容器的文件系统
  • 在容器中通过commit可将最上层的可写层固化成镜像层,形成新镜像。此时,生成的新镜像与旧镜像共享底层镜像层,所以在宿主机上只不过是多了个新的镜像层

 

计算机生成了可选文字:Thin R/W layer 91e54dfb1179 d74508fb6632 c22013c84729 d3a1f33e8a5a ubuntu:15.04 Container 0B 1.895 KB 194.5 KB 188.1 MB Container layer Image layers (R/O)

 

 

 

.  Copy-On-Write,COW

 

       写时拷贝,多个程序共享同一份文件,读操作时对这份文件无影响,当程序需要进行写操作时才把要写的部分拷贝一份给对应程序。COW只是一种策略,有多种方法去实现。根据这种思想可以大大减少存储冗余。docker实现了COW策略,所以容器会共享相同的镜像层,如下图(同一个镜像启动成多个容器时)

 

计算机生成了可选文字:„nury 91e54dfb1179 d74508fb6632 c22013c84729 d3a1f33e&5a _Ț)iT_ R/W_lęyęȚ_ OB 1.895 KB 194.5 KB 188.1 MB ubuntu:15.04 Image

 

生成新镜像的方法有,从容器中commit,或者使用dockerfiledockerfile其实本质是也是启动容器去commit,只是这些操作都是docker自动化去完成。

 

dockerfile中每一个命令就对应生成一个镜像,即每个命令对应一个镜像层,如下图

计算机生成了可选文字:[ root 訕 ogon 、 ] # docker history registry.wae.hap1at.net/base/centos:6 1M 厶 〔 乇 07d52ebb288d 叻 8e724c5def 4886b bbeb3 e8f7e3de7b63 曲 56620gggC9 Cd5474e548C8 65ffa2f5c6ea 604 ( 2d6e1a Oa83 b655ff If21ea712fae 53530 01d 10 /bin/sh -c #(nop) 00 ["/bin/bash"l 72703a052 7 Id 曲 f8fb53e6 /bin/sh -C #(nop) e78888 8cfa 6a7b54515 1 47d44Cb6f252 CÆATED 4 weeks 4 weeks 4 weeks 4 weeks 4 weeks 5 weeks 5 weeks 5 weeks 5 weeks 5 weeks 5 weeks ago ago ago ago ago ago ago ago ago ago ago 12 months ago 12 months ago 12 months ago 12 months ago 12 months ago CÆATED BY /bin/sh -c #(nop) ENTRYPOINT &{["exec"]} /bin/sh -c ( Od 0777 /us r/bin/exec /bin/sh -c #(nop) C 、 ' dir : a61bcde1fb7e3dc 17a /bin/sh -C #(nop) C 、 ' file : 4b2808 fd 佣 b7d /bin/sh -c m . rf /us r/local/bin/ repo rt /bin/sh -c cd /tmp curl -L . 0 -s http : /bin/sh -C #(nop) ENV PATH=/usr/IocaI/wsmsage /bin/sh -C #(nop) ENV WAE DOCKER ENV=true /bin/sh -C *(nop) ENV LANG=en_US.UTF-8 /bin/sh -c cp -f /usr/share/zoneinfo/Asia/Sha /bin/sh -c yum -Y update yum install LABEL License=æLv2 /bin/sh -C *(nop) LABEL Vendo r=CentOS /bin/sh -C #(nop) ADD file : 91f92b 62a2a 573 /bin/sh -C #(nop) MAINTAIr•ER The CentOS Proje SIZE 4g6 B 2 . 431 kB 4g6 8 0 8 & g38 0 B 0 8 427 8 288 彐 《 祀 0 8 19 飢 6 铝 0 8

 

为什么要这么细粒度的划分层是因为,细粒度的镜像层被共用到的几率越大。举个极端的例子,如果把基于一个ubuntu镜像上所做的操作都归到一层的话,那么这一层共用到的几率几乎为零,因为定制化程度太高,每个人所需的环境不同。

 

.  docker storage driver

 

         docker将容器的一些底层运行环境进行抽象,从复杂的实现中分离出了driver组件,让用户得以专注于业务相关的容器使用。用户可以通过选定不同的driver组件来对docker中容器大环境的定制,具体的实现操作则交由driver去进行。

          driver分为三类:

  1. exec-driver,实现对容器运行环境的隔离和资源的限制,可选方案:lxcnative(libcontainer);
  2. network-driver,实现容器网络相关的操作;
  3. graph-driver,实现镜像存储相关操作,可选方案:devicemapper,aufs,btrfs,zfs等。

 

storage driverdocker中的一个组件,也称graphdriver

         功能:

  1. 镜像的存储管理,包括从hubpull的镜像和通过dockerfile生成的新镜像等;
  2. 容器启动时,为容器准备文件系统

 

        对于graphdriver选择何种方案去实现,并不影响docker功能方面的使用。每种方案都能实现镜像的分层结构和COW策略,但不同的方案对于docker的存储速度和稳定性是有影响的。目前相对比较成熟的有,aufsdevicemapperWAE使用中)

 

下图为各个方案的特点:

计算机生成了可选文字:stable production-readv good memory use smooth Cacker experience high write activity PaaS-type work smooth exaer•ence container churn build pools oroduction oerformance lab testing PaaS-type work Devicemapper (direct-Ivm) in mainline kernel high write activity good memory use ZFS native (ZOL) In mal nline kernel container churn lab testing ZFS FUSE production

官网对于选何种graphdriver的建议:https://docs.docker.com/engine/userguide/storagedriver/selectadriver/

 

 

.  devicemapper

 

     基于linux内核中的DeviceMapper框架实现,该框架实现了物理存储设备与虚拟存储设备的映射,或虚拟设备与虚拟设备之间的映射。这使得用户能够用该框架来实现磁盘的自由、动态的划分。LVM2,software RAIDsdm-cryptdisk encryption等都是基于该框架的实现。更为重要的是,Device Mapper框架中提供两个功能,thin-provisioningsnapshot

 

        thin-provisioning,类似于虚拟内存,提供给使用者的空间只有在使用者进行写操作时才真正进行分配。假设使用者有一块100gthin块设备,使用了20g,实际系统提供的大小就是20g,只有当使用者进行存储操作时才分配更多的空间,直到100g

        snapshot,快照,是一种COW策略的实现,假设从A设备做快照得到B设备时,并未对A进行完整拷贝,而是当对B设备进行写操作时,才将需要改变的那部分做属于B设备的拷贝。

 

         devicemapper利用了该框架中的thin-provisioningsnapshot实现了镜像的分层结构和存储优化。在用devicemapper作为graphdriverdocker中,每个镜像和容器都对应一个设备,通过对镜像做snapshot操作得到容器,所以容器中拥有镜像的内容且操作这些内容不影响镜像本身,因为容器和镜像对应不同的设备。

 

       devicemapper有两种模式可选,loop-lvmdirect-lvmdevicemapper的大致思路是,先通过虚拟化技术得到一个thin-pool设备(可理解成一个资源池),接着在thin-pool上建立一个基础设备,此后docker上所有镜像和容器都是基于此设备的snapshot。两个模式的区别就在与建立thin-pool的方法不同。

 

loop-lvm

  1. 创建两个稀疏文件datametadata
  2. 将这两个文件映射成两个块设备(loopback块设备)
  3. 将两个设备通过内核中Device Mapper映射成thin-pool

注意!该模式不推荐用于生产环境,因为该模式在宿主机跑高密度容器数量的话,性能下降急剧,生产环境中一台宿主机不可能只跑单个容器


direct-lvm

(利用了基于Device MapperLVM

  1. 将空余块设备(可以是分区)创建成physical volumepv
  2. 在由这些PV组成volume groupvg
  3. vg中建立两个logical volumelv),datamatedata
  4. datamatedata映射成thin-pool

*这些步骤可由已有脚本docker-storage-setup自动执行,docker启动前会自动执行该脚本,脚本位置/usr/bin/docker-storage-setup,只要在对应配置文件中提供用于创建VGPV(对应配置文件中DEVS),或者提供已有的VG,便可让脚本自动执行上述步骤。具体可通过service docker-storage-setup status查看,对应执行脚本内有使用说明。也可手动建立(Configure direct-lvm mode forproduction)

 

以下通过一些命令区别两种模式:

loop-lvm:

docker详情

计算机生成了可选文字:[root@wae-25 / docker info Containers: 36 Ima es: 117 orage Driver: devicanapper Pool Name: docker-8:3-1611g4g114-pool oc size: Backin Files stan: xfs Data file: /dev/loop€ Metadata file: /dev/loopl aa pace se . Data space Total: 1€7.4 6B Data Space Available: 161.7 6B Metadata Space Used: 16.6 MB Metadata Space Total: 2.147 6B Metadata Space Available: 2.137 6B Udev Sync Supported: true Deferred Ranoval Enabled: false ata loop file: /var/lib/docker/devicanapper/devicanapper/data etadata loop file: /var/lib/docker/devicanapper/devicanapper/metadata Execution Driver: native-€.2 Logging Driver: json-file Kernel version: 3.1€.€-327.e17.x86 64 Operating Systan: Centos Linux 7 (Core) CPUs: 24 Total Manory: 47 GiB Name: wae-25 ID: WARNING: bridge-nf-caU-ip6tab1es is disabled

列出块设备

计算机生成了可选文字:sda dal da3 sdb L_sdbl sdc L_sdcl loop€ Ldocker-8. docker- docker- docker- ocker- loopl Ldocker-8. ocker- docker- ocker- ocker- [root@wae-25 MAJ:MIN RN 8:32 € dm € dm € dm € dm € dm € dm € dm € dm € dm € dm Isblk •3-1611949114-pool 8: 3-1611949114-3b3gf8c96gef69466a6d6ad2b413ge1231a25eef167693529c9b8dc3c€48cb7€ •3-1611949114-pool 8:16 8:17 8:33 253:€ 253:3 253: 4 253:5 253: 6 253:€ 253:3 253: 4 253:5 253: 6 SIZE € 447. IG 200M 86 4396 € 931.56 € 931.56 931.56 931.56 26 RO TYPE disk part part part disk part disk part loop loop MOUNTPOINT 'boot [SWAP] /cachel /cache2 8: 3-1611949114-3b3gf8c96gef69466a6d6ad2b413ge1231a25eef167693529c9b8dc3c€48cb7€

 

 

direct-lvm模式:

 docker详情

计算机生成了可选文字:[root@bogon docker info Containers: 2 Images: 36 o rage river: evlcanapper Pool Name: docker-thin 001 Pool Blocksize: 524.3 kB Backin Files stan: xfs Data file: Data space Used: 1.713 6B Data space Total: 19.8 6B Data Space Available: 18.68 6B Metadata Space Used: 684 kB Metadata Space Total: 265.5 MB Metadata Space Available: 264.8 MB Udev Sync Supported: true Deferred Ranoval Enabled: true Library version: 1.€2.1€7-RHEL7 (2€16-@6-€9) Execution Driver: native-€.2 Logging Driver: json-file Kernel version: 3.1€.€-327.22.2.e17.x86 64 Operating Systan: Centos Linux 7 (Core) CPUs: 1 Total Manory: 977.9 MiB Name: bogon ID: WRUNG: bridge-nf-caU-iptables is disabled WRUNG: bridge-nf-caU-ip6tables is disabled

列出块设备

计算机生成了可选文字:[root@bogon Isblk MAJ:MIN RN sdal sda2 sda3 da4 da5 docker-8:2-6788wø€-f1a€4d3537edd5741f3gff262277362b35bbf17776fcafa31e67412f97e4d9fg 253:3 Ldocker-8:2-6788wø€-f1a€4d3537edd5741f3gff262277362b35bbf17776fcafa31e67412f97e4d9fg 253:3 253:€ 253:2 253:1 253:2 SIZE 500M 19.46 196M 18.46 18.4G 18.4G 4G RO TYPE disk part part part € part € part € dm € rom MOUNTPOINT /boot [SWAP] thin-provisioning, docker-thinpool tmeta Ldocker-thin 001 ocker- Inpoo Ldocker-thinpool

列出所有logical volume的信息

计算机生成了可选文字:[root@bogon LSize Attr thinpool docker twi-aot--- 18.44g Pool Origin Data* 8.66 Meta* €.33 Move Log Cpy%Sync Convert

 

目录相关

宿主机上容器、镜像等存储相关的主目录:/var/lib/docker

 

[root@bogon docker]# tree ./

./

├── containers                              <---容器相关

│   ├──f1a04d3537edd5741f39ff262277362b35bbf17776fcafa31e67412f97e4d9f9

│   │   ├── config.json

│   │   ├──f1a04d3537edd5741f39ff262277362b35bbf17776fcafa31e67412f97e4d9f9-json.log

│   │   ├── hostconfig.json

│   │   ├── hostname

│   │   ├── hosts

│   │   ├── resolv.conf

│   │   ├── resolv.conf.hash

│   │   └── secrets

├── devicemapper                       <---存储驱动相关

│   ├── metadata                          <---镜像、容器对应块设备的元数据

│   │   ├──0288ae931294ce04f5d69c60146faca7d9be8de4004421d650f4227fa60bd92b

│   │   ├──05c2ea2d81bceeddc2881beb63d2ee26537593de9f47b4613c0d5afb1353f7df

│   │   ├──f1a04d3537edd5741f39ff262277362b35bbf17776fcafa31e67412f97e4d9f9

│   │   ├──f1a04d3537edd5741f39ff262277362b35bbf17776fcafa31e67412f97e4d9f9-init

│   │   ├──f6d195bba85ba6b9c075186ee62fe56f5d3b27e29ad9a31da8753820f3e2586b

│   │   ├──f6d195bba85ba6b9c075186ee62fe56f5d3b27e29ad9a31da8753820f3e2586b-init

│   │   ├── base

│   │   ├── deviceset-metadata

│   │   └── transaction-metadata

│   └── mnt                              <---容器对应设备的挂载目录,docker会自动mountumount,所以手动打开为空,可自行mount,对应设备在/dev/mapper/

│       ├──0288ae931294ce04f5d69c60146faca7d9be8de4004421d650f4227fa60bd92b

│       ├──05c2ea2d81bceeddc2881beb63d2ee26537593de9f47b4613c0d5afb1353f7df

├── graph                                 <---镜像目录,存储镜像层元数据

│   ├──0288ae931294ce04f5d69c60146faca7d9be8de4004421d650f4227fa60bd92b

│   │  ├── checksum                       <---镜像校验和,用于判断镜像是否损坏

│   │  ├── json                                   <---描述镜像基础信息

│   │  ├── layersize                          <---镜像层大小

│   │  └── tar-data.json.gz           <---描述镜像层内文件在磁盘中的位置

│   ├──05c2ea2d81bceeddc2881beb63d2ee26537593de9f47b4613c0d5afb1353f7df

│   │   ├── checksum

│   │   ├── json

│   │   ├── layersize

│   │   └── tar-data.json.gz

│   └── _tmp

├── linkgraph.db

├── repositories-devicemapper

├── tmp

├── trust

└── volumes

 

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值