VOLUME 定義匿名卷 —— docker build


VOLUME 定義匿名卷

 

格式為:

  • VOLUME ["<路徑1>", "<路徑2>"...]
  • VOLUME <路徑>

之前我們說過,容器運行時應該盡量保持容器存儲層不發生寫操作,對於數據庫類需要保存動態數據的應用,其數據庫文件應該保存於卷(volume)中,后面的章節我們會進一步介紹 Docker 卷的概念。

為了防止運行時用戶忘記將動態文件所保存目錄掛載為卷,在 Dockerfile 中,我們可以事先指定某些目錄掛載為匿名卷,這樣在運行時如果用戶不指定掛載,其應用也可以正常運行不會向容器存儲層寫入大量數據

 

VOLUME /data 

這里的 /data 目錄就會在運行時自動掛載為匿名卷任何向 /data 中寫入的信息都不會記錄進容器存儲層,從而保證了容器存儲層的無狀態化。當然,運行時可以覆蓋這個掛載設置

 

比如:

docker run -d -v mydata:/data xxxx 

在這行命令中,就使用了 mydata 這個命名卷掛載到了 /data 這個位置,替代了 Dockerfile 中定義的匿名卷的掛載配置

 

 

Docker 數據管理

 

 

 

這一章介紹如何在 Docker 內部以及容器之間管理數據,在容器中管理數據主要有兩種方式:

  • 數據卷(Volumes)

  • 掛載主機目錄 (Bind mounts)

 

數據卷

數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:

  • 數據卷 可以在容器之間共享和重用

  • 對 數據卷 的修改會立馬生效

  • 對 數據卷 的更新,不會影響鏡像

  • 數據卷 默認會一直存在,即使容器被刪除

注意:數據卷 的使用,類似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定為掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷

 

創建一個數據卷

$ docker volume create my-vol

查看所有的 數據卷

$ docker volume ls

local my-vol 

在主機里使用以下命令可以查看指定 數據卷 的信息

$ docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

  

啟動一個掛載數據卷的容器

在用 docker run 命令的時候,使用 --mount 標記來將 數據卷 掛載到容器里

一次 docker run 中可以掛載多個 數據卷

下面創建一個名為 web 的容器,並加載一個 數據卷 到容器的 /webapp 目錄

$ docker run -d -P \
    --name web \
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \
    training/webapp \
    python app.py

  

查看數據卷的具體信息

在主機里使用以下命令可以查看 web 容器的信息

$ docker inspect web

數據卷 信息在 "Mounts" Key 下面

"Mounts": [
    {
        "Type": "volume",
        "Name": "my-vol",
        "Source": "/var/lib/docker/volumes/my-vol/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

  

刪除數據卷

$ docker volume rm my-vol

數據卷 是被設計用來持久化數據的,它的生命周期獨立於容器,Docker 不會在容器被刪除后自動刪除 

數據卷,並且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷

如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用 docker rm -v 這個命令。

 

無主的數據卷可能會占據很多空間,要清理請使用以下命令

$ docker volume prune

  

掛載主機目錄

掛載一個主機目錄作為數據卷

使用 --mount 標記可以指定掛載一個本地主機的目錄到容器中去

$ docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp \
    training/webapp \
    python app.py

  上面的命令加載主機的 /src/webapp 目錄到容器的 /opt/webapp目錄

這個功能在進行測試的時候十分方便,比如用戶可以放置一些程序到本地目錄中,來查看容器是否正常工作本地目錄的路徑必須是絕對路徑,以前使用 -v 參數時如果本地目錄不存在 Docker 會自動為你創建一個文件夾,現在使用 --mount 參數時如果本地目錄不存在,Docker 會報錯

 

Docker 掛載主機目錄的默認權限是 讀寫,用戶也可以通過增加 readonly 指定為 只讀

$ docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp:ro \
    --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
    training/webapp \
    python app.py

  

加了 readonly 之后,就掛載為 只讀 了。如果你在容器內 /opt/webapp 目錄新建文件,會顯示如下錯誤

/opt/webapp # touch new.txt
touch: new.txt: Read-only file system

  

查看數據卷的具體信息

在主機里使用以下命令可以查看 web 容器的信息

$ docker inspect web

掛載主機目錄 的配置信息在 "Mounts" Key 下面

"Mounts": [
    {
        "Type": "bind",
        "Source": "/src/webapp",
        "Destination": "/opt/webapp",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

  

掛載一個本地主機文件作為數據卷

--mount 標記也可以從主機掛載單個文件到容器

$ docker run --rm -it \
   # -v $HOME/.bash_history:/root/.bash_history \
   --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
   ubuntu:18.04 \
   bash

root@2affd44b4667:/# history
1  ls
2  diskutil list

 這樣就可以記錄在容器輸入過的命令了。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM