docker的数据持久化

注意到Harbor项目, 将Harbor容器删除后, 上传到Harbor的项目依然存在

数据持久化

docker 写时复制的特点

所以这么看来, docker有一个很明显的问题, 关闭并启动容器, 其数据不受影响, 但是删除docker 容器, 则其改变将会全部消失

所以有了数据卷

Layer表示可写层, 下面表示只读层

数据分为了两部分, 一部分写入读写层, 一部分写入数据卷, 做数据持久化. 有的数据并不需要做数据持久化, 重要数据(如Mysql 才需要做数据持久化)

wordpress 在html目录创建一个文件, 删除容器

find /var/lib/docker/volums/ -name xxhf
#可以查询到
#但是在其他目录下, 是不会做持久化的

实现数据持久化(挂载)

Dockerfile文件写 VOLUME vDir

Dockerfile 文件中关键字VOLUME 可以有多个

vDir 会与当前物理机中的/var/lib/docker/volumes/随机目录/_data  做绑定

随机目录可以, docker inspect nginx 查看Mounts ,是双向的, 在物理机上的此目录写入内容, 则容器也是可以看到的

如果在Dockerfile中没有声明VOLUME关键字, 怎么做数据持久化(挂载)呢

mkdir /data
docker run --name nginx -v /data:/root/data -d joe/web:v0.3
cd /data #并创建一个文件 写入 hello kiki
docker exec -it nginx /bin/bash
cd /root/data/
cat kiki # 查看kiki文件的内容

优先级问题

如果Dockerfile 中和 docker run -v 中都指定的是同一个目录, 则 以-v 指定的目录进行持久化

多容器共享一个数据目录

docker run -it --name nginx1 --volumes-from nginx joe/web:v0.3
# 会将nginx 持久化的数据 共享至 nginx1

存储驱动

docker的存储驱动(storage driver) 是Docker 的核心组件, 它是Docker 实现分层镜像的基础

  1. device mapper (DM) : 性能和稳定性存在问题, 不推荐生产环境使用
  2. btrfs: 是社区实现的, 但稳定性和性能存在些问题
  3. overlayfs: 内核3.18 overlayfs 进入主线, 性能和稳定性优异, 优先选择

将存储驱动改成overlay

echo "overlay" > /etc/modules-load.d/overlay.conf
cat /proc/modules | grep overlay
reboot
vim /etc/systemd/system/docker.service
	--storage-driver=overlay

overlayfs实现方式

linux 内核在底层实现->

图片来源于网络

container mount 用户的展现层
container layer 可写层
image layer	    只读层
cd /var && mkdir overlay && cd overlay 
mkdir low  upper work merged
# work - 缓存路径
mount -t overlay overlay -olowerdir=./low,upperdir=./upper,workdir=./work ./merged

# overlay on /var/overlay/merged type overlay (rw,relatime,lowerdir=./low,upperdir=./upper,workdir=./work)
# 可以看到overlay 挂载到了merged

[root@localhost overlay]# cd low && touch bob.html && echo "hahaha" > bob.html && cd ..
[root@localhost overlay]# cd upper/ && touch bob1 && echo "hihihi" > bob1 && cd ..
[root@localhost overlay]# cd merged/ && ls
# bob1  bob.html
[root@localhost merged]# cat bob1 
hihihi
[root@localhost merged]# cat bob.html 
hahaha
#镜像层和可写层文件 都会映射到用户展现层

[root@localhost merged]# echo "wawawa" >> bob.html 
[root@localhost merged]# cat bob.html 
hahaha
wawawa
[root@localhost merged]# cd ..
[root@localhost overlay]# cat low/bob.html 
hahaha
#镜像层的数据是只读的

[root@localhost merged]# echo "wowowo" >> bob1
[root@localhost overlay]# cat upper/bob
bob1      bob.html  
[root@localhost overlay]# cat upper/bob1
hihihi
wowowo
[root@localhost overlay]# cat upper/bob.html 
hahaha
wawawa
# 写时复制

[root@localhost merged]# rm -rf ./*
[root@localhost merged]# cd ..
[root@localhost overlay]# cd upper/
[root@localhost upper]# ll
total 0
c--------- 1 root root 0, 0 Feb 12 09:53 bob.html
# c类型 表示此文件隐藏在此目录
[root@localhost overlay]# ll low/
total 4
-rw-r--r-- 1 root root 7 Feb 12 09:39 bob.html
# 镜像层是只读的

[root@localhost overlay]# rm -rf upper/bob.html 
[root@localhost overlay]# ll merged/
total 4
-rw-r--r-- 1 root root 7 Feb 12 09:39 bob.html
# 删除c文件, 在merged 再次出现了

posted on 2022-02-12 23:37  joe_HelloWorld  阅读(172)  评论(0编辑  收藏  举报

导航