为什么需要数据卷
docker镜像是分层的,docker镜像是由多个只读层(read-only layer)
叠加而成。当我们运行一个容器时,docker加载只读的镜像,和在最顶层加载一个读写层(read-write layer)
。在一个运行的容器中修改文件,该文件从只读层复制
到最顶部的读写层,修改是作用在读写层的新文件,没有作用到只读层的原文件,读写层隐藏了下层的原文件,原文件仍然保留着原来的样子。
当容器被删除后,基于相同的镜像创建新的容器,这时候是一个新的读写层,原来位于旧读写层的修改已经被丢弃了。
为了持久化数据
和在容器间共享数据
,docker提供了数据卷(Volumn)
。简单来说,数据卷是独立于容器,存在于宿主文件系统中的目录或文件。
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
可以看到在容器和宿主机分别创建文件,文件在容器和宿主机都是可见的。