docker-volume数据覆盖丢失问题
还在为docker容器卷丢失数据、数据不同步而烦恼吗?
·
目录
若容器卷是非空的,映射到的内部容器目录也是非空的(或空),会复制进去
总结: 前两种的创建方式类似linux中的mount是直接挂载(称为绑定数据卷),原本有的就是有,对两边进行了操作后才会开始同步
问题描述:
当使用容器卷时是否会存在数据丢失、覆盖的问题?
持久卷概念:
1. 数据存在容器内,删容器即销毁全部数据
2. 要保留的数据(数据持久化),需存储在容器外
容器卷的两种方式:
-
若容器卷是空的,映射到内部容器是非空情况,两边会清空
-
操作示例
-
1. 先确保容器卷内是空的 root@debian:~/test# ls root@debian:~/test# pwd /root/test 2. 先不使用容器卷创建 root@debian:~/test# docker run -itd --name test1 go-tools:1.19 028e4cdd88b2051234cb33853001fef1431ac08b092dd0b96597e62100d7675b 3. 确保容器下的该目录是存在文件的 root@debian:~/test# docker exec -it test1 ls CONTRIBUTING.md README.md go.sum lint.go misc LICENSE go.mod golint lint_test.go testdata 4. 删除测试容器 root@debian:~/test# docker rm -f test1 test1 5. 再次创建测试容器使用容器卷 root@debian:~/test# docker run -itd --name test1 -v /root/test/:/go/src/github.com/golang/lint/ go-tools:1.19 0c6d404eea6f2b4ad8b7e48389b50efcf1e2c5223a3fed407a1f82e9c4e970bd 6. 发现宿主机的挂载点和容器内的挂载点都会清空 root@debian:~/test# ls root@debian:~/test# docker exec -it test1 ls 7. 后期创建数据是会同步的 root@debian:~/test# touch aa root@debian:~/test# docker exec -it test1 ls aa
-
若容器卷是非空的,映射到的内部容器目录也是非空的(或空),会复制进去
-
操作示例
1. 准备容器卷并创建测试文件
root@debian:~/test# ls
aa
2. 运行测试容器使用容器卷
root@debian:~/test# docker run -itd --name test1 -v /root/test/:/go/src/github.com/golang/lint/ go-tools:1.19
391fdb84ebce022e23181e1f712f559b136d209ca8fc1b3d70a6bcac5ef47d5b
3. 本地文件正常
root@debian:~/test# ls
aa
4. 容器内的所有文件都清空,并获取到宿主机挂载出来的文件
root@debian:~/test# docker exec -it test1 ls
aa
总结: 前两种的创建方式类似linux中的mount是直接挂载(称为绑定数据卷),原本有的就是有,对两边进行了操作后才会开始同步
解决办法:
目前只能通过创建数据卷,再使用数据卷的方式来解决
-
操作过程
1. 创建数据卷
root@debian:~/test# docker volume create test
test
2. 查看数据卷信息
root@debian:~/test# docker volume inspect test
[
{
"CreatedAt": "2022-09-09T10:21:41+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": {},
"Scope": "local"
}
]
3. 查看数据卷文件(目前为空)
root@debian:~/test# ls /var/lib/docker/volumes/test/_data
4. 运行容器使用数据卷
root@debian:~/test# docker run -itd --name test1 -v test:/go/src/github.com/golang/lint/ go-tools:1.19
c8e9293cda3120734709ecd106a9fb4c8b91ab4af78a2254b3070b205041bb13
5. 查看数据卷目录,成功拿到容器内的原本数据
root@debian:~/test# ls /var/lib/docker/volumes/test/_data
CONTRIBUTING.md LICENSE README.md go.mod go.sum golint lint.go lint_test.go misc testdata
6. 容器内的元数据也不会丢失
root@debian:~/test# docker exec -it test1 ls
CONTRIBUTING.md README.md go.sum lint.go misc
LICENSE go.mod golint lint_test.go testdata
7. 测试数据卷同步情况
root@debian:/var/lib/docker/volumes/test/_data# touch fuck
root@debian:/var/lib/docker/volumes/test/_data# docker exec -it test1 ls
CONTRIBUTING.md README.md go.mod golint lint_test.go testdata
LICENSE fuck go.sum lint.go misc
# docker中volumes默认目录在/var/lib/docker/volumes/
若要启动容器时映射到指定目录,还可以把/var/lib/docker/volumes/test/_data挂个软连接出来
by:devops_锋
更多推荐
已为社区贡献1条内容
所有评论(0)