【问题标题】:Docker Volumes - Create options (Driver)Docker 卷 - 创建选项(驱动程序)
【发布时间】:2020-08-31 03:18:23
【问题描述】:

说明

官方的 Docker 文档通常不是很有用,而且很多时候即使阅读了它们的部分,事情仍然不清楚。

还有很多不清楚的地方,但是这个问题我只想针对这些:

运行docker volume create时:

--驱动程序 --选择设备 --选择类型

当我运行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
    我认为这可以用来为源主机上的卷类型(又名卷)创建一个自定义位置(类似于如何挂载绑定挂载) 我假设我可以使用“推荐的命名卷方式,包括自定义文件夹位置”而不是主机挂载(绑定挂载)。

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

我认为混淆在于 docker run --mountdocker volume create 似乎不一致,因为 Docker 文档质量不清楚

【问题讨论】:

    标签: docker docker-compose dockerfile


    【解决方案1】:

    有两种主要的数据类别——持久性和非持久性。

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

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

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

    • Red Hat Enterprise Linux:将 overlay2 驱动程序与现代 运行 Docker 17.06 或更高版本的 RHEL 版本。使用设备映射器 旧版本的驱动程序。这适用于 Oracle Linux 和其他 Red Hat 相关的上游和下游发行版。

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

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

    • Windows 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"
    }
    ]
    

    请注意,Driver 和 Scope 都是本地的。这意味着该卷是使用本地驱动程序创建的,并且仅适用于该 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 mounts。当您使用 tmpfs 挂载创建容器时,该容器可以在容器的可写层之外创建文件。与卷和绑定挂载相反,tmpfs 挂载是临时的,并且只保留在主机内存中。当容器停止时,tmpfs 挂载被移除,在那里写入的文件不会被持久化。

    音量说明

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

    【讨论】:

    • 感谢您的详细解释,随着时间的推移,这将非常有帮助。但是,我的问题具体是关于 --driver (somedrivertype)、--opt device=:/path` 和 --opt type=volume由 Docker 管理的持久自定义位置(即命名卷 - 不是绑定挂载)。此处显示的示例仅适用于在 /var/lib/docker/volumes/volumename/_data 文件夹中创建的 docker volume create
    • 我认为这些示例讨论了主机/var/lib/docker/volumeshosted 上的所有内容;对于命名卷,如果我有轻微误解,请更新我。您能否举例说明如何将 docker 配置为 Ubuntu 的用户 overlay2 or aufs 类型? (或只是另一种操作系统类型)。我的主要目标是采用“Docker 推荐的方式”,但也有机会指定自定义位置。我已经阅读了 plugins 并且我想我可能在那里找到了解决方案。 Docker 的文档表明它可以在本机(没有插件)
    • 您不能使用自定义位置来命名卷。如果您需要使用自定义位置,则需要使用绑定挂载选项。您可以通过更新“/etc/docker/daemon.json”文件来更改默认存储驱动程序。
    • 例如`udayanga@udayanga-PC:~$ cat /etc/docker/daemon.json { "storage-driver": "overlay2" } udayanga@udayanga-PC:~$ `
    • 有趣的是我没有 /etc/docker/daemon.json。我认为该主题更多地讨论了存储驱动程序,我现在假设--driver local, nfs, tmpfs 用于卷,存储驱动程序是操作系统存储类型。再次阅读上面的答案:`(不要与音量驱动程序混淆)`有点证实了这一点。问题主要是我几乎找不到清晰的 Docker 文档。
    【解决方案2】:

    最近我搜索了类似的东西:如何强制 docker 卷将其数据写入自定义路径,该路径实际上是永久磁盘的挂载点。有两个动机:

    1. 首先要避免 docker 卷卡在 VM 内 图片的磁盘空间。
    2. 其次,数据比 docker 卷本身的寿命更长(例如,易于在另一个 VM 实例上重用和新创建的 docker 卷)。

    通过在执行docker volume create 时将额外选项传递给标准local 驱动程序,这似乎是可行的。例如,下面的命令使 docker 卷 tmp-volume 写入设备的参数值。请注意,docker volume inspect 仍然输出完全不同但未使用的 MountPoint。当 Ubuntu 是该 VM 实例中的主机操作系统时,它可以工作:

    docker volume create -d local  --name tmp-volume\
        --opt device="/mnt/disks/disk-instance-test-volume" \
        --opt type="none" \
        --opt o="bind"
    

    也许这与您的用例重叠?我在这里更详细地记录了整个故事:https://medium.com/@francis.meyvis/how-to-force-a-docker-volume-on-a-gce-disk-45b59d4973e?source=friends_link&sk=0e71ef39db84f4cb0ecccc7cd0f3c254

    【讨论】:

    • 我无法让local '延长(持久)'容器;一旦我删除了容器,数据就会消失(我使用 docker-compose - 所以卷也会被删除)。正如我的回答中提到的,我最终使用了local-persist。这似乎要么不支持 docker-compose 卷删除在我的情况下正是我需要的,或者因为它是 plugin,docker-compose 可能认为最好不要触摸卷。我一定会在下一次批量测试中尝试你的方法,看看它与local-persist相比的表现如何@
    【解决方案3】:

    Damith 的关于命名卷与绑定挂载的详细解释是任何人都可以阅读的很好的参考。为了回答我的问题,他谈到了第三方插件,所以我不得不进一步调查。

    当使用命名卷(只有绑定挂载能够)与默认 Docker 安装时,似乎无法使用自定义位置,但确实有一个插件起作用类似于 named-volumes,但有一些额外的功能。

    虽然这只是部分回答了我提到的一些问题(并且仍然不清楚),但如果您想使用 named-volume acting like bind-mounts

    ,请将此作为参考

    解决方案

    对于我的特定用例,Docker 插件local-persist 似乎解决了我的要求,它能够1)在容器被删除时保留数据和2) 提供一种使用自定义位置的方法

    Matchbooklab Docker local-persist

    安装:

    确认可以使用 Ubuntu 20.04 安装

    • 运行这个安装脚本:注意:如果你想手动安装,github链接上也有自定义安装说明。

      curl -fsSL https://raw.githubusercontent.com/MatchbookLab/local-persist/master/scripts/install.sh | sudo bash
      

    这将为 local-persist 安装和设置启动脚本以监控卷。

    设置音量

    • 创建一个新的本地持久化卷:

      docker volume create -d local-persist --opt mountpoint=/custom/path/on/host --name new-volume-name
      

    用法

    • 将卷附加到容器:

    较新的 --mount 语法:

       docker run --name container-name --mount 'source=new-volume-name,target=/path/inside/container'
    

    -v 语法:(未测试 - 如 github 自述文件所示)

       docker run -d -v images:/path/inside/container/ imagename:version
    
    • 或使用 docker-compose.yml:(示例显示 v2;尚未测试)

      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
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多