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

标签 docker docker-compose dockerfile

描述
正式的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-compose.yml卷自定义驱动程序。

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

    最佳答案

    数据主要有两类-持久性数据和非持久性数据。
    持久性是您需要保留的数据。像;客户记录,财务数据,研究结果,审计日志,甚至某些类型的应用程序日志数据。非永久性是您不需要保留的数据。
    两者都很重要,并且Docker为两者提供了解决方案。
    为了处理非持久性数据,每个Docker容器都有自己的非持久性存储。这是为每个容器自动创建的,并与容器的生命周期紧密相关。结果,删除容器将删除存储及其上的任何数据。
    为了处理持久数据,容器需要将其存储在卷中。卷是独立的对象,其生命周期与容器分离。这意味着您可以独立创建和管理卷,并且卷不依赖于任何容器的生命周期。最终结果是,您可以删除使用某个卷的容器,而该卷不会被删除。
    该本地存储可写层由存储驱动程序(不要与卷驱动程序混淆)在每个Docker主机上进行管理。如果您要在Linux上的生产环境中运行Docker,则需要确保将正确的存储驱动程序与Docker主机上的Linux发行版相匹配。使用以下列表作为指导:

  • 红帽企业版Linux:在现代操作系统中使用overlay2驱动程序
    运行Docker 17.06或更高版本的RHEL版本。使用devicemapper
    旧版本的驱动程序。这适用于Oracle Linux和其他
    红帽相关的上下游发行版。
  • 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"
    }
    ]
    
    请注意,驱动程序和范围都是本地的。这意味着该卷是使用本地驱动程序创建的,并且仅可用于该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/

    相关文章:

    docker - 由于 postgis 端口问题,连接到 docker 容器失败

    docker-compose 主机和容器上的持久数据

    docker - 如何将 ARG 值传递给 ENTRYPOINT?

    reactjs - docker 化后无法在浏览器中打开React应用

    docker - 在Docker容器内创建领事客户端代理时如何传递参数?

    docker - 如何使用nexus运行docker的版本图像?

    macos - 从 Docker 容器访问托管在 OS X 上的 USB 网络摄像头

    docker - 我在bluemix中启动了一个docker容器,ice ps显示了我的容器处于 “Queued”状态达数小时

    rest - 无法从另一个 docker 容器访问 docker 容器中的 REST 端点

    docker - 我想在容器中打印 docker run 环境变量