在默认状况下,容器内全部文件都存储在可写容器层中,这意味着:nginx
Docker有两个容器选项能够在主机中存储文件,所以即便在容器中止以后文件仍然会存在:volumes和 bind mounts。在Linux上运行Docker,可使用tmpfs mount临时挂载。docker
不管哪一种方式,数据在容器内都是相同的。它做为目录或容器文件系统中的单个文件公开。安全
Volumes,Bind mounts和tmpfs 装载之间差别的简单方法是考虑数据在Docker主机上的位置。app
Volumes存储在由Docker(/var/lib/docker/volumes/在Linux上)管理的主机文件系统的一部分中。非Docker进程不该修改文件系统的这一部分。卷是在Docker中保留数据的最佳方式。性能
Bind mounts能够存储在主机系统的任何位置。它们甚至多是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程能够随时修改它们。code
tmpfs挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。blog
卷是在Docker容器和服务中持久保存数据的首选方法。卷的一些用例包括:进程
在多个运行容器之间共享数据。若是未显式建立它,则会在第一次将其装入容器时建立卷。当该容器中止或被移除时,该卷仍然存在。多个容器能够同时安装相同的卷,能够是读写也能够是只读。仅在您明确删除卷时才会删除卷。内存
当Docker主机不能保证具备给定的目录或文件结构时。卷可帮助您将Docker主机的配置与容器运行时分离。开发
若是要将容器的数据存储在远程主机或云提供程序上,而不是本地存储。
当您须要将数据从一个Docker主机备份,还原或迁移到另外一个Docker主机时,卷是更好的选择。您可使用卷中止容器,而后备份卷的目录(例如/var/lib/docker/volumes/
将配置文件从主机共享到容器。这就是Docker默认经过/etc/resolv.conf从主机安装到每一个容器中来为容器提供DNS解析的方式 。
在Docker主机上的开发环境和容器之间共享源代码或构建工件。例如,您能够将Maven target/ 目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器均可以访问重建的工件。
若是以这种方式使用Docker进行开发,您的生产Dockerfile会将生产就绪工件直接复制到映像中,而不是依赖于绑定装载。
当Docker主机的文件或目录结构保证与容器所需的绑定安装一致时。
若是将空卷装入容器中存在文件或目录的目录中,则会将这些文件或目录传播(复制)到卷中。一样,若是启动容器并指定尚不存在的卷,则会为您建立一个空卷。这是预先填充另外一个容器所需数据的好方法。
若是将绑定装载或非空卷装入容器中存在某些文件或目录的目录中,则装载会遮盖这些文件或目录,就像将文件保存到/mntLinux主机上而后安装USB驱动器进入/mnt。/mnt在卸载USB驱动器以前,USB驱动器的内容会遮挡内容。隐藏的文件不会被删除或更改,但在安装绑定装载或卷时没法访问。
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,能够提供不少有用的特性:
数据卷 能够在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即便容器被删除
注意:数据卷 的使用,相似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。
$ docker volume create my-vol
$ docker volume ls DRIVER VOLUME NAME local my-vol
$ docker volume inspect my-vol [ { "CreatedAt": "2019-05-19T08:22:09Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": null, "Scope": "local" } ]
在用 docker run 命令的时候,使用 -v和--mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中能够挂载多个 数据卷。
若是要指定数据卷的选项,则必须使用--mount。
--mount:由多个键值对组成,以逗号分隔,每一个键
注意:若是启动的容器不存在挂载卷的路径,Docker会自动建立。
$ docker run -d \ --name devtest \ -v myvol2:/app \ nginx:latest
$ docker run -d \ --name devtest \ --mount source=myvol2,target=/app \ nginx:latest
删除容器后,Docker数据卷仍然存在。
要自动删除匿名卷,须要使用--rm选项。例如,建立匿名/foo卷。删除容器后,Docker守护进程会删除/foo卷但不会删除awesome卷。
docker run --rm -v /foo -v awesome:/bar busybox top
docker volume prune