Dockerfile 中有一个 VOLUME 命令,可以把挂载一个目录到主机目录,但是在主机目录下的名字是随机的,除非用户用 -v 指定,但是如果在 Dockerfile 中不用 VOLUME,只在运行时用 -v 指定也能达到效果,那么就有一个问题,VOLUME 在 Dockerfile 中到底有多少用,在 Host 下创建了几个用户一般找不到的文件到底有多少使用价值,大部分情况下用户都是要手动使用 -v 重新指定挂载目录,那 VOLUME 命令就显得很鸡肋。
VOLUME 是否有什么比较重要的用处我没有理解呢?
迷茫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。
高洛峰2017-04-24 09:11:15
VOLUME
指令主要是在開發環境下非常有用:
編輯程式碼的時候,直接在宿主機裡進行編輯,然後在 docker 裡同步跑,無需反覆啟動關閉,這能發揮開發環境的最高性能。
對於 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 服務分開來跑,非常適合組成複雜的環境。