描述
正式的Docker文档通常不是很有用,并且即使阅读了部分内容后,很多情况仍然不清楚。
有很多事情尚不清楚,但是这个问题我只想针对这些问题:
运行docker volume create
时:
-司机
--opt设备
--opt类型
当我运行docker volume create --driver local --opt device=:/var/www/html/app --opt type=volume volumename
时,我实际上得到了一个音量:
$docker volume inspect customvolume`
[
{
"CreatedAt": "2020-08-03T09:28:10Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/customvolume/_data",
"Name": "customvolume",
"Options": {
"device": ":/var/www/html/customfolder",
"type": "volume"
},
"Scope": "local"
}
]尝试挂载此新卷:
docker run --name test-with-volume \
--mount source=customvolume,target=/var/www/html/app77' \
my-app-only:latest
错误: Error response from daemon: error while mounting
volume '/var/lib/docker/volumes/customvolume/_data': failed to
mount local volume: mount :/var/www/html/customfolder:/var/lib/docker/volumes/customvolume/_data: no such device.
问题显然,这些选项使您可以执行一些意外操作,我能够在自定义位置创建
volume
卷,但是该卷不可安装。type
的选项是什么(每个都有不同的解释):当使用docker volume create
时,我不清楚。docker run --mount
文档讨论了volume, bind, tmp
,但是在docker volume create
上,它们仅显示示例,它们是tmpfs,btrfs,nfs。device
?我认为这可用于在源主机上为卷类型(也称为命名卷)创建 自定义位置(类似于如何绑定(bind)绑定(bind)安装)
我以为我可以使用“建议的命名卷方式,包括自定义文件夹位置”代替主机挂载(绑定(bind)挂载)。
我认为混淆在于
docker run --mount
与docker volume create
似乎不一致,因为Docker文档的质量还不清楚
最佳答案
数据主要有两类-持久性数据和非持久性数据。
持久性是您需要保留的数据。像;客户记录,财务数据,研究结果,审计日志,甚至某些类型的应用程序日志数据。非永久性是您不需要保留的数据。
两者都很重要,并且Docker为两者提供了解决方案。
为了处理非持久性数据,每个Docker容器都有自己的非持久性存储。这是为每个容器自动创建的,并与容器的生命周期紧密相关。结果,删除容器将删除存储及其上的任何数据。
为了处理持久数据,容器需要将其存储在卷中。卷是独立的对象,其生命周期与容器分离。这意味着您可以独立创建和管理卷,并且卷不依赖于任何容器的生命周期。最终结果是,您可以删除使用某个卷的容器,而该卷不会被删除。
该本地存储可写层由存储驱动程序(不要与卷驱动程序混淆)在每个Docker主机上进行管理。如果您要在Linux上的生产环境中运行Docker,则需要确保将正确的存储驱动程序与Docker主机上的Linux发行版相匹配。使用以下列表作为指导:
运行Docker 17.06或更高版本的RHEL版本。使用devicemapper
旧版本的驱动程序。这适用于Oracle Linux和其他
红帽相关的上下游发行版。
内核或更高版本,应使用overlay2。
默认情况下,Docker使用内置的本地驱动程序创建新卷。顾名思义,使用本地驱动程序创建的卷仅可用于与该卷位于同一节点上的容器。您可以使用-d标志来指定其他驱动程序。第三方卷驱动程序可作为插件使用。这些为Docker提供了无缝访问外部存储系统(例如云存储服务)和本地存储系统(包括SAN或NAS)的功能。
$ docker volume inspect myvol
[
{
"CreatedAt": "2020-05-02T17:44:34Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvol/_data",
"Name": "myvol",
"Options": {},
"Scope": "local"
}
]
请注意,驱动程序和范围都是本地的。这意味着该卷是使用本地驱动程序创建的,并且仅可用于该Docker主机上的容器。 Mountpoint属性告诉我们该卷在Docker主机文件系统中的何处。与绑定(bind)挂载
version: '3.7'
services:
maria_db:
image: mariadb:10.4.13
environment:
MYSQL_ROOT_PASSWORD: Test123@123
MYSQL_DATABASE: database
ports:
- 3306:3306
volumes:
- /etc/localtime:/etc/localtime:ro
- ./data_mariadb/:/var/lib/mysql/
与卷挂接version: "3.8"
services:
web:
image: mariadb:10.4.13
volumes:
- type: volume
source: dbdata
target: /var/lib/mysql/
volumes:
dbdata:
绑定(bind)安装说明自Docker诞生以来,绑定(bind)挂载就已经存在。与卷相比,绑定(bind)安装的功能有限。使用绑定(bind)安装时,主机上的文件或目录将安装到容器中。文件或目录由主机上的完整或相对路径引用。相比之下,当您使用卷时,将在主机上Docker的存储目录中创建一个新目录,并且Docker管理该目录的内容。
tmpfs挂载说明
卷和绑定(bind)安装使您可以在主机和容器之间共享文件,以便即使容器停止后也可以保留数据。如果您在Linux上运行Docker,则还有第三种选择:tmpfs挂载。当您创建带有tmpfs挂载的容器时,该容器可以在该容器的可写层之外创建文件。与卷和绑定(bind)挂载相反,tmpfs挂载是临时的,仅持久保存在主机内存中。当容器停止时,tmpfs挂载将被删除,并且在那里写入的文件将不会保留。
卷说明
卷是用于持久化由Docker容器生成和使用的数据的首选机制。尽管绑定(bind)挂载取决于主机的目录结构,但是卷完全由Docker管理。
关于docker - Docker卷-创建选项(驱动程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63227362/