【问题标题】:How to create docker volume device/host path如何创建 docker 卷设备/主机路径
【发布时间】:2018-10-01 16:24:30
【问题描述】:

我相信有一种简单的方法可以将文件复制到已经挂载到容器的 docker 卷中。

docker cp /tmp/my_data/. my_container:/my_dataHow to copy multiple files into a docker data volume 引用

但是,如何使用docker volume create --name my-volume 创建一个已包含文件的命名卷? 我读过将文件 cp 到 {{.Mountpoint}} 不是一个好主意。

我是 docker 新手,所有细节都很细微,如果我对卷的基本理解不正确,请致歉。

【问题讨论】:

    标签: docker docker-volume


    【解决方案1】:

    方法 #1 - 复制

    将文件从主机复制到容器

    docker cp /path/of/the/file <Container_ID>:/path/of/he/container/folder
    

    上述方法的问题是,它不会保留卷或文件或目录,因为您删除容器时它会丢失。建议仅用于临时目的。

    方法 #2 - 卷安装

    将卷从主机安装到容器

    Step1:使用自定义路径创建卷

    docker volume create --name my_test_volume --opt type=none --opt device=/home/jinna/Jinna_Balu/Test_volume --opt o=bind
    

    Step2 : 挂载到容器或 swarm 服务

    docker run -d \
      --name devtest \
      --mount source=my_test_volume,target=/app \
      nginx:1.11.8-alpine
    

    我们可以使用下面的 .yaml 文件完成上述两个步骤

    version: '3'
    services:
      nginx:
        image: nginx:1.11.8-alpine
        ports:
          - "8081:80"
        volumes:
          - my_test_volume:/usr/share/app
    volumes:
      my_test_volume:
        driver: local
        driver_opts:
           o: bind
           type: none
           device: /home/jinna/Jinna_Balu/Test_volume
    

    使用 docker-compose 运行上述 yml

    docker-compose up -d
    

    注意:在执行 docker-compose 之前创建文件夹路径。

    良好的做法是将文件调出以保持持久性。

    【讨论】:

    • 这是一个很好的答案。感谢您为我提供了多种方式并解释了正确方式的推理,以及向我介绍了 docker-compose!
    • 您能否添加这些路径(jinna)的位置以及它们与 docker-compose 位置的关系?当您运行 docker-compose 时,它​​会查看同一台机器上 device: 的路径吗?
    • 它在机器内寻找路径。因为我们没有使用 docker 卷驱动程序。根据上面的示例,您必须在运行容器之前创建目录的路径/home/jinna/Jinna_Balu/Test_volume
    • 嗨 Jinna,你能链接到这个文档的位置吗?我一直在 Docker 文档中搜索如何在 Docker Compose 中的顶级卷键中执行此操作,但我找不到任何东西。我在文档中看到很多关于如何在服务定义中设置卷挂载的示例,但所有顶级卷关键示例都只是 volumes:&lt;linebreak&gt;someNamedVolume:
    • @zakariah1 主机卷数据将被持久化,您在主机卷中保存的任何内容都将在容器中可用。
    【解决方案2】:

    创建一个卷。

    $ docker volume ls | grep my-volume
    $ docker run -it --rm -d --name tmp -v my-volume:/mnt alpine
    $ docker volume ls | grep my-volume
    local               my-volume
    $ docker exec tmp ls -l /mnt
    total 0
    $ 
    

    将文件复制到容器中。

    $ docker cp . tmp:/mnt
    $ docker exec tmp ls -l /mnt
    total 4
    -rw-r--r--    1 501      50              93 Apr 20 22:53 Dockerfile
    $ ls
    Dockerfile
    $ 
    

    清理干净。

    $ docker rm -f tmp
    tmp
    $ 
    

    检查。

    $ docker run --rm -v my-volume:/mnt alpine ls /mnt
    Dockerfile
    $
    

    【讨论】:

      【解决方案3】:

      在容器之间绑定卷 和主机。最简单的方法是使用卷安装。我们可以使用它在启动之前设置您的容器,(它的图像、端口、..etc)

      从镜像构建容器:docker-compose build 启动容器:docker-compose up

      docker-compose 文件中的 Volumes 键用于设置绑定。 这意味着当我们更新容器中卷的内容时 即使停止容器,它也会持续存在。

      我们可以从本地目录或命名的 docker 卷绑定卷,请参见下面的示例

      我们可以在您的 Dockerfile 中使用 COPY 或 ADD 来使您的本地目录的内容在 docker 容器中可用。

      read docs here

      version: "3.2"
      services:
        web:
          image: nginx:alpine
          ports:
            - "80:80"
          volumes:
            - type: volume
              source: mydata
              target: /data
              volume:
                nocopy: true
            - type: bind
              source: ./static
              target: /opt/app/static
      
          networks:
            webnet:
      
          volumes:
      

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2015-11-06
        • 2011-10-30
        • 2019-10-25
        • 2018-12-19
        • 1970-01-01
        • 2019-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多