簡體   English   中英

docker 在主機上安裝卷

[英]docker mounting volumes on host

我已經成功地能夠使用卷在 docker 容器之間共享文件夾

docker run -v /host/path:/container/path ...

但我的問題是這與在 Dockerfile 中使用VOLUME命令有什么區別

VOLUME /path

我正在使用帶有VOLUME命令的圖像,我想知道如何與我的主機共享它。 我已經使用上面的-v命令完成了它,但我不知道我是否需要-vVOLUME

VOLUME命令將在容器內掛載一個目錄,並將在該目錄內創建或編輯的任何文件存儲在容器文件結構之外的主機磁盤上,繞過聯合文件系統。

這個想法是你的卷可以在你的 docker 容器之間共享,只要有一個容器(運行或停止)引用它們,它們就會一直存在。

您可以在運行容器時使用--volumes-from命令讓其他容器掛載現有卷(在容器之間有效地共享它們)。

VOLUME-v之間的根本區別在於: -v將在您的 docker 容器中掛載操作系統中的現有文件,而VOLUME將在您的主機上創建一個新的空卷並將其掛載到您的容器中。

例子:

  1. 您有一個 Dockerfile 定義了一個VOLUME /var/lib/mysql
  2. 您構建 docker 映像並將其標記為some-volume
  3. 你運行容器

進而,

  1. 您有另一個要使用此卷的 docker 映像
  2. 您使用以下命令docker run --volumes-from some-volume docker-image-name:tag容器: docker run --volumes-from some-volume docker-image-name:tag
  3. 現在你有一個 docker 容器正在運行,它會將來自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

  1. 使用docker volume list找出docker volume list
  2. 關閉此卷附加到的所有正在運行的容器
  3. 運行docker run -it --rm --mount source=[NAME OF VOLUME],target=/volume busybox
  4. 將打開一個外殼。 cd /volume輸入音量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM