在docker容器的實際使用中,經常會遇到容器的資料持久化,容器之間的資料共享等問題,通常我們有兩種解決方案:
1)資料卷(data volumes):就是將容器內資料直接對映到本地主機環境的指定檔案目錄之中,可以理解為容器掛載一個虛擬資料卷然後
對映到一個主機目錄中
2)資料卷容器(data volume containers):用專門的容器來掛載資料卷,其他容器通過掛載這個父容器來實現資料共享,這個專門掛載
資料卷的容器就是資料卷容器,簡單的總結就是有一個容器來專門管理資料的持久化和容器之間資料共享
前者常用於單一容器資料持久化,後者常用於多容器之間的資料共享和資料持久化
我們可以在映象程式執行時通過"-v /主機目錄檔名:/容器目錄名" 命令,將容器卷指定一個主機目錄,這樣我們的程式執行的資料就可以持久
儲存到這個對映的主機目錄檔案當中。
我們舉一個實際的例子,此處用一個簡單.asp core程式為例子:
我們寫一個asp core web程式,然後請求這個程式的get()介面,這個介面會將記錄日誌檔案儲存到伺服器指定的檔案中,從而通過這個程式實現
docker容器資料的持久化(記錄日誌到本地)
日誌記錄類**public class filelogger}}
catch (exception)
}public static void logerror(exception ex)
private static string filepath(string pathstr)
return pathstr + "/" + getfilename();
}private static string getfilename()
}
介面呼叫**:[httpget]
public dynamic get()
然後我們將這個程式打包,然後通過dockerfile構建成成映象然後部署到docker容器中
如果不會linux打包部署asp core程式的建議先看這篇文章:傳送門
dockerfile檔案如下
from microsoft/dotnet:2.2-aspnetcore-runtime as base
workdir /data
copy . .
expose 8083
env aspnetcore_urls http://+:8083
entrypoint ["dotnet", "mylog.dll"]
然後在包含dockerfile的專案目錄下面執行命令構建映象(不要掉了最後面那個小數點):
$ docker build -t mylog .
映象構建完成後我們執行映象到容器中,此時我們就可以-v 命令指定資料卷
此處/root/webapi/logs代表主機目錄,/data/filelogs代表容器目錄
$ docker run --name=mylog -p 8083:8083 -d -v /root/webapi/logs:/data/filelogs mylog
容器執行成功後我們我們檢視容器詳情
$ docker inspect 容器id
我們可以看到"mounts"節點下會有如圖顯示
最後我們測試一下,請求程式的get介面,然後在/root/webapi/logs可以看到我們記錄的日誌檔案
如我我們經常需要多個容器之間進行資料共享我們需要用到命令“--volumes-from”
具體例項:
1)我們從倉庫拉一個centos的容器映象
$ docker pull centos
2)然後執行這個映象並建立一個資料卷掛載到/mydata
$ docker run -it -v /mydata --name mycentos centos
3)再執行兩個容器,在這兩個容器中使用--volumes-from來掛載mycentos容器中的資料卷.
$ docker run -it --volumes-from mycentos --name soncentos1 centos
$ docker run -it --volumes-from mycentos --name soncentos2 centos
此時,容器soncentos1和soncentos2都掛載同一個資料捲到相同的/mydata 目錄。三個容器任何一方在該目錄下的寫入資料,其他容器都可以看到。
可以多次使用--volumes-from引數來從多個容器掛載多個資料卷。還可以從其他已經掛載了容器卷的容器來掛載資料卷。
使用--volumes-from引數所掛載資料卷的容器自身並不需要保持在執行狀態。
如果刪除了掛載的容器(包括dbdata、db1和db2),資料卷並不會被自動刪除。如果要刪除一個資料卷,必須在刪除最後一個還掛載著它
的容器時顯式使用docker rm -v命令來指定同時刪除關聯的容器。
docker 容器卷
今天介紹docker容器卷的概念,當我們想將docker內的檔案路徑掛載在宿主機上時,可以採用這種方式。 目前可以通過啟動命令時使用 v選項...
(五) Docker 容器資料卷
1 什麼是資料卷 docker容器產生的資料,如果不通過docker commit生成新的映象,使得資料做為映象的一部分儲存下來, 那麼當容...
Docker映象和容器資料卷
映象是一種輕量級 可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括 執行時 庫 環境...