[英]docker mounting volumes on host
我已經成功地能夠使用卷在 docker 容器之間共享文件夾
docker run -v /host/path:/container/path ...
但我的問題是這與在 Dockerfile 中使用VOLUME
命令有什么區別
VOLUME /path
我正在使用帶有VOLUME
命令的圖像,我想知道如何與我的主機共享它。 我已經使用上面的-v
命令完成了它,但我不知道我是否需要-v
和VOLUME
。
VOLUME
命令將在容器內掛載一個目錄,並將在該目錄內創建或編輯的任何文件存儲在容器文件結構之外的主機磁盤上,繞過聯合文件系統。
這個想法是你的卷可以在你的 docker 容器之間共享,只要有一個容器(運行或停止)引用它們,它們就會一直存在。
您可以在運行容器時使用--volumes-from
命令讓其他容器掛載現有卷(在容器之間有效地共享它們)。
VOLUME
和-v
之間的根本區別在於: -v
將在您的 docker 容器中掛載操作系統中的現有文件,而VOLUME
將在您的主機上創建一個新的空卷並將其掛載到您的容器中。
例子:
VOLUME /var/lib/mysql
。some-volume
進而,
docker run --volumes-from some-volume docker-image-name:tag
容器: docker run --volumes-from some-volume docker-image-name:tag
some-volume
安裝在/var/lib/mysql
注意:使用--volumes-from
會將卷掛載到卷所在位置的任何內容上。 即,如果您在/var/lib/mysql
有東西,它將被卷的內容替換。
讓我添加我自己的答案,因為我相信其他人沒有抓住 Docker 的重點。
在 Dockerfile 中使用VOLUME
是 Right Way™,因為您讓 Docker 知道某個目錄包含永久數據。 Docker 將為該數據創建一個卷並且永遠不會刪除它,即使您刪除了所有使用它的容器。
它還繞過聯合文件系統,因此該卷實際上是一個實際目錄,它被掛載(讀寫或只讀)在所有共享它的容器中的正確位置。
現在,為了從主機訪問該數據,您只需要檢查您的容器:
# docker inspect myapp
[{
.
.
.
"Volumes": {
"/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
"/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
"/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
},
"VolumesRW": {
"/var/www": false,
"/var/cache/nginx": true,
"/var/log/nginx": true
}
}]
我通常做的是在一些標准位置創建符號鏈接,例如 /srv ,以便我可以輕松訪問卷並管理它們包含的數據(僅適用於您關心的卷):
ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log
Dockerfile
中使用 VOLUME 來公開其他容器要使用的卷。 例如,創建Dockerfile
為:
從 ubuntu:14.04
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
構建圖像:
$ docker build -t testing_volume .
運行容器,比如 container1:
$ docker run -it <image-id of above image> bash
現在運行另一個帶有volumes-from選項的容器(say-container2)
$ docker run -it --volumes-from <id-of-above-container> ubuntu:14.04 bash
您將從 container1 /myvol
目錄中獲取所有數據到位於同一位置的 container2。
-v
選項在容器運行時給出,用於在主機上掛載容器目錄。 使用起來很簡單,只需提供-v
選項,參數為<host-path>:<container-path>
。 整個命令可能是$ docker run -v <host-path>:<container-path> <image-id>
基本上VOLUME
和-v
選項幾乎相等。 這些意味着“在您的容器上掛載特定目錄”。 例如, VOLUME /data
和-v /data
含義完全相同。 如果您運行具有VOLUME /data
或-v /data
選項的映像, /data
目錄將掛載您的容器。 此目錄不屬於您的容器。
想象一下,您將一些文件添加到容器上的/data
中,然后將容器提交到新映像中。 數據目錄上沒有任何文件,因為掛載的/data
目錄屬於原始容器。
$ docker run -it -v /data --name volume ubuntu:14.04 bash
root@2b5e0f2d37cd:/# cd /data
root@2b5e0f2d37cd:/data# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/data# cd /tmp
root@2b5e0f2d37cd:/tmp# touch 1 2 3 4 5 6 7 8 9
root@2b5e0f2d37cd:/tmp# exit
exit
$ docker commit volume nacyot/volume
835cfe3d8d159622507ba3256bb1c0b0d6e7c1419ae32751ad0f925c40378945
nacyot $ docker run -it nacyot/volume
root@dbe335c7e64d:/# cd /data
root@dbe335c7e64d:/data# ls
root@dbe335c7e64d:/data# cd /tmp
root@dbe335c7e64d:/tmp# ls
1 2 3 4 5 6 7 8 9
root@dbe335c7e64d:/tmp#
root@dbe335c7e64d:/tmp#
像/data
這樣的掛載目錄用於存儲不屬於您的應用程序的數據。 並且您可以使用VOLUME
預定義不屬於容器的數據目錄。
Volume
和-v
選項之間的區別在於您可以在啟動容器時動態使用-v
選項。 這意味着您可以動態掛載某個目錄。 另一個區別是您可以使用-v
將主機目錄掛載到容器上
這是來自 Docker 文檔本身,可能有幫助,簡單明了:
“主機目錄本質上是依賴於主機的。因此,您不能從 Dockerfile 掛載主機目錄,VOLUME 指令不支持傳遞主機目錄,因為構建的圖像應該是可移植的。主機目錄在所有潛在主機上都不可用。”。
如果您來到這里是因為您正在尋找一種簡單的方式來瀏覽任何VOLUME
:
docker volume list
找出docker volume list
docker run -it --rm --mount source=[NAME OF VOLUME],target=/volume busybox
cd /volume
輸入音量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.