首頁 運維 Docker docker儲存有哪幾種方式

docker儲存有哪幾種方式

Feb 08, 2022 pm 04:55 PM
docker

docker有四種儲存方式:1、“預設儲存”,資料保存在運行的容器中,容器刪除後,資料也隨之刪除;2、“volumes資料卷”;3、“bind mounts掛載”,直接掛載主機檔案系統的任何目錄或檔案;4、“tmpfs mount”。

docker儲存有哪幾種方式

本教學操作環境:linux5.9.8系統、docker-1.13.1版、Dell G3電腦。

docker容器的幾種儲存方式

#容器的儲存可以分為兩大類別:

#一種是與映像相關的即我們在《docker容器技術基礎之聯合檔案系統OverlayFS》一文提到的容器層Copy-On-Write特性。預設情況下,在容器內建立的所有檔案都儲存在可寫入容器層上,這種直接將檔案儲存在容器層的方式資料難以持久化和共享,由於依賴儲存驅動程式與使用直接寫入主機檔案系統的資料卷相比,這種額外的抽象會降低效能。

另一中是宿主機儲存即透過將宿主機目錄綁定或掛在容器中使用,容器停止後資料也能持久化。主要介紹後者。

幾種儲存掛載方式

這裡我們根據資料儲存在Docker 主機上的不同位置繪製如下圖:

docker儲存有哪幾種方式

docker四種儲存方式:預設、volumes資料磁碟區、bind mounts掛載、tmpfs mount(僅在linux環境中提供),其中volumes、bind mounts兩種實作持久化容器資料。

1.預設儲存

資料保存在運行的容器中,容器刪除後,資料也隨之刪除

2. bind mounts

綁定掛載與磁碟區相比,功能有限。使用綁定掛載時,主機上的檔案或目錄會掛載到容器中。檔案或目錄由其在主機上的完整路徑引用。目錄不需要已經存在於 Docker 主機上,如果不存在,docker會幫我們建立。注意一下,只能自動建立目錄哦。

我們透過-v 選項綁定掛載一個目錄/nginx/html 到容器看看

docker run -dt -v /nginx/html:/usr/share/nginx/html --name nginx nginx
登入後複製

透過docker inspect nginx 查看容器Mounts欄位

"Mounts": [
    {
        "Type": "bind",
        "Source": "/nginx/html",
        "Destination": "/usr/share/nginx/html",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],
登入後複製

接著我們在docker主機上建立一個index.html並寫入hello nginx,然後存取容器IP,顯然我們的掛載已經生效了。

[root@localhost ~]# echo "hello nginx" >  /nginx/html/index.html
[root@localhost ~]# curl 172.17.0.4
hello nginx
登入後複製

這裡有一個問題,我們可以透過docker主機修改檔案來使容器內檔案生效,反過來也一樣,容器可以修改、建立和刪除主機檔案系統上的內容。處理這個問題我們可以在建立容器的時候配置掛載目錄的權限,例如下面的唯讀權限:

docker run -dt -v /nginx/html:/usr/share/nginx/html:ro --name nginx nginx
登入後複製

所以在我們使用綁定掛載的時候,你操作的是主機檔案系統,你必須清楚如下:

你掛載的目錄包含哪些內容,以免對其他應用程式造成影響。

你的容器是否應該有權利操作這些目錄。

3.volumes資料卷

volume儲存卷由Docker 建立和管理,我們可以使用該docker volume create指令明確的建立卷,或在容器創建時創建卷。

[root@localhost ~]# docker volume create nginx_volume
nginx_volume
[root@localhost volumes]# docker inspect  nginx_volume
[
    {
        "CreatedAt": "2021-08-12T01:58:04-04:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data",
        "Name": "nginx_volume",
        "Options": {},
        "Scope": "local"
    }
]
登入後複製

可以看到掛載點處於docker的根目錄/var/lib/docker/volumes下

透過docker volume rm/prune 清除單一或所有未再使用的捲,可以透過docker 指令來管理磁碟區是對比綁定掛載的一個優點。

[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     owncloud-docker-server_files
local     owncloud-docker-server_mysql
local     owncloud-docker-server_redis
[root@localhost ~]# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
owncloud-docker-server_files
owncloud-docker-server_mysql
owncloud-docker-server_redis

Total reclaimed space: 199.4MB
登入後複製

在建立容器時如果未指定容器掛載的來源則docker會自動為我們建立一個匿名卷,同樣位於docker根目錄下。

[root@localhost volumes]# docker run -dt -v /usr/share/nginx/html --name nginx_with_volume nginx
d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6
[root@localhost volumes]# docker volume ls 
DRIVER    VOLUME NAME
local     d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980
local     nginx_volume
[root@localhost volumes]# ls /var/lib/docker/volumes/
backingFsBlockDev  d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980  metadata.db  nginx_volume
登入後複製

當我們建立掛載磁碟區之後,此時的儲存與bind mounts是一致,不過當docker 主機無法保證具有給定的目錄或檔案結構時,磁碟區可協助我們將docker 主機的配置與容器運作時分離。這樣一來當我們需要將資料從一台 Docker 主機備份、還原或遷移到另一台時,磁碟區就很方便了,可以脫離host path的限制。

在使用綁定掛載和磁碟區時我們要注意下面傳播覆蓋原則:

docker儲存有哪幾種方式

#掛載一個空磁碟區時:容器內目錄的內容會傳播(複製)到卷中。

綁定掛載或非空磁碟區時:容器內目錄的內容會被磁碟區或綁定的主機目錄覆寫。

4.tmpfs mount

tmpfs掛載僅適用於linux主機,當我們使用tmpfs掛載建立容器時,容器可以在容器的可寫入層之外創建文件。將資料保留在記憶體中,當容器停止時,寫入的資料也將被移除。主要用於臨時儲存不想保留在主機或容器可寫層中的敏感檔案。

透過--tmpfs選項掛載一個記憶體區塊。

docker run -dt --name busybox_tmpfs --tmpfs /etc/running busybox
登入後複製

透過--mount的方式帶上參數,指定暫存大小。

docker run -dt --name busybox_tmpfs2 --mount type=tmpfs,tmpfs-size=2048,destination=/etc/running busybox
登入後複製

儲存資料共享

#

在容器之间共享数据主要有两种方法,第一种比较简单,只需要将目录或者volume挂载到多个容器中即可。这里不做赘述,我们来看一下通过中间容器实现共享的方式。

我们创建一个中间容器,包含绑定挂载目录和一个卷。

docker create -v /share:/volume1 -v /volume2  --name volume_share  busybox
登入後複製

在我们需要共享的容器中通过选项--volumes-from拿过来用即可

docker run -d -t --volumes-from volume_share  --name container1  busybox
登入後複製

我们inspect检查一下Mounts字段,此时container1已经挂载到了一个bind目录和一个volume

"Mounts": [
    {
        "Type": "bind",
        "Source": "/share",
        "Destination": "/volume1",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    },
    {
        "Type": "volume",
        "Name": "21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e",
        "Source": "/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data",
        "Destination": "/volume2",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
登入後複製

推荐学习:《docker视频教程

以上是docker儲存有哪幾種方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

pycharm如何將project打包 pycharm如何將project打包 Apr 25, 2024 am 03:54 AM

在 PyCharm 中打包專案有四種方法:打包為單獨的執行檔:匯出為 EXE 單一檔案格式。打包為安裝程式:產生 Setuptools Makefile 並建置。打包為 Docker 映像:指定映像名稱、調整建置選項並建置。打包為容器:指定建置的鏡像、調整執行時間選項並啟動容器。

PHP 分散式系統架構與實務 PHP 分散式系統架構與實務 May 04, 2024 am 10:33 AM

PHP分散式系統架構透過將不同元件分佈在網路互聯的機器上實現可擴充性、效能和容錯性。該架構包括應用程式伺服器、訊息佇列、資料庫、快取和負載平衡器。將PHP應用程式遷移到分散式架構的步驟包括:識別服務邊界選擇訊息佇列系統採用微服務框架部署到容器管理服務發現

Docker三分鐘搞定LLama3開源大模型本地部署 Docker三分鐘搞定LLama3開源大模型本地部署 Apr 26, 2024 am 10:19 AM

概述LLaMA-3(LargeLanguageModelMetaAI3)是由Meta公司開發的大型開源生成式人工智慧模型。它在模型結構上與前一代LLaMA-2相比沒有太大的變動。 LLaMA-3模型分為不同規模的版本,包括小型、中型和大型,以適應不同的應用需求和運算資源。小型模型參參數規模為8B,中型模型參參數規模為70B,而大型模型參參數規模則達400B。然而在訓練中,目標是實現多模態、多語言的功能,預計結果將與GPT4/GPT4V相當。安裝OllamaOllama是一個開源的大型語言模型(LL

PHP 微服務容器化的敏捷開發與維 PHP 微服務容器化的敏捷開發與維 May 08, 2024 pm 02:21 PM

答案:PHP微服務採用HelmCharts部署進行敏捷開發,並使用DockerContainer容器化以實現隔離和可擴展性。詳細描述:使用HelmCharts自動​​部署PHP微服務,實現敏捷開發。 Docker映像允許對微服務進行快速迭代和版本控制。 DockerContainer標準隔離微服務,而Kubernetes負責管理容器的可用性和可擴充性。利用Prometheus和Grafana監控微服務效能和健康狀況,並創建警告和自動修復機制。

Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

deepseek怎麼安裝 deepseek怎麼安裝 Feb 19, 2025 pm 05:48 PM

DeepSeek的安裝方法有多種,包括:從源碼編譯(適用於經驗豐富的開發者)使用預編譯包(適用於Windows用戶)使用Docker容器(最便捷,無需擔心兼容性)無論選擇哪種方法,請仔細閱讀官方文檔並充分準備,避免不必要的麻煩。

如何透過容器化來優化 Java 函數的效能? 如何透過容器化來優化 Java 函數的效能? Apr 29, 2024 pm 03:09 PM

容器化透過以下方式提升Java函數效能:資源隔離-確保隔離的運算環境,避免資源爭用。輕量級-佔用較少系統資源,提高運行時效能。快速啟動-減少函數執行延遲。一致性-解耦應用程式和基礎設施,保證跨環境一致的行為。

使用Docker Container部署JavaEE應用程式 使用Docker Container部署JavaEE應用程式 Jun 05, 2024 pm 08:29 PM

使用Docker容器部署JavaEE應用程式:建立Dockerfile定義映像、建置映像、運行容器並映射端口,然後在瀏覽器中存取應用程式。範例JavaEE應用程式:RESTAPI與資料庫交互,透過Docker部署後可在localhost存取。

See all articles