数据存储
1、数据卷特性
(1)Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层
(2)如果运行中的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏,即"写时复制"机制。
-
数据卷意义
关闭并重启容器,其数据不受影响;但删除Docker容器,则器改变将会全部丢失。
“卷”是容器上的一个或多个“目录”,此类目录可绕过联合文件系统,与宿主机上的某个目录“绑定”
Volume:可以在运行容器时即完成创建与绑定操作。当然,前提需要拥有对应的申明
Volume:初衷就是数据持久化
2、容器中的数据卷
- 数据卷类型
- Bind mount volume:可以是操作系统中的任意目录
- Docker-managed volume:docker自己管理,在dockerfile中使用volume关键字指定
Docker-managed Volume
基于Docker自管理,在写镜像的时候标识
#创建容器
[root@nod ~]# docker run --name wordpress -d wordpress
[root@nod ~]# docker volume ls
DRIVER VOLUME NAME
local 8a3eafd7d932ac18573ae3088e0aaf76e0b0cff2c5ae9c39f349a3657f41df31
[root@nod ~]# docker inspect 8a3eafd7d932ac18573ae3088e0aaf76e0b0cff2c5ae9c39f349a3657f41df31
[
{
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/8a3eafd7d932ac18573ae3088e0aaf76e0b0cff2c5ae9c39f349a3657f41df31/_data",
"Name": "8a3eafd7d932ac18573ae3088e0aaf76e0b0cff2c5ae9c39f349a3657f41df31",
"Options": {},
"Scope": "local"
}
]
#具体目录
[root@nod volumes]# pwd
/var/lib/docker/volumes
当启动了自管理卷时,容器删除时volumes不会被删除,如果需要容器删除时删除volumes,加上-v参数。
#测试一:
[root@nod test]# cat Dockerfile
FROM centos
RUN touch /tmp/1.txt
RUN mkdir /data
CMD tail -f /tmp/1.txt
#构建镜像
[root@nod test]# docker build -t test:v1.0 .
Sending build context to Docker daemon 2.048 kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : RUN touch /tmp/1.txt
---> Running in 62260853be19
---> 9ea62fe3798a
Removing intermediate container 62260853be19
Step 3/4 : RUN mkdir /data
---> Running in 94081407c5c5
---> 4f797ed9cd39
Removing intermediate container 94081407c5c5
Step 4/4 : CMD tail -f /tmp/1.txt
---> Running in 2ed1a3f8b099
---> e622db4eef99
Removing intermediate container 2ed1a3f8b099
Successfully built e622db4eef99
[root@nod test]# docker run --name test1 -d test:v1.0
e7f1227701dc357bfbf4b39c97b974231988c15b6a785851f47a14737d8aa15e
#查看此镜像没有创建自管理数据卷
[root@nod test]# docker volume ls
DRIVER VOLUME NAME
#测试二:
[root@nod test]# cat Dockerfile
FROM centos
RUN touch /tmp/1.txt
RUN mkdir /data
VOLUME /data
CMD tail -f /tmp/1.txt
#构建
[root@nod test]# docker build -t test:v2.0 .
Sending build context to Docker daemon 2.048 kB
Step 1/5 : FROM centos
---> 5d0da3dc9764
Step 2/5 : RUN touch /tmp/1.txt
---> Using cache
---> 9ea62fe3798a
Step 3/5 : RUN mkdir /data
---> Using cache
---> 4f797ed9cd39
Step 4/5 : VOLUME /data
---> Running in 3d7a0f9ab8f0
---> 4579dd1a1393
Removing intermediate container 3d7a0f9ab8f0
Step 5/5 : CMD tail -f /tmp/1.txt
---> Running in e7870d2d64c6
---> 1a2a81e69417
Removing intermediate container e7870d2d64c6
Successfully built 1a2a81e69417
[root@nod test]# docker run -d --name test2 test:v2.0
a870f33afc43f01ed1f0adcaaa118238422e9e094d573e7fd5ffb396a55df440
#可以创建出自管理的数据卷
[root@nod test]# docker volume ls
DRIVER VOLUME NAME
local df6e1838a9e7166e6c9445e2bcfd210d3e676ea971bb7931ea712f793138de38
#删除同时把数据卷删掉
[root@nod test]# docker rm -f -v a870f33afc43
a870f33afc43
[root@nod test]# docker volume ls
DRIVER VOLUME NAME
Bind-mount Volume
绑定卷,告诉主机目录和docker绑定的目录,使用-v参数
Union Volume(联合卷)
两个容器之间共享某个目录
方法一:两个容器使用宿主机的同一个目录
[root@nod test]# docker run --name test1 -v /data:/data -d test:v1.0
0bfa0fe5ea488a3a7f8ec3c46bac7d48acc3cb0b1f8ffa75d5ef699666235b66
[root@nod test]# docker run --name test2 -v /data:/data -d test:v1.0
4cd18b83c7093f3b05cbd37b1f8db07564d0f11d3e46b6742439ca7f9671c638
[root@nod test]# docker run --name test1 -v /data:/data -d test:v1.0
0bfa0fe5ea488a3a7f8ec3c46bac7d48acc3cb0b1f8ffa75d5ef699666235b66
[root@nod test]# docker run --name test2 -v /data:/data -d test:v1.0
4cd18b83c7093f3b05cbd37b1f8db07564d0f11d3e46b6742439ca7f9671c638
#test1容器情况
[root@nod test]# docker exec -it test1 /bin/bash
[root@0bfa0fe5ea48 /]# ls
bin dev home lib64 media opt root sbin sys usr
data etc lib lost+found mnt proc run srv tmp var
[root@0bfa0fe5ea48 /]# cd /data
[root@0bfa0fe5ea48 data]# touch wangxxx
[root@0bfa0fe5ea48 data]# exit
exit
#test2容器情况
[root@nod test]# docker exec -it test2 /bin/bash
[root@4cd18b83c709 /]# cd /data
[root@4cd18b83c709 data]# ls
ca_download config database es-data jenkins job_logs oracle psc redis registry secretkey wangxxx
[root@4cd18b83c709 data]#
#宿主机情况
[root@nod test]# cd /data
[root@nod data]# ll
total 12
drwxr-xr-x 2 root root 6 May 17 2019 ca_download
drwxr-xr-x 2 10000 10000 6 May 17 2019 config
drwx------ 19 polkitd input 4096 Jul 5 2019 database
drwxr-xr-x 3 es elasticsearch 19 May 4 2019 es-data
drwxr-xr-x 11 jenkins jenkins 4096 Dec 4 05:26 jenkins
drwxr-xr-x 2 10000 10000 6 May 17 2019 job_logs
drwxrwxr-x 6 oracle oinstall 79 Jul 10 2019 oracle
drwxr-xr-x 2 root root 6 May 17 2019 psc
drwxr-xr-x 2 polkitd root 22 Jul 5 2019 redis
drwxr-xr-x 3 10000 10000 20 May 17 2019 registry
-rw------- 1 10000 10000 16 May 17 2019 secretkey
-rw-r--r-- 1 root root 0 Dec 6 15:00 wangxxx
[root@nod data]#
方法二:
使用的容器需要拥有自管理(Docker-managed Volume)卷功能,不然没法使用。
[root@nod volumes]# docker run --name test2 -d test:v2.0
7787df2ba9a75b53f57bbd3122dcf253d3167ff0e64e9d3fbd5a707f77150a4e
[root@nod volumes]# ls
f439135caedaf77a085c26aeef0b503854f03e408bc29e79ba257301fc37b848
[root@nod volumes]# docker run --name test22 -d --volumes-from test2 test:v2.0
72d671d8d2f43f41b8747fc58f2c0e602807f733d599f671d30ce756ed322e2c
3、存储驱动
Docker存储驱动(storage driver)是Docker的核心组件,它是Docker实现分成镜像的基础
1、device mapper(DM):性能和稳定性存在问题,不推荐生产环境使用
2、btrfs:社区实现了btrfs driver,稳定性和性能存在问题
3、overlayfs:内核3.18 overlayfs进入主线,性能和稳定性优异,第一选择。
mount -t overlay overlay -olowerdir=./low,upperdir=./upper,worddir=./work .merged