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应用程序可以更改数据。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐