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 实现分层镜像的基础
- device mapper (DM) : 性能和稳定性存在问题, 不推荐生产环境使用
- btrfs: 是社区实现的, 但稳定性和性能存在些问题
- 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) 编辑 收藏 举报