2. volume解惑

简介: Volume解惑docker是一个容器,在容器中执行的所有操作都会在容器exit后丢失,为了保证数据的持久化,docker提出了volume的概念,目的是将容器中的数据持久化到宿主机中。docker可以使用两种方法来创建volume,一种是创建容器时使用-v参数,另一种是创建镜像的时候在Dockerfile文件中设置volume。

Volume解惑

docker是一个容器,在容器中执行的所有操作都会在容器exit后丢失,为了保证数据的持久化,docker提出了volume的概念,目的是将容器中的数据持久化到宿主机中。
docker可以使用两种方法来创建volume,一种是创建容器时使用-v参数,另一种是创建镜像的时候在Dockerfile文件中设置volume。

下面来看看这两种方式的区别:

1. 在Dockerfile创建Volume

Dockerfile

FROM daocloud.io/centos:latest
//这里指定要在容器中挂载test1和test2目录,这里有一点需要注意一定要使用双引号
VOLUME ["/test1","/test2"]
CMD /bin/bash

编译Dockerfile

mkdir test
mv Dockerfile test/
cd test
docker build . -t test

从上一步生成的镜像中创建一个容器:

//这里创建一个名为test1的容器
docker run -it --name test-container test

查看容器中生成的test1和test2目录与物理磁盘的对应关系

docker inspect test-container

//运行结果如下:其中Source指向的就是宿主机的目录
....
"Mounts": [
    {
        "Type": "volume",
        "Name": "01c6e11009f3a1382dc71715a2ecc810e6854a817fbaf47887ae361e1444135c",
        "Source": "/var/lib/docker/volumes/01c6e11009f3a1382dc71715a2ecc810e6854a817fbaf47887ae361e1444135c/_data",
        "Destination": "/test1",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "3f86f47f6dac9a3bf1a0967aee3f424db27c4dd5d48bd746b7692592085f0f25",
        "Source": "/var/lib/docker/volumes/3f86f47f6dac9a3bf1a0967aee3f424db27c4dd5d48bd746b7692592085f0f25/_data",
        "Destination": "/test2",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
.....

2. 使用-v参数来创建volume

Dockerfile

FROM daocloud.io/centos:latest
CMD /bin/bash

编译Dockerfile

mkdir test
mv Dockerfile test/
cd test
docker build . -t test-new

从上一步生成的镜像创建容器:

docker run -it -v /test1 -v /test2 --name test-container-new test-new

查看容器中生成的test1和test2目录与物理磁盘的对应关系

docker inspect test-container-new

//运行结果如下:其中Source指向的就是宿主机的目录
....
"Mounts": [
    {
        "Type": "volume",
        "Name": "2c8d289d74801a10f2ec283e83412541009d9fb7d40aec161e8c363b17d6e822",
        "Source": "/var/lib/docker/volumes/2c8d289d74801a10f2ec283e83412541009d9fb7d40aec161e8c363b17d6e822/_data",
        "Destination": "/test1",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "a0905219edf3ad76be39065598f5443d9230f72a8e2e650d98c4f982b87d952d",
        "Source": "/var/lib/docker/volumes/a0905219edf3ad76be39065598f5443d9230f72a8e2e650d98c4f982b87d952d/_data",
        "Destination": "/test2",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
.....

通过两种方式发现虽然都在宿主机上生成了持久化目录,但是宿主机的目录都是随机的

-v参数高级用法,在宿主机生成自定义持久目录

从上一步生成的镜像创建容器:

docker run -it -v /test1:/test1 -v /test2:/test2 --name test-container-new-2 test-new

查看容器中生成的test1和test2目录与物理磁盘的对应关系

docker inspect  test-container-new-2 

//运行结果如下:其中Source指向的就是宿主机的目录
....
"Mounts": [
    {
        "Type": "bind",
        "Source": "/test1",
        "Destination": "/test1",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "bind",
        "Source": "/test2",
        "Destination": "/test2",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
.....

两种创建volume方法的总结

创建Volume的两种方式 随机目录持久化 指定目录持久化
Dokerfile VOLUME 可以实现 不支持
-v参数 可以实现 支持
目录
相关文章
|
1天前
|
缓存 应用服务中间件 nginx
【赵渝强老师】什么是Docker File?
Dockerfile 是一个文本文件,包含一系列命令,用于构建 Docker 镜像。通过 `docker build` 命令,可以根据 Dockerfile 中的指令逐层构建镜像。本文介绍了 Dockerfile 的基本概念、示例及详细结构,帮助用户更好地理解和使用 Dockerfile 进行镜像构建。
|
2月前
|
存储 Kubernetes 开发工具
Kerbernetes的volume应用进阶
关于Kubernetes中持久卷(PV)和持久卷声明(PVC)应用进阶的教程,涵盖了PV和PVC的基本概念、存储访问模式、回收策略、生命周期,以及如何通过实战案例在Kubernetes集群中使用NFS和动态供给创建和管理持久化存储。
25 1
Kerbernetes的volume应用进阶
|
2月前
|
存储 Kubernetes 开发工具
Kerbernetes的volume基础应用
关于Kubernetes存储卷(Volume)基础应用的教程,涵盖了存储卷的概述、Kubernetes内置存储卷类型、使用注意事项、本地存储卷案例、临时存储卷案例、网络存储案例以及其他存储案例,并提供了相应的命令和配置文件示例。
45 0
Kerbernetes的volume基础应用
|
5月前
|
Linux 存储
24. 【Linux教程】挂载
24. 【Linux教程】挂载
46 0
|
6月前
|
JavaScript 关系型数据库 MySQL
一文详解Docker数据卷(volume)
一文详解Docker数据卷(volume)
|
11月前
|
存储 Kubernetes API
k8s教程(Volume篇)-动态存储管理案例(GlusterFS)
k8s教程(Volume篇)-动态存储管理案例(GlusterFS)
231 0
|
11月前
|
存储 Kubernetes 虚拟化
k8s教程(Volume篇)-总结
k8s教程(Volume篇)-总结
94 0
|
存储 Linux 应用服务中间件
Docker Volume 看这一篇就够了
Docker Volume 看这一篇就够了
Docker Volume 看这一篇就够了
|
容器
从源码解析MogDB/openGauss容器制作教程(三)
从源码解析MogDB/openGauss容器制作教程
376 0
|
容器
从源码解析MogDB/openGauss容器制作教程(二)
从源码解析MogDB/openGauss容器制作教程
231 0