若发现文章有误,欢迎提出宝贵建议,望不吝指教,感谢!
运行环境
- Ubuntu 21.04
- Docker 20.10.7
一、Docker Volumes 相关概述
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
卷的特点:
- 易备份或迁移
- 适用于Linux和Windows容器
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 可在多个容器之间更安全的共享
- 数据卷的生命周期一直持续到没有容器使用它为止
(图片转自Docker官方)
1.1 Docker 容器与宿主机共用卷案例
首先根据一个镜像创建容器来进行测试,笔者这里采用官方ubuntu的镜像
$ sudo docker pull ubuntu
创建新容器
标准语法:
$ docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
提示:-v参数就是-volumes(卷)的缩写
案例:
$ sudo docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=ubuntu_test ubuntu
进入容器后,宿主机另开一个终端,进行简单的测试
查看容器数据卷挂载情况
$ sudo docker inspect ubuntu_test
在输出的结果里查找Mounts
属性
比如这里就是之前配置过后的容器卷,默认的容器卷如下(为空):
1.2 容器卷配置
对于之前通过镜像绑定卷创建容器的命令,其实默认了一个配置,即对数据卷的读写权限
$ docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
补全配置后(后缀添加的:rw表示支持读和写):
$ docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
当需求为Docker容器只能读取宿主机的数据卷,而容器不能写时,则在后面指定为ro即可,标准语法如下:
$ docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
1.3 卷的继承和共享
基于之前的ubuntu_test
容器案例,我们现在创建一个容器ubuntu_child
来继承它的数据卷机制
标准语法:
$ sudo docker run -it --privileged=true --volumes-from 父类容器 --name 子容器名称 镜像
注:这里只是继承父容器