[轉]關於docker包存儲結構說明

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

 

 

前段時間與同事交流docker的安裝包層次結構,並溝通相關每一個文件的做用,可是一直沒有進行文字備份,過去已經一月有餘,仍是將其記錄下來,供後續工做參考git

 

默認docker啓動會將目錄安裝在/var/lib/docker,不過建議能夠修改 --graph="/path/docker"安裝目錄.github

防止系統盤空間佔用過大,最好選擇存儲空間較大的分區.docker

 

docker目錄:apache

containers  當前容器的集合(至關於docker ps -a)json

目錄是容器的配置信息及當前狀態.bash

經常使用的包括容器配置信息網絡信息,日誌,都是來源於此,默認存儲方式json網絡

咱們平時使用的docker inspect , docker logs, docker ps 都是來自於文件夾app

 通常用於docker容器重啓時,恢復配置使用的依據,因爲掛起方式是基礎環境,沒有辦法像VM軟件的掛起能夠凍結進程,也是docker相似半虛擬容器很難實現真正的將運行容器進行分發,故此若是想實現有狀態的運行容器漂移是還是十分困難.dom

 

 

 

hostname 主機名稱

hosts 容器重啓

resolv.conf是DNS服務,默認是拷貝/etc/resolv.conf的配置

hostconfig.json是核心配置之一, 包括網絡, CPU, MEM等,dockerrun選項配置造成的容器設置均可以在此處查詢到.

config.json是核心docker狀態管理文件, 由她加載上述全部文件

config.json 是核心docker狀態管理文件, 由她加載上述全部文件

 

 

[plain]  view plain  copy
 
  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的思想基石,containersimage的json文件都是描述,真正存儲數據的則是devicemapper/data.

 

其中包括臨時容器和鏡像文件儘管咱們是容器內部的文件拷貝,也會促使data文件的增大,後續打算找個專題來解釋他吧,docker的封裝devicemapperAPI是很不錯,有興趣能夠參考/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,父鏡像的容器,另每一個鏡像都有一個初始鏡像,能夠追溯

 

[java]  view plain  copy
 
  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.   
  17.     // 非初始鏡像,則設置鏡像父子關係  
  18.     if containerID != "" {  
  19.         img.Parent = containerImage  
  20.         img.Container = containerID  
  21.         img.ContainerConfig = *containerConfig  
  22.     }  
  23.   
  24.   
  25.     // 註冊鏡像  
  26.     if err := graph.Register(img, layerData); err != nil {  
  27.         return nil, err  
  28.     }  
  29.     return img, nil  
  30. }  



 

 

vfs 是咱們使用不定向掛載時引用,好比說咱們-v /data0 ,則默認使用vfs作爲掛載路徑,使用dockerfile時較爲經常使用

 

volumes 是掛載使用的映射關係,對應掛載源與掛載路徑的關係,同時擁有ID,用於能夠多個容器使用一個掛在源

 

linkgraph.db  是graph存儲鏡像之間的關聯關係,是初始化graph對象的依據.同時,graph文件夾的信息與linkgraph.db是數據重合的.

相關文章
相關標籤/搜索