Dockerfile 中的Volume有什麼意義,光用docker run -v效果相同嗎?
PHP中文网
PHP中文网 2017-04-24 09:09:15
0
2
651

Dockerfile 中有一個 VOLUME 命令,可以把掛載一個目錄到主機目錄,但是在主機目錄下的名字是隨機的,除非用戶用 -v 指定,但是如果在 Dockerfile 中不用 VOLUME,隻在運行時用 -v 指定也能達到效果,那麼就有一個問題,VOLUMEDockerfile 中到底有多少用,在 Host 下創建了幾個用戶一般找不到的文件到底有多少使用價值,大部分情況下用戶都是要手動使用 -v 重新指定掛載目錄,那 VOLUME 命令就顯得很雞肋。

VOLUME 是否有什麼比較重要的用處我沒有理解呢?

PHP中文网
PHP中文网

认证0级讲师

全部回覆(2)
迷茫

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

找到了官方的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。

小葫芦

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 服務分開來跑,非常適合組成複雜的環境。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板