前言

在 docker 中,如果没有挂载数据卷,默认数据都是保存在容器里面的,如果容器被删除,数据就没了。

数据卷

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用

  • 对数据卷的修改会立马生效

  • 对数据卷的更新,不会影响镜像

  • 数据卷默认会一直存在,即使容器被删除

创建一个数据卷

docker volume  create   dbdata

可以看到在 data-root(默认是/var/lib/docker)下的 volumes 目录就可以看到有一个目录生成,这个就是数据卷。

查看数据卷

docker volume  ls

查看数据卷详情

docker volume inspect  dbdata

删除指定的数据卷

docker  volume  rm dbdata

清理所有无主的数据卷

 docker volume prune

上面创建的数据卷,没有跟容器关联,需要在容器创建的时候,使用 docker run 指定数据卷

docker  run -itd    -v  dbdata:/data       alpine:latest   /bin/sh

如果这个数据卷没有在,也会自动创建这个数据卷的

也可不指定名称:

docker    run -itd   -v  /data   alpine:latest  /bin/sh

这时候生成的目录的名称就不是指定的名字,而是一长串 ID

在 Dockerfile 创建的时候也可以使用 VOLUME 这个指令创建数据卷。

挂载主机目录作为数据卷

docker run 的时候 -v 参数指定的是本地的绝对路径,就是挂载本地的目录到容器里面使用。

docker   run    -itd     -v   /data/dbdata:/data    alpine:latest  /bin/sh

如果本地目录不存在,会自动创建。这个挂载的目录是不受 docker volume 管理的,因此就算是 docker rm -v 也不会删除这个目录里面的数据,因此,在实际中一般是用这种方式,将我们的代码目录挂载到容器里面去运行。

默认容器里面对目录是有读写权限,如果只需要指定可以加上:ro 的选项即可:

docker   run    -itd     -v   /data/dbdata:/data:ro    alpine:latest  /bin/sh

除了目录可以挂载,单个文件也是可以挂载的,挂载后,容器里面对应的文件是只读的,写操作之后在宿主机上操作

docker   run    -itd     -v   /data/dbdata:/data    -v  /etc/my.cnf:/etc/my.cnf   alpine:latest  /bin/sh

数据卷容器

如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

创建数据卷容器

docker  run -itd   -v   /data/dbdata:/data     -v  /data/dbdata1:/data1    --name dbdata  alpine:latest  /bin/sh

使用数据卷容器

docker   run  -itd   --volumes-from   dbdata     apline:latest   /bin/sh