1、共享宿主機的目錄給容器
docker run -d --name=test -v /opt/test:/usr/databases docker-test
test是容器的名字,需唯一;-v表示創建一個數據卷並掛載到容器里,示例表示把宿主機的/opt/test目錄掛載到容器的/usr/databases目錄下;docker-test是鏡像的名字
2、有時候需要共享容器的volume,則需采用其他方式來訪問
1)采用–volumes-from
可以使用最小的鏡像busybox來幫忙實現
1.docker run --name=storedata -v /data:/usr/data busybox true
定義一個名稱為storedata的目錄映射,示例表示把宿主機的/data目錄掛載到容器的/usr/data目錄下。其他的容器就可以采用–volumes-from來使用該目錄
docker run -d --name=test1 --volumes-from storedata docker-test
docker run -d --name=test2 --volumes-from storedata docker-test
2)采用ln鏈接的方式把不同目錄掛載到同一個目錄下
ln -s /data /opt/es1/
ln -s /data /opt/es2/
示例在/opt/es1/和/opt/es2/目錄下都生成了一個指向/data目錄的快捷方式,因此訪問/opt/es1/data和/opt/es2/data都是訪問的/data目錄
搞定了鏈接,現在就可以直接采用-v來映射目錄了
docker run -d --name=test3 -v /opt/es1/data:/usr/data docker-test
docker run -d --name=test4 -v /opt/es2/data:/usr/data docker-test
這樣,在test3和test4容器內部操作/usr/data目錄都是操作的宿主機的/data目錄
參考:https://segmentfault.com/q/1010000004107293
從中了解了一點: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。
###
1.上面這個的含義是在一個容器A中使用了VOLUME,在其他的容器就可以直接使用--volumes-from 容器A,來共享volume了,如果在新的容器使用VOLUME,還是會隨機生成一個目錄。
2.同時VOLUME不支持host-dir參數,因為不確定host上有沒有這個dir。