Docker 容器产生的数据如果不备份,那么当容器实例删除后,容器内的数据也会被删除,因此在创建容器时需要做数据持久化( 类似 Redis 的 RDB 与 AFO,用于备份 + 持久化容器内的数据到本地主机目录 )
主要分为 Data Volume Bind Mount 两种方式

特点:

数据卷具有完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷
一个容器可以进行多个目录的挂载,因此 -v 参数可以是多个。当挂载命令中的文件夹不存在时,在执行操作时会自动创建

  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接实时生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止(容器停止后,修改本地挂载目录下的文件后,将在下一次容器启动时进行数据同步)

Data Volume:

如果是 Windows 环境,该方法创建的挂载目录无法被访问

操作命令:

docker run -it -v /宿主机路径:/容器内目录 —privileged=true 镜像名
通过 docker inspect 操作查看挂载是否成功

操作案例:

新建ubuntu容器,将 tmp 文件夹与本地主机进行挂载,在容器内创建文本文件后返回本地主机,查看其备份情况
image.png
image.png
image.png
image.png

只读模式:

默认情况下创建数据卷具有双向读写权限,当需要限制容器实例只能读取不能写时需要添加额外参数 ro
操作命令: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro —privileged=true 镜像名

image.png
image.png

卷的继承:

容器之间可以继承数据卷关系,子容器拥有和父容器一样的数据卷映射,类似与 Java 的继承
当子容器创建后会进行一次数据同步,确保创建后的子容器在数据卷目录中数据与父容器一致
操作命令:docker run -it —volumes-from 父容器ID —privileged=true 镜像
image.png
image.png


Bind Mount:

和 Data Volume 相比唯一的优点在于,如果是 Windows 环境可以指定为本地目录做数据卷挂载

操作语句:

docker run -it -v /宿主机绝对路径:/容器内目录 镜像名
image.png

注意事项:

如果 Window 版 DockerDesktop 使用的不是 WSL 2 引擎,在指定宿主机绝对路径时需要在设置中添加文件路径才能正常使用
image.png


远程挂载:

数据卷挂载默认都是在本地,如果需要在不同机器上做 Data Volume 需要使用Docker插件,且目标主机可以 Ping 通

插件下载:

  1. docker plugin install --grant-all-permissions vieux/sshfs

操作命令:

第一步:在容器主机上指定需要挂载的目标主机数据卷路径(必须是一个已创建的文件目录),指定的用户需要有能访问对应目录的权限

  1. docker volume create --driver vieux/sshfs \
  2. -o sshcmd=目标主机SSH用户名@目标主机IP:目标目录 \
  3. -o password=目标主机SSH密码 \
  4. volume名称
  1. 第二步:创建容器挂载 volume
  1. docker run -it -v 第一步的volume名称:/容器内路径 镜像ID sh

案例演示:

使用两台机器(192.168.135.134、192.168.135.136)进行演示,指定的用户均为 root 用户
image.png
image.png