docker容器运行时,是有一个可写入层的,如果我们把容器运行时的数据写在可写入层,会有以下问题:
当容器停止运行时,写入的数据会丢失。你也很难将这些数据从容器中取出来给另外的应用程序使用。
容器的可写入层与宿主机是紧密耦合的。这些写入的数据在可以轻易地被删掉。
写入容器的可写入层需要一个存储驱动(storage driver)来管理文件系统。这个存储驱动通过linux内核提供了一个union filesystem。相比于数据卷(data volume),这种额外的抽象会降低性能。
Docker提供了3种方法将数据从Docker宿主机挂载(mount)到容器:
Volumes由Docker管理,存储在宿主机的某个地方(在linux上是/var/lib/docker/volumes/)。非Docker应用程序不能改动这一位置的数据。Volumes是Docker最好的数据持久化方法。
Bind mounts的数据可以存放在宿主机的任何地方。数据甚至可以是重要的系统文件或目录。非Docker应用程序可以改变这些数据。
tmpfs mounts的数据只存储在宿主机的内存中,不会写入到宿主机的文件系统。(可用来存放会过时的敏感数据)
1、数据卷Volumes
数据卷可以在容器之间共享和重用,且容器停止或删除后数据卷不受影响,且对数据卷的改动是立即生效的,更新数据卷之后不会影响镜像。
创建数据卷命令:
docker volume create my-volume
查看数据卷:
docker volume ls
查看指定数据卷的信息:
docker volume inspect my-volume
删除数据卷:
docker volume rm my-volume
清理无主的数据卷:
docker volume prune
2、挂载数据卷到容器
在docker run的时候,参数–mount默认情况下用来挂载volume。在一次docker run中可以挂载多个数据卷。
当然 -v也行,我们参考上篇文章启动私有仓库的命令:
docker run -d -v /data/registry:/var/lib/registry -p 5000:5000 --name myRegistry registry
如果是–mount的话,命令如下:
docker run -d --mount type=bind source=/data/registry,target=/var/lib/registry -p 5000:5000 --name myRegistry registry
-v会创建文件夹,–mount不会,无文件夹的话会报错。
type=bind表示以Bind mounts方式挂载数据卷,-v默认是以Bind mounts方式挂载数据卷,非Doc
ker应用程序可以更改数据。