Docker容器数据卷是什么
先来看看Docker的理念:
- 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的。
- 容器之间希望有可能共享数据。
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据在docker中我们使用卷。(一句话:就是想在docker和宿主机之间实现数据共享,数据持久化。类似于redis中的RDB、AOF)
Docker容器数据卷能干什么
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。(实现容器的持久化、容器之间的继承 + 数据共享)
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
Docker容器卷和宿主机互联
可以将docker容器中的数据保存到宿主机的磁盘中如下
docker run -it --privileged=true -v 宿主机绝对路经目录:/容器内目录 镜像名 (默认可读可写)
docker run -it --privileged=true -v 宿主机绝对路经目录:/容器内目录:ro 镜像名 (只能可读) ro:read only
docker run -it --privileged=true -v 宿主机绝对路经目录:/容器内目录:wo 镜像名 (只能可写) wo:write only
参数解释:
--privileged=true:打开root的权限
-v:可以指定多个路径 (表示绑定一组路径)
例1:
sudo docker run -it --privileged=true --name=u1 -v /tmp/host1_data:/tmp/docker1_data ubuntu /bin/bash
说明:如果宿主机和docker中没有指定的各自的文件夹,执行命令后会自动创建相应的文件夹。
运行一个带容器卷存储功能的容器实例的特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效。爽(实时)
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直此需要没有容器使用它为止
实例操作
- 创建一个名字为u1的,带容器卷存储功能的容器实例
sudo docker run -it --privileged=true --name=u1 -v /tmp/host_data:/tmp/docker_data ubuntu /bin/bash
从上图可以看到进入到了新创建的容器中
- 进入到容器中/tmp/docker_data目录下创建一个文档
cd /tmp/docker_data #进入到目标目录
touch docker.txt #创建名为docker.txt的文件
- 进入到宿主机/tmp/host_data目录下查看
cd /tmp/host_data #进入到目标目录
ll #在该目录下查看文件
可以看到在在容器中创建的docker.txt同步到了宿主机的/tmp/host_data文件夹中;
同理,在宿主机该文件夹中创建host.txt文件,也会同步到容器的/tmp/docker_data文件夹中,下图进行验证
创建host.txt文件:
在容器中查看:
从上图可以看到在宿主机创建的文件也同步到了容器中。
Docker容器卷的继承和共享
docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
创建了一个名为u2的容器,并且共享u1的容器数据卷,如下图所示
在创建u2容器后直接进入/tmp/docker_data文件夹,可以看到和容器u1中数据卷的数据相同,达到继承和共享的目的。
以上如有错误欢迎指正,如果帮到您请点赞加收藏哦!