搜尋
首頁運維Dockerdocker儲存有哪幾種方式

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
Docker和Kubernetes:構建可擴展應用程序Docker和Kubernetes:構建可擴展應用程序Apr 28, 2025 am 12:18 AM

使用Docker和Kubernetes可以構建可擴展的應用。 1)使用Dockerfile創建容器鏡像,2)通過kubectl命令部署Kubernetes的Deployment和Service,3)使用HorizontalPodAutoscaler實現自動擴展,從而構建高效、可擴展的應用架構。

Kubernetes和Docker:比較分析Kubernetes和Docker:比較分析Apr 27, 2025 am 12:05 AM

Docker和Kubernetes的主要區別在於:Docker用於容器化,Kubernetes用於容器編排。 1.Docker提供一致的環境來開發、測試和部署應用,通過容器實現隔離和資源限制。 2.Kubernetes管理容器化應用,提供自動化部署、擴展和管理功能,支持負載均衡和自動伸縮。兩者結合使用能提升應用的部署和管理效率。

在Linux上運行Docker:安裝和配置在Linux上運行Docker:安裝和配置Apr 26, 2025 am 12:12 AM

在Linux上安裝和配置Docker需要確保系統為64位且內核版本3.10及以上,使用命令“sudoapt-getupdate&&sudoapt-getinstalldocker-cedocker-ce-clicontainerd.io”安裝,並用“sudodockerrunhello-world”驗證。 Docker利用Linux內核的命名空間和控制組實現容器隔離和資源限制,鏡像是只讀模板,容器可進行修改。使用示例包括運行Nginx服務器和自定義Dockerfile創建鏡像。常見

為什麼要使用Docker?解釋的好處和優勢為什麼要使用Docker?解釋的好處和優勢Apr 25, 2025 am 12:05 AM

使用Docker的原因是它提供高效、便攜且一致的環境來打包、分發和運行應用程序。 1)Docker是一種容器化平台,允許開發者將應用程序及其依賴項打包到輕量級、可移植的容器中。 2)它基於Linux容器技術和聯合文件系統,確保快速啟動和高效運行。 3)Docker支持多階段構建,優化鏡像大小和部署速度。 4)使用Docker可以簡化開發和部署流程,提高效率並確保跨環境的一致性。

Docker在行動:現實世界中的示例和用例Docker在行動:現實世界中的示例和用例Apr 24, 2025 am 12:10 AM

Docker在實際項目中的應用場景包括簡化部署、管理多容器應用和性能優化。 1.Docker簡化了應用部署,如使用Dockerfile部署Node.js應用。 2.DockerCompose管理多容器應用,如微服務架構中的Web和數據庫服務。 3.性能優化使用多階段構建減小鏡像大小,並通過健康檢查監控容器狀態。

Docker vs. Kubernetes:用例和方案Docker vs. Kubernetes:用例和方案Apr 23, 2025 am 12:11 AM

在小型項目或開發環境中選擇Docker,在大型項目或生產環境中選擇Kubernetes。 1.Docker適合快速迭代和測試,2.Kubernetes提供強大的容器編排能力,適合管理和擴展大型應用。

Linux上的Docker:Linux系統的容器化Linux上的Docker:Linux系統的容器化Apr 22, 2025 am 12:03 AM

Docker在Linux上重要,因為Linux是其原生平台,提供了豐富的工具和社區支持。 1.安裝Docker:使用sudoapt-getupdate和sudoapt-getinstalldocker-cedocker-ce-clicontainerd.io。 2.創建和管理容器:使用dockerrun命令,如dockerrun-d--namemynginx-p80:80nginx。 3.編寫Dockerfile:優化鏡像大小,使用多階段構建。 4.優化和調試:使用dockerlogs和dockerex

Docker:容器化工具,Kubernetes:編排者Docker:容器化工具,Kubernetes:編排者Apr 21, 2025 am 12:01 AM

Docker是容器化工具,Kubernetes是容器編排工具。 1.Docker打包應用及其依賴成容器,可在任何支持Docker的環境中運行。 2.Kubernetes管理這些容器,實現自動化部署、擴展和管理,使應用高效運行。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1

記事本++7.3.1

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