Docker-数据管理介绍

Docker 数据管理

如果将正在运行中的容器修改生成了新的数据,或者修改了现有的一个已经存在的文件内容,那么新产生的数据将会被复制到读写层,进行持久化保存,这个读写层也就是容器的工作目录,此即“写时复制(COW) copy on write”机制。
如下图是将对根的数据写入到了容器的可写层,但是把/data 中的数据写入到了一个另外的volume 中用于数据持久化

Docker-数据管理介绍插图

容器的数据管理介绍

Docker镜像是分层设计的,镜像层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层中。

Docker容器的分层

容器的数据分层

-LowerDir:image 镜像层(镜像本身,只读)
-UpperDir:容器的上层(读写)
-MergedDir:容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和upperdir 合并给容器使用
-WorkDir:容器在 宿主机的工作目录

范例:查看指定容器数据分层

[root@ubuntu1804 ~]#docker inspect  12959f2c152f
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761-init/diff:/var/lib/docker/overlay2/4a259e4cc9da105d17075e316c3e1f7c29abd6f7a37c5c7c29251a7e5f0e7eb3/diff",
                "MergedDir": "/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/merged",
                "UpperDir": "/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/diff",
                "WorkDir": "/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/work"
            },
            "Name": "overlay2"

[root@ubuntu1804 ~]#ll -i /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761
total 28
920832 drwx------  5 root root 4096 Jan 31 19:02 ./
917524 drwx------ 53 root root 4096 Jan 31 19:02 ../
920843 drwxr-xr-x  3 root root 4096 Jan 31 19:02 diff/
920846 -rw-r--r--  1 root root   26 Jan 31 19:02 link
920851 -rw-r--r--  1 root root   57 Jan 31 19:02 lower
920818 drwxr-xr-x  1 root root 4096 Jan 31 19:02 merged/
920847 drwx------  3 root root 4096 Jan 31 19:02 work/

[root@ubuntu1804 ~]#tree -d  /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/
/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/
├── diff
│   └── root
├── merged
│   ├── bin
│   ├── dev
│   │   ├── pts
│   │   └── shm
│   ├── etc
│   │   ├── apk
│   │   │   ├── keys
│   │   │   └── protected_paths.d
│   │   ├── conf.d
│   │   ├── crontabs
│   │   ├── init.d
│   │   ├── logrotate.d
│   │   ├── modprobe.d
│   │   ├── modules-load.d
│   │   ├── network
│   │   │   ├── if-down.d
│   │   │   ├── if-post-down.d
│   │   │   ├── if-post-up.d
│   │   │   ├── if-pre-down.d
│   │   │   ├── if-pre-up.d
│   │   │   └── if-up.d
│   │   ├── opt
│   │   ├── periodic
│   │   │   ├── 15min
│   │   │   ├── daily
│   │   │   ├── hourly
│   │   │   ├── monthly
│   │   │   └── weekly
│   │   ├── profile.d
│   │   ├── ssl
│   │   │   ├── certs
│   │   │   ├── misc
│   │   │   └── private
│   │   └── sysctl.d
│   ├── home
│   ├── lib
│   │   ├── apk
│   │   │   └── db
│   │   ├── firmware
│   │   └── mdev
│   ├── media
│   │   ├── cdrom
│   │   ├── floppy
│   │   └── usb
│   ├── mnt
│   ├── opt
│   ├── proc
│   ├── root
│   ├── run
│   ├── sbin
│   ├── srv
│   ├── sys
│   ├── tmp
│   ├── usr
│   │   ├── bin
│   │   ├── lib
│   │   │   └── engines-1.1
│   │   ├── local
│   │   │   ├── bin
│   │   │   ├── lib
│   │   │   └── share
│   │   ├── sbin
│   │   └── share
│   │       ├── apk
│   │       │   └── keys
│   │       │       ├── aarch64
│   │       │       ├── armhf
│   │       │       ├── ppc64le
│   │       │       ├── s390x
│   │       │       ├── x86
│   │       │       └── x86_64
│   │       ├── man
│   │       ├── misc
│   │       └── udhcpc
│   └── var
│       ├── cache
│       │   ├── apk
│       │   └── misc
│       ├── empty
│       ├── lib
│       │   ├── apk
│       │   ├── misc
│       │   └── udhcpd
│       ├── local
│       ├── lock
│       │   └── subsys
│       ├── log
│       ├── mail
│       ├── opt
│       ├── run -> /run
│       ├── spool
│       │   ├── cron
│       │   └── mail -> /var/mail
│       └── tmp
└── work
    └── work

99 directories
[root@ubuntu1804 ~]#docker run -it  alpine:3.11  sh
/ #  dd if=/dev/zero of=/root/test.img bs=1M count=10
10+0 records in
10+0 records out
/ # 

[root@ubuntu1804 ~]#find   /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761 -name test.img -ls
   920903  10240 -rw-r--r--   1 root     root     10485760 Jan 31 19:02 /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/merged/root/test.img
   920903  10240 -rw-r--r--   1 root     root     10485760 Jan 31 19:02 /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/diff/root/test.img

[root@ubuntu1804 ~]#mount 
overlay on /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/merged type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/OIRNCV35BGPGWKRWEMCJD5SYUZ:/var/lib/docker/overlay2/l/VZ7N54CVY2JLDASJAZ6AASRQSJ,upperdir=/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/diff,workdir=/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/work)
nsfs on /run/docker/netns/6ce1d74bc9af type nsfs (rw)

[root@ubuntu1804 ~]#tree /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/diff/
/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/diff/
└── root
    └── test.img

1 directory, 1 file
[root@ubuntu1804 ~]#ls /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/merged/
bin  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@ubuntu1804 ~]#docker run -it  alpine:3.11  sh
/ # echo welcome to magedu >> /etc/issue
/ # cat /etc/issue
Welcome to Alpine Linux 3.11
Kernel /r on an /m (/l)

welcome to magedu
/ # 

[root@ubuntu1804 ~]#tree /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/diff/
/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761/diff/
├── etc
│   └── issue
└── root
    └── test.img

2 directories, 2 files

#删除容器后,所有容器数据目录都随之而删除
[root@ubuntu1804 ~]#docker rm -f 12959f2c152f 
[root@ubuntu1804 ~]#ls /var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761
ls: cannot access '/var/lib/docker/overlay2/848d77064091ba3ddd25a10ea6e0065af15ee701fed06f82804cf9ed58751761': No such file or directory
哪些数据需要持久化

Docker-数据管理介绍插图(1)

  • 左侧是无状态的http请求服务,右侧为有状态
  • 下层为不需要存储的服务,上层为需要存储的部分服务
容器数据持久保存方式

如果要将写入到容器的数据永久保存,则需要将容器中的数据保存到宿主机的指定目录

Docker的数据类型分为两种:

  • 数据卷(data volume):直接使用宿主机目录,数据卷类似于挂载的一块磁盘,数据容器是将数据保存在一个容器上 ,推荐使用此种方式,此方式较常用
  • 数据卷容器(Data volume container):间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据 ,此方式不常用

Docker-数据管理介绍插图(2)

本文链接:http://www.yunweipai.com/34859.html

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/courses/52672.html

(0)
上一篇 2021年8月6日 16:42
下一篇 2021年8月6日 16:42

相关推荐

发表回复

登录后才能评论