Docker 容器产生的数据如果不备份,那么当容器实例删除后,容器内的数据也会被删除,因此在创建容器时需要做数据持久化( 类似 Redis 的 RDB 与 AFO,用于备份 + 持久化容器内的数据到本地主机目录 )
主要分为 Data Volume 与 Bind Mount 两种方式
特点:
数据卷具有完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷
一个容器可以进行多个目录的挂载,因此 -v 参数可以是多个。当挂载命令中的文件夹不存在时,在执行操作时会自动创建
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止(容器停止后,修改本地挂载目录下的文件后,将在下一次容器启动时进行数据同步)
Data Volume:
如果是 Windows 环境,该方法创建的挂载目录无法被访问
操作命令:
docker run -it -v /宿主机路径:/容器内目录 —privileged=true 镜像名
通过 docker inspect 操作查看挂载是否成功
操作案例:
新建ubuntu容器,将 tmp 文件夹与本地主机进行挂载,在容器内创建文本文件后返回本地主机,查看其备份情况
只读模式:
默认情况下创建数据卷具有双向读写权限,当需要限制容器实例只能读取不能写时需要添加额外参数 ro
操作命令: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro —privileged=true 镜像名
卷的继承:
容器之间可以继承数据卷关系,子容器拥有和父容器一样的数据卷映射,类似与 Java 的继承
当子容器创建后会进行一次数据同步,确保创建后的子容器在数据卷目录中数据与父容器一致
操作命令:docker run -it —volumes-from 父容器ID —privileged=true 镜像
Bind Mount:
和 Data Volume 相比唯一的优点在于,如果是 Windows 环境可以指定为本地目录做数据卷挂载
操作语句:
docker run -it -v /宿主机绝对路径:/容器内目录 镜像名
注意事项:
如果 Window 版 DockerDesktop 使用的不是 WSL 2 引擎,在指定宿主机绝对路径时需要在设置中添加文件路径才能正常使用
远程挂载:
数据卷挂载默认都是在本地,如果需要在不同机器上做 Data Volume 需要使用Docker插件,且目标主机可以 Ping 通
插件下载:
docker plugin install --grant-all-permissions vieux/sshfs
操作命令:
第一步:在容器主机上指定需要挂载的目标主机数据卷路径(必须是一个已创建的文件目录),指定的用户需要有能访问对应目录的权限
docker volume create --driver vieux/sshfs \
-o sshcmd=目标主机SSH用户名@目标主机IP:目标目录 \
-o password=目标主机SSH密码 \
volume名称
第二步:创建容器挂载 volume
docker run -it -v 第一步的volume名称:/容器内路径 镜像ID sh
案例演示:
使用两台机器(192.168.135.134、192.168.135.136)进行演示,指定的用户均为 root 用户