原文: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狀態管理文件, 由她加載上述全部文件
- {
- "State": {
- "Running": false,
- "Paused": false,
- "Restarting": false,
- "OOMKilled": false,
- "Dead": false,
- "Pid": 0,
- "ExitCode": 0,
- "Error": "",
- "StartedAt": "2015-10-10T07:36:31.250795069Z",
- "FinishedAt": "2015-10-10T07:37:09.587772608Z"
- },
- "ID": "02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def",
- "Created": "2015-10-10T07:36:30.400677786Z",
- "Path": "/bin/bash",
- "Args": [],
- "Config": {
- "Hostname": "02bbc65a5c2a",
- "Domainname": "",
- "User": "",
- "AttachStdin": true,
- "AttachStdout": true,
- "AttachStderr": true,
- "PortSpecs": null,
- "ExposedPorts": null,
- "Tty": true,
- "OpenStdin": true,
- "StdinOnce": true,
- "Env": null,
- "Cmd": [
- "/bin/bash"
- ],
- "Image": "docker.io/coreos/apache",
- "Volumes": {
- "/data0": {}
- },
- "VolumeDriver": "",
- "WorkingDir": "",
- "Entrypoint": null,
- "NetworkDisabled": false,
- "MacAddress": "",
- "OnBuild": null,
- "Labels": {}
- },
- "Image": "87026dcb00443eb7f1725b1c9f4fb8210027a19364103854a1e5f606b95019ff",
- "NetworkSettings": {
- "Bridge": "",
- "EndpointID": "",
- "Gateway": "",
- "GlobalIPv6Address": "",
- "GlobalIPv6PrefixLen": 0,
- "HairpinMode": false,
- "IPAddress": "",
- "IPPrefixLen": 0,
- "IPv6Gateway": "",
- "LinkLocalIPv6Address": "",
- "LinkLocalIPv6PrefixLen": 0,
- "MacAddress": "",
- "NetworkID": "",
- "PortMapping": null,
- "Ports": null,
- "SandboxKey": "",
- "SecondaryIPAddresses": null,
- "SecondaryIPv6Addresses": null
- },
- "ResolvConfPath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/resolv.conf",
- "HostnamePath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/hostname",
- "HostsPath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/hosts",
- "LogPath": "/var/lib/docker/containers/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def/02bbc65a5c2a285c34565fd9b0b3b485772faaf968a2f2eb3df1fff649119def-json.log",
- "Name": "/determined_poincare",
- "Driver": "devicemapper",
- "ExecDriver": "native-0.2",
- "MountLabel": "",
- "ProcessLabel": "",
- "RestartCount": 0,
- "UpdateDns": false,
- "MountPoints": {
- "/data0": {
- "Name": "53938b2752dc6f84475657a57ce87d45a329d3815426c1f0988c18b6bbf2df86",
- "Destination": "/data0",
- "Driver": "local",
- "RW": true,
- "Source": "",
- "Relabel": ""
- }
- },
- "Volumes": {},
- "VolumesRW": {},
- "AppArmorProfile": ""
- }
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,父鏡像的容器,另每一個鏡像都有一個初始鏡像,能夠追溯
- func (graph *Graph) Create(layerData io.Reader, containerID, containerImage, comment, author string, containerConfig, config *runconfig.Config) (*image.Image, error) {
-
- img := &image.Image{
- ID: stringid.GenerateRandomID(),
- Comment: comment,
- Created: time.Now().UTC(),
- DockerVersion: dockerversion.VERSION,
- Author: author,
- Config: config,
- Architecture: runtime.GOARCH,
- OS: runtime.GOOS,
- }
-
-
-
- if containerID != "" {
- img.Parent = containerImage
- img.Container = containerID
- img.ContainerConfig = *containerConfig
- }
-
-
-
- if err := graph.Register(img, layerData); err != nil {
- return nil, err
- }
- return img, nil
- }
vfs 是咱們使用不定向掛載時引用,好比說咱們-v /data0 ,則默認使用vfs作爲掛載路徑,使用dockerfile時較爲經常使用
volumes 是掛載使用的映射關係,對應掛載源與掛載路徑的關係,同時擁有ID,用於能夠多個容器使用一個掛在源
linkgraph.db 是graph存儲鏡像之間的關聯關係,是初始化graph對象的依據.同時,graph文件夾的信息與linkgraph.db是數據重合的.