为什么需要数据卷

docker镜像是分层的,docker镜像是由多个只读层(read-only layer)叠加而成。当我们运行一个容器时,docker加载只读的镜像,和在最顶层加载一个读写层(read-write layer)。在一个运行的容器中修改文件,该文件从只读层复制到最顶部的读写层,修改是作用在读写层的新文件,没有作用到只读层的原文件,读写层隐藏了下层的原文件,原文件仍然保留着原来的样子。

当容器被删除后,基于相同的镜像创建新的容器,这时候是一个新的读写层,原来位于旧读写层的修改已经被丢弃了。

J9YlTJ.png

为了持久化数据在容器间共享数据,docker提供了数据卷(Volumn)。简单来说,数据卷是独立于容器,存在于宿主文件系统中的目录或文件。

Jiv75R.png

Docker不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器挂载的数据卷进行处理。

使用方法

  • 创建一个数据卷

    $ docker volume create vol
  • 查看所有数据卷

     $ docker volume ls
     DRIVER              VOLUME NAME
     local               vol
  • 查看指定的数据卷信息

    $ docker volume inspect vol
    [
     {
         "CreatedAt": "2020-04-16T00:06:39Z",
         "Driver": "local",
         "Labels": {},
         "Mountpoint": "/var/lib/docker/volumes/vol/_data",
         "Name": "vol",
         "Options": {},
         "Scope": "local"
     }
     ]
  • 使用--mount将数据卷挂载到容器里

    $ docker run --rm --name web --mount source=vol,target=/app -it ubuntu bin/bash
  • 挂载一个主机目录作为数据卷

    使用--mount可以挂载一个宿主机的目录到容器中。

    $ docker run --rm --name web --mount type=bind,source=/tmp,target=/tmp -it ubuntu bin/bash

    可以看到在容器和宿主机分别创建文件,文件在容器和宿主机都是可见的。

    J9IBfs.jpg
    J9I0Yj.jpg

Last modification:April 16th, 2020 at 08:29 am
如果觉得我的文章对你有用,请尽情赞赏 🐶