Docker 数据管理
如果将正在运行中的容器修改生成了新的数据,或者修改了现有的一个已经存在的文件内容,那么新产生的数据将会被复制到读写层,进行持久化保存,这个读写层也就是容器的工作目录,此即“写时复制(COW) copy on write”机制。
如下图是将对根的数据写入到了容器的可写层,但是把/data 中的数据写入到了一个另外的volume 中用于数据持久化
容器的数据管理介绍
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
哪些数据需要持久化
- 左侧是无状态的http请求服务,右侧为有状态
- 下层为不需要存储的服务,上层为需要存储的部分服务
容器数据持久保存方式
如果要将写入到容器的数据永久保存,则需要将容器中的数据保存到宿主机的指定目录
Docker的数据类型分为两种:
- 数据卷(data volume):直接使用宿主机目录,数据卷类似于挂载的一块磁盘,数据容器是将数据保存在一个容器上 ,推荐使用此种方式,此方式较常用
- 数据卷容器(Data volume container):间接使用宿主机空间,数据卷容器是将宿主机的目录挂载至一个专门的数据卷容器,然后让其他容器通过数据卷容器读写宿主机的数据 ,此方式不常用
本文链接:http://www.yunweipai.com/34859.html
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/courses/52672.html