Docker卷-创建选项(驱动程序) 描述

Docker卷-创建选项(驱动程序) 描述,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,正式的Docker文档通常不是很有用,很多时候,即使在阅读了它们的部分之后,事情仍然不清楚 有很多事情还不清楚,但这个问题我只想针对这些: 运行docker卷创建时: --司机 --光学器件 --选择类型 当我运行docker volume create--driver local--opt device=:/var/www/html/app--opt type=volume volumename时,我实际上得到了一个卷: $docker volume inspect customvolum

正式的Docker文档通常不是很有用,很多时候,即使在阅读了它们的部分之后,事情仍然不清楚

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

运行
docker卷创建时

--司机 --光学器件 --选择类型

当我运行
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.
问题 显然,这些选项允许您做一些意想不到的事情,我可以在自定义位置创建
卷,但它不可装载

  • 类型
    有哪些选项(解释了每个选项的不同):使用
    docker volume create
    时,我不清楚这些选项。
    docker run--mount
    文档讨论了
    volume、bind、tmp
    ,但在
    docker volume create
    中,它们只显示了示例,即tmpfs、btrfs、nfs

  • 什么时候可以使用
    设备

    我认为这可以用于在源主机上为卷类型(也称为命名卷)创建一个自定义位置(类似于如何装载绑定装载) 我假设我可以使用“包含自定义文件夹位置的命名卷的推荐方式”而不是主机装载(绑定装载)

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


我认为混淆在于这样一个事实,即
docker run--mount
vs
docker volume create
似乎是不一致的,因为docker文档质量是多么的不清楚,有两大类数据-持久性和非持久性

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

这两者都很重要,Docker对这两者都有解决方案。 为了处理非持久性数据,每个Docker容器都有自己的非持久性存储。这是为每个容器自动创建的,并且与容器的生命周期紧密耦合。因此,删除容器将删除存储器及其上的任何数据。 要处理持久数据,容器需要将其存储在卷中。卷是独立的对象,其生命周期与容器解耦。这意味着您可以独立创建和管理卷,并且卷不受任何容器生命周期的限制。Net结果,您可以删除正在使用卷的容器,并且该卷不会被删除

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

  • Red Hat Enterprise Linux:将Overly2驱动程序与modern一起使用 运行Docker 17.06或更高版本的RHEL。使用devicemapper 使用旧版本的驱动程序。这适用于Oracle Linux和其他应用程序 与Red Hat相关的上游和下游发行版

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

  • SUSE Linux企业服务器:使用btrfs存储驱动程序

  • Windows只有一个驱动程序,默认情况下会对其进行配置

默认情况下,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主机的文件系统中的位置

带绑定挂载的

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:  
绑定安装说明

绑定坐骑在Docker早期就已经存在了。与卷相比,绑定装载的功能有限。使用绑定装载时,主机上的文件或目录将装载到容器中。文件或目录由其在主机上的完整或相对路径引用。相反,使用卷时,会在主机上Docker的存储目录中创建一个新目录,Docker管理该目录的内容

tmpfs安装说明

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

音量说明

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

有两个主要的c
curl -fsSL https://raw.githubusercontent.com/MatchbookLab/local-persist/master/scripts/install.sh | sudo bash
docker volume create -d local-persist --opt mountpoint=/custom/path/on/host --name new-volume-name
   docker run --name container-name --mount 'source=new-volume-name,target=/path/inside/container'
   docker run -d -v images:/path/inside/container/ imagename:version
version: '2'

services:
  one:
    image: alpine
    working_dir: /one/
    command: sleep 600
    volumes:
      - data:/one/

  two:
    image: alpine
    working_dir: /two/
    command: sleep 600
    volumes:
      - data:/two/

volumes:
  data:
    driver: local-persist
    driver_opts:
      mountpoint: /data/local-persist/data