首頁  >  問答  >  主體

Dockerfile 中的Volume有什么意义,光用docker run -v效果相同吗?

Dockerfile 中有一个 VOLUME 命令,可以把挂载一个目录到主机目录,但是在主机目录下的名字是随机的,除非用户用 -v 指定,但是如果在 Dockerfile 中不用 VOLUME,只在运行时用 -v 指定也能达到效果,那么就有一个问题,VOLUMEDockerfile 中到底有多少用,在 Host 下创建了几个用户一般找不到的文件到底有多少使用价值,大部分情况下用户都是要手动使用 -v 重新指定挂载目录,那 VOLUME 命令就显得很鸡肋。

VOLUME 是否有什么比较重要的用处我没有理解呢?

PHP中文网PHP中文网2758 天前632

全部回覆(2)我來回復

  • 迷茫

    迷茫2017-04-24 09:11:15

    我也對此有些疑問,所以找了一些資料,說下我的看法。

    找到了官方的userguide: https://docs.docker.com/engine/userguide...

    從中了解了一點:VOLUME並非只是聲明,它會把指定路徑重新加載一遍,我透過inspect容器也發現了這一點。

    這是在Dockerfile指定了VOLUME,並沒有指定-v,查看容器的Mounts資訊:

    "Mounts": [
            {
                "Name": "b3e2dcacd3f9f40b43ccd5773d45ca74f0f49b02d3da17749cb378ff9f59bb67",
                "Source": "/var/lib/docker/volumes/b3e2dcacd3f9f40b43ccd5773d45ca74f0f49b02d3da17749cb378ff9f59bb67/_data",
                "Destination": "/etc",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],

    這是在上一個的基礎上,指定了-v,查看容器的Mounts資訊:

     "Mounts": [
            {
                "Source": "/etc",
                "Destination": "/etc",
                "Mode": "",
                "RW": true
            }
        ],

    然後你去/var/lib/docker/volumes/b3e2dcacd3f9f40b43ccd5773d45ca74f0f49b02d3da17749cb378ff9f59bb67/_data目錄下看一下,大致就清楚了。

    你可以把VOLUME理解為,從鏡像複製指定磁碟區的資料夾到本地/var/lib/docker/volumes/xxxxxxxxx/文件夹,然後把本地的該資料夾掛載到容器裡面去。

    本質上還是相當於一個本地資料夾掛載而已。

    繼續補充,因為VOLUME實際上就是在本地新建了一個資料夾掛載了,那麼實際上容器內部的資料夾有三種情況:
    1、沒有指定VOLUME也沒有指定-v,這種是普通資料夾。
    2、指定了VOLUME沒有指定-v,這種資料夾可以在不同容器之間共享,但是無法在本地修改。
    3、指定了-v的資料夾,這種資料夾可以在不同容器之間共享,並且可以在本地修改。

    那就列舉一種需要在不同容器之間共用且不需要在本地修改的情況。

    首先,我們先了解容器中取得動態資料的方式:
    1、本地提供,掛載到容器
    2、遠端提供,從遠端下載
    3、產生提供,在容器內部產生

    後面兩種指令都不需要在本地修改,但是他們產生的動態資料卻可能需要共用。
    下載指令,例如git clone直接從git伺服器拉取程式碼,不需要掛載本機資料夾。
    產生指令,例如jekyll(靜態網站產生器),你可能會掛載一個程式碼資料夾,然後build目錄裡產生的靜態網頁檔案需要提供給Apache伺服器,那麼你需要指定build目錄為VOLUME。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-24 09:11:15

    VOLUME 指令主要是在開發環境下非常有用:

    1. 編輯程式碼的時候,直接在宿主機裡進行編輯,然後在 docker 裡同步跑,無需反覆啟動關閉,這能發揮開發環境的最高性能。

    2. 對於 VOLUME 我更喜欢使用 docker-compose 進行指定:

    db:
      image: postgres
    web:
      build: .
      command: python manage.py runserver 0.0.0.0:8000
      volumes:
        - .:/code
      ports:
        - "8000:8000"
      links:
        - db

    docker-compose 可以將多個服務進行捆綁了跑,上面的範例就是 web 服務和 db 服務分開來跑,非常適合組成複雜的環境。

    回覆
    0
  • 取消回覆