原文:http://blog.csdn.net/w412692660/article/details/49005631

前段时间与同事交流docker的安装包层次结构,并沟通相关每个文件的作用,但是一直没有进行文字备份,过去已经一月有余,还是将其记录下来,供后续工作参考

默认docker启动会将目录安装在/var/lib/docker中,不过建议可以修改 --graph="/path/docker"安装目录.

防止系统盘空间占用过大,最好选择存储空间较大的分区.

docker目录:

containers  当前容器的集合(相当于docker ps -a)

目录是容器的配置信息及当前状态.

常用的包括容器配置信息, 网络信息,日志,都是来源于此,默认存储方式json

我们平时使用的docker inspect , docker logs, docker ps 都是来自于文件夹

一般用于docker容器重启时,恢复配置使用的依据,由于挂起方式是基础环境,没有办法像VM软件的挂起可以冻结进程,也是docker类似半虚拟容器很难实现真正的将运行容器进行分发,故此如果想实现有状态的运行容器漂移是仍是十分困难.

hostname 主机名称

hosts 容器重启

resolv.conf是DNS服务,默认是拷贝/etc/resolv.conf的配置

hostconfig.json是核心配置之一, 包括网络, CPU, MEM等,dockerrun选项配置形成的容器设置都可以在此处查询到.

config.json是核心docker状态管理文件, 由她加载上述所有文件

config.json 是核心docker状态管理文件, 由她加载上述所有文件

  1. {
  2. "State": {
  3. "Running": false,
  4. "Paused": false,
  5. "Restarting": false,
  6. "OOMKilled": false,
  7. "Dead": false,
  8. "Pid": 0,
  9. "ExitCode": 0,
  10. "Error": "",
  11. "StartedAt": "2015-10-10T07:36:31.250795069Z",
  12. "FinishedAt": "2015-10-10T07:37:09.587772608Z"
  13. },
  14. "ID": "02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def",
  15. "Created": "2015-10-10T07:36:30.400677786Z",
  16. "Path": "/bin/bash",
  17. "Args": [],
  18. "Config": {
  19. "Hostname": "02bbc65a5c2a",
  20. "Domainname": "",
  21. "User": "",
  22. "AttachStdin": true,
  23. "AttachStdout": true,
  24. "AttachStderr": true,
  25. "PortSpecs": null,
  26. "ExposedPorts": null,
  27. "Tty": true,
  28. "OpenStdin": true,
  29. "StdinOnce": true,
  30. "Env": null,
  31. "Cmd": [
  32. "/bin/bash"
  33. ],
  34. "Image": "docker.io/coreos/apache",
  35. "Volumes": {
  36. "/data0": {}
  37. },
  38. "VolumeDriver": "",
  39. "WorkingDir": "",
  40. "Entrypoint": null,
  41. "NetworkDisabled": false,
  42. "MacAddress": "",
  43. "OnBuild": null,
  44. "Labels": {}
  45. },
  46. "Image": "87026dcb00443eb7f1725b1c9f4fb8210027a19364103854a1e5f606b95019ff",
  47. "NetworkSettings": {
  48. "Bridge": "",
  49. "EndpointID": "",
  50. "Gateway": "",
  51. "GlobalIPv6Address": "",
  52. "GlobalIPv6PrefixLen": 0,
  53. "HairpinMode": false,
  54. "IPAddress": "",
  55. "IPPrefixLen": 0,
  56. "IPv6Gateway": "",
  57. "LinkLocalIPv6Address": "",
  58. "LinkLocalIPv6PrefixLen": 0,
  59. "MacAddress": "",
  60. "NetworkID": "",
  61. "PortMapping": null,
  62. "Ports": null,
  63. "SandboxKey": "",
  64. "SecondaryIPAddresses": null,
  65. "SecondaryIPv6Addresses": null
  66. },
  67. "ResolvConfPath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/resolv.conf",
  68. "HostnamePath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/hostname",
  69. "HostsPath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/hosts",
  70. "LogPath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def-json.log",
  71. "Name": "/determined_poincare",
  72. "Driver": "devicemapper",
  73. "ExecDriver": "native-0.2",
  74. "MountLabel": "",
  75. "ProcessLabel": "",
  76. "RestartCount": 0,
  77. "UpdateDns": false,
  78. "MountPoints": {
  79. "/data0": {
  80. "Name": "53938b2752dc6f84475657a57ce87d45a329d3815426c1f0988c18b6bbf2df86",
  81. "Destination": "/data0",
  82. "Driver": "local",
  83. "RW": true,
  84. "Source": "",
  85. "Relabel": ""
  86. }
  87. },
  88. "Volumes": {},
  89. "VolumesRW": {},
  90. "AppArmorProfile": ""
  91. }

XXX.log  是容器log日志,也仅有启动容器时,运行命令的日志,其他如后台程序的日志并不在此日志中.

devicemapper 是以ID为标识存储镜像和容器,可以说devicemapper是最核心的部分,同时也是最容易存储超标的部分,其是lvm的软件之docker主要用了他的快照功能,完成image的思想基石,containers和image的json文件都是描述,真正存储数据的则是devicemapper/data.

其中包括临时容器和镜像文件, 尽管我们是容器内部的文件拷贝,也会促使data文件的增大,后续打算找个专题来解释他吧,docker的封装devicemapper的API是很不错,有兴趣可以参考/github.com/docker/docker/daemon/graphdriver/devmapper/driver.go , 仅仅对外暴漏数个接口,具体实现deviceset.go中.

graph 存储镜像信息,使用json方式存储描述,真正数据也是存储在devicemapper中,镜像ID则是devicemapper存储的ID.

devicemapper , 具体可参考:graph.go的Register(img*image.Image,layerDataio.Reader)函数

镜像内容包括:镜像ID,父镜像ID,父镜像的容器,另每个镜像都有一个初始镜像,可以追溯

  1. // Create creates a new image and registers it in the graph.
  2. // 创建一个新的镜像
  3. func (graph *Graph) Create(layerData io.Reader, containerID, containerImage, comment, author string, containerConfig, config *runconfig.Config) (*image.Image, error) {
  4. // 初始化镜像实例
  5. img := &image.Image{
  6. ID:            stringid.GenerateRandomID(), // 生成镜像ID
  7. Comment:       comment,  // 命令
  8. Created:       time.Now().UTC(), // 时间
  9. DockerVersion: dockerversion.VERSION, // docker版本
  10. Author:        author, // 作者
  11. Config:        config, // 相关container配置, 请查看graph/**/json
  12. Architecture:  runtime.GOARCH,
  13. OS:            runtime.GOOS,
  14. }
  15. // 非初始镜像,则设置镜像父子关系
  16. if containerID != "" {
  17. img.Parent = containerImage
  18. img.Container = containerID
  19. img.ContainerConfig = *containerConfig
  20. }
  21. // 注册镜像
  22. if err := graph.Register(img, layerData); err != nil {
  23. return nil, err
  24. }
  25. return img, nil
  26. }

vfs 是我们使用不定向挂载时引用,比如说我们-v /data0 ,则默认使用vfs做为挂载路径,使用dockerfile时较为常用

volumes 是挂载使用的映射关系,对应挂载源与挂载路径的关系,同时拥有ID,用于可以多个容器使用一个挂在源

linkgraph.db  是graph存储镜像之间的关联关系,是初始化graph对象的依据.同时,graph文件夹的信息与linkgraph.db是数据重合的.

[转]关于docker包存储结构说明的更多相关文章

  1. docker的存储结构,和以前有了很大不同

    在网上学习这一块知识点时,有一个URL讲得很详细, docker 镜像与容器存储目录结构精讲 http://blog.csdn.net/wanglei_storage/article/details/ ...

  2. Docker内部存储结构(devicemapper)解析(续)

    dm.fs 参数dm.fs可以指定容器的rootfs的文件系统,但只支持ext4/xfs: func NewDeviceSet(root string, doInit bool, options [] ...

  3. Docker镜像文件存储结构

    docker相关文件存放在:/var/lib/docker目录下 镜像的存储结构主要分两部分,一是镜像ID之间的关联,一是镜像ID与镜像名称之间的关联,前者的结构体叫Graph,后者叫TagStore ...

  4. docker存储结构解析

    由于aufs并未并入内核,故而目前只有Ubuntu系统上能够使用aufs作为docker的存储引擎,而其他系统上使用lvm thin provisioning(overlayfs是一个和aufs类似的 ...

  5. Docker镜像存储-overlayfs

    一.概述 Docker中的镜像采用分层构建设计,每个层可以称之为“layer”,这些layer被存放在了/var/lib/docker/<storage-driver>/目录下,这里的st ...

  6. ORACLE管理存储结构之物理机构+逻辑结构【weber出品】

    一.数据库的存储结构有物理结构和逻辑结构组成的 物理结构:物理上,oracle是由一些操作系统文件组成的 SQL> select name from v$datafile; NAME ----- ...

  7. ORACLE数据库存储结构简介(转)

    首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的.   逻辑存储结构:oracle内部的组织和管理数据的方式.  物理存储结构:o ...

  8. OCA读书笔记(7) - 管理数据库存储结构

    7.Managing Database Storage Structures 逻辑结构 数据库的存储结构有物理结构和逻辑结构组成的 物理结构:物理上,oracle是由一些操作系统文件组成的 SQL&g ...

  9. InnoDB的表类型,逻辑存储结构,物理存储结构

    表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...

随机推荐

  1. J2SE 8的Lambda --- 语法

    语法例子 LambdaGrammarTest lambdaTest = new LambdaGrammarTest(); // 1. 能够推导出类型的,可以不写类型 String[] planets ...

  2. Window Mysql 5.7.18安装

    1:下载地址 https://dev.mysql.com/downloads/mysql/ 点击Community , 然后点击Community Server 位置, 下载 安装包 2: 配置环境变 ...

  3. Error 2503 and 2502 when installing/uninstalling on Windows 10

    1. Hold Ctrl+Shift and press Esc. 2. Locate “Windows Explorer” under “Windows processes”, now right ...

  4. UI5-文档-4.1-Hello World!

    如你所知,SAPUI5是关于HTML5的.让我们开始构建第一个仅使用HTML的“Hello World”. Preview 浏览器显示文本“Hello World” Coding 你可以在此查看和下载 ...

  5. UI5-文档-4-Walkthrough

    在本教程中,我们将向您介绍SAPUI5的所有主要开发范例. 我们首先向您介绍基本的开发范例,如模型M-视图V-控制器C,并为我们的应用程序建立一个最佳实践结构.我们将以经典的“Hello World” ...

  6. YAML描述与Python的对应关系

    YAML是"YAML Ain't a Markup Language"的首字母缩写,其语法简单,结构通过空格来展示,(列表)项目使用"-"来代表,(字典)键值对 ...

  7. 兼容当前五大浏览器的渐变颜色背景gradient的写法

    <style type="text/css" media="screen"> #gradient { width: 200px; height: 2 ...

  8. Ubuntu下Anaconda3的安装

    1)去https://www.anaconda.com/download/#download下载Anaconda安装文件(python3.6的版本). 2)进入到Anaconda3-5.0.1-Lin ...

  9. mysql优化连接数

    很多开发人员都会遇见”MySQL: ERROR 1040: Too many connections”的异常情况,造成这种情况的一种原因是访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务 ...

  10. 《Visual Basic开发实战1200例》包括第I卷、第II卷共计1200个例子,本书是第I卷,共计600个例子。

    本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual Basic进行程序开发各个方面的知识和技巧.主要包括基础知识.窗体界面设计.控件应用等.全书分6篇20章,共计6 ...