目录

问题描述:

持久卷概念:

容器卷的两种方式:

若容器卷是空的,映射到内部容器是非空情况,两边会清空

若容器卷是非空的,映射到的内部容器目录也是非空的(或空),会复制进去

总结: 前两种的创建方式类似linux中的mount是直接挂载(称为绑定数据卷),原本有的就是有,对两边进行了操作后才会开始同步

解决办法:

目前只能通过创建数据卷,再使用数据卷的方式来解决


问题描述:

当使用容器卷时是否会存在数据丢失、覆盖的问题?

持久卷概念:

1. 数据存在容器内,删容器即销毁全部数据

2. 要保留的数据(数据持久化),需存储在容器外

容器卷的两种方式:

  1. 若容器卷是空的,映射到内部容器是非空情况,两边会清空

  • 操作示例

  • 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. 若容器卷是非空的,映射到的内部容器目录也是非空的(或空),会复制进去

  • 操作示例

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_锋

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐