Docker Volumes - 创建选项(驱动程序)

CvR*_*eon 1 docker dockerfile docker-compose

描述

Docker 官方文档通常不是很有用,很多时候即使读完其中的章节,事情仍然不清楚。

有很多事情不清楚,但这个问题我只想针对这些:

运行时docker volume create

--driver --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"
}
Run Code Online (Sandbox Code Playgroud)

]

尝试安装这个新卷:

 docker run --name test-with-volume \ 
    --mount source=customvolume,target=/var/www/html/app77' \ 
    my-app-only:latest
Run Code Online (Sandbox Code Playgroud)

错误:

     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.
Run Code Online (Sandbox Code Playgroud)

问题

显然,这些选项允许您做一些意想不到的事情,我能够volume在自定义位置创建一个卷,但它不可安装。

  • 有哪些选项type(每个解释都有差异):使用时docker volume create,我不清楚它们。 docker run --mount文档讨论了volume, bind, tmp,但仅docker volume create显示了示例,即 tmpfs、btrfs、nfs

  • 什么时候可以用device
    我认为这可以用于在源主机上为卷类型(也称为命名卷)创建自定义位置(类似于如何安装绑定安装) 我假设我可以使用“推荐的命名卷方式,包括自定义文件夹” location' 而不是主机挂载(绑定挂载)。

  • 最后,如何正确设置 docker-compose.yml 卷自定义驱动程序。

我认为混乱在于docker run --mountvsdocker volume create似乎不一致,因为 Docker 文档质量不明确

Dam*_*nga 7

数据 \xe2\x80\x94 主要有两类:持久数据和非持久数据。

\n

持久性是您需要保留的数据。像; 客户记录、财务数据、研究结果、审计日志,甚至某些类型的应用程序日志数据。非持久性是您不需要保留的数据。

\n

两者都很重要,并且 Docker 都有针对两者的解决方案。\n为了处理非持久性数据,每个 Docker 容器都有自己的非持久性存储。这是为每个容器自动创建的,并且与容器的生命周期紧密耦合。因此,删除容器将删除存储及其上的所有数据。\n为了处理持久数据,容器需要将其存储在卷中。卷是独立的对象,其生命周期与容器分离。这意味着您可以独立创建和管理卷,并且它们\xe2\x80\x99不依赖于任何容器的生命周期。最终结果是,您可以删除使用卷的容器,并且该卷不会被删除。

\n

这个可写的本地存储层由存储驱动程序在每个 Docker 主机上进行管理(不要与卷驱动程序混淆)。如果您\xe2\x80\x99在Linux上的生产中运行Docker,则\xe2\x80\x99需要确保将正确的存储驱动程序与Docker主机上的Linux发行版相匹配。使用以下列表作为指导:

\n
    \n
  • Red Hat Enterprise Linux:将overlay2 驱动程序与运行 Docker 17.06 或更高版本的现代 RHEL 版本结合使用。将 devicemapper\n驱动程序与旧版本一起使用。这适用于 Oracle Linux 和其他\nRed Hat 相关的上游和下游发行版。

    \n
  • \n
  • Ubuntu:使用overlay2 或aufs 驱动程序。如果您\xe2\x80\x99 使用的是 Linux 4.x\n内核或更高版本,则应该使用overlay2。

    \n
  • \n
  • SUSE Linux Enterprise Server:使用 btrfs 存储驱动程序。

    \n
  • \n
  • Windows Windows 只有一个驱动程序,并且是默认配置的。

    \n
  • \n
\n

默认情况下,Docker 使用内置本地驱动程序创建新卷。顾名思义,使用本地驱动程序创建的卷仅可用于与该卷位于同一节点上的容器。您可以使用 -d 标志来指定不同的驱动程序。第三方卷驱动程序可作为插件使用。这些为 Docker 提供了无缝访问外部存储系统的能力,例如云存储服务和本地存储系统(包括 SAN 或 NAS)。

\n
$ docker volume inspect myvol\n[\n{\n"CreatedAt": "2020-05-02T17:44:34Z",\n"Driver": "local",\n"Labels": {},\n"Mountpoint": "/var/lib/docker/volumes/myvol/_data",\n"Name": "myvol",\n"Options": {},\n"Scope": "local"\n}\n]\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,驱动程序和范围都是本地的。这意味着该卷是使用本地驱动程序创建的,并且仅可供该 Docker 主机上的容器使用。Mountpoint 属性告诉我们卷存在于 Docker host\xe2\x80\x99s 文件系统中的哪个位置。

\n

带绑定安装座

\n
version: '3.7'\nservices:\n   maria_db:\n    image: mariadb:10.4.13\n    environment:\n      MYSQL_ROOT_PASSWORD: Test123@123\n      MYSQL_DATABASE: database\n    ports:\n      - 3306:3306\n    volumes:\n      - /etc/localtime:/etc/localtime:ro\n      - ./data_mariadb/:/var/lib/mysql/  \n\n
Run Code Online (Sandbox Code Playgroud)\n

带卷安装

\n
version: "3.8"\nservices:\n  web:\n    image: mariadb:10.4.13\n    volumes:\n      - type: volume\n        source: dbdata\n        target: /var/lib/mysql/ \n\nvolumes:\n  dbdata:  \n
Run Code Online (Sandbox Code Playgroud)\n

绑定挂载说明

\n

自 Docker 早期以来,绑定挂载就已经存在。与卷相比,绑定安装的功能有限。使用绑定挂载时,主机上的文件或目录将挂载到容器中。文件或目录由其在主机上的完整或相对路径引用。相比之下,当您使用卷时,会在主机上的 Docker\xe2\x80\x99s 存储目录中创建一个新目录,并且 Docker 管理该目录\xe2\x80\x99s 的内容。

\n

tmpfs挂载说明

\n

卷和绑定安装允许您在主机和容器之间共享文件,以便即使在容器停止后也可以保留数据。如果您\xe2\x80\x99在Linux上运行Docker,则有第三个选项:tmpfs挂载。当您创建带有 tmpfs 挂载的容器时,该容器可以在 container\xe2\x80\x99s 可写层之外创建文件。与卷和绑定挂载相反,tmpfs 挂载是临时的,仅保留在主机内存中。当容器停止时,tmpfs 挂载将被删除,写入其中的文件将不会被持久化。

\n

卷解说

\n

卷是持久保存 Docker 容器生成和使用的数据的首选机制。虽然绑定挂载依赖于主机的目录结构,但卷完全由 Docker 管理。

\n