Docker容器數據持久化存儲機制


一、Docker容器數據持久化存儲介紹

1、物理機或虛擬機數據持久化存儲

由於物理機或虛擬機本身就擁有大容量的磁盤,所以可以直接把數據存儲在物理機或虛擬機本地文件系統中,也可以通過使用額外的存儲系統(NFS、GlusterFS、Ceph等)來完成數據持久化存儲。

2、Docker容器數據持久化存儲

由於Docker容器是由容器鏡像生成的,所以一般容器鏡像中包含什麼文件或目錄,在容器啓動後,我們依舊可以看到相同的文件或目錄。

由於Docker容器屬於“用後即焚”型計算資源,因此Docker容器做數據持久化存儲需掛載宿主機數據卷


二、Docker容器數據持久化存儲方式

Docker提供三種方式將數據從宿主機掛載到容器中:


1、docker run -v

運行容器時,直接掛載本地目錄至容器中

2、volumes

Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)

是Docker默認存儲數據方式

3、bind mounts

作用同docker run -v

三、Docker容器數據持久化存儲案例

1、docker run -v

(1) 掛載本地目錄

創建本地目錄

# mkdir /opt/web1root

向本地目錄中添加index.html文件

# echo 'web1-page' > /opt/web1root/index.html

運行web1容器,把/opt/web1root目錄掛載到/usr/share/nginx/html目錄中

# docker run -d  --name web1-v /opt/web1root/:/usr/share/nginx/html/ nginx:1.20

使用curl命令訪問容器

# curl http://容器ip


(2) 未創建本地目錄(系統將自動創建)

運行web2容器,掛載未創建的本地目錄,啓動容器時將自動創建本地目錄

# docker run -d --name web2-v /opt/web2root/:/usr/share/nginx/html/ nginx:1.20

往自動創建的目錄中添加一個index.html文件

# echo "web2-page" > /opt/web2root/index.html

在容器中執行查看文件命令

# docker exec web2cat /usr/share/nginx/html/index.html

使用curl命令訪問容器

# curl http://容器ip


2、Volumes數據卷

(1) 創建數據卷

創建一個名稱為nginx-vol的數據卷

# docker volume create nginx-vol

確認數據卷創建後的位置

# ls /var/lib/docker/volumes/

查看已經創建數據卷

# docker volume ls

查看數據卷詳細信息

# docker volume inspect nginx-vol

{

。。。

"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",

"Name": "nginx-vol",

。。。

}

(2) 使用數據卷

運行web3容器,使用--mount選項,實現數據卷掛載

# docker run -d --name web3--mount src=nginx-vol,dst=/usr/share/nginx/html nginx:1.20

或運行web3容器,使用-v選項,實現數據卷掛載

# docker run -d --name web3-v nginx-vol:/usr/share/nginx/html/ nginx:1.20

查看容器運行後數據卷中文件或子目錄

# ls /var/lib/docker/volumes/nginx-vol/_data/

使用curl命令訪問容器

# curl http://容器ip

修改index.html文件內容

# echo "web3-page" > /var/lib/docker/volumes/nginx-vol/_data/index.html

再次使用curl命令訪問容器

# curl http://容器ip


3、bind mounts(同docker run -v)

創建用於容器掛載的目錄web4root

# mkdir /opt/web4root

運行web4容器並使用bind mount方法實現本地任意目錄掛載

# docker run -d --name web4--mount type=bind,src=/opt/web4root,dst=/usr/share/nginx/html nginx:1.20

查看已掛載目錄,裏面沒有任何數據

# ls /opt/web4root/

添加內容至/opt/web4root/index.html中

# echo "web4-page" > /opt/web4root/index.html

使用curl命令訪問容器

# curl http://容器ip

 至此docker的持久化存儲就完成了,文件中的地址僅為實驗時所使用的地址,具體地址還需看具體實施環境,請勿直接複製粘貼

在真實環境中,有幾個需要注意的點:

1、生命週期:volumes的生命週期與容器的生命週期分離,即使刪除所有關聯的容器,volume依然存在,除非顯式地: docker   volume  prune 

2、可移植性:通過docker  volume create 創建的卷,可以在多個容器之間安全的共享和複用。

3、備份與遷移:在實踐環境中,最重要的就是備份,備份是保障我們進行任何操作的最後手段,docker的持久化存儲中數據存儲在宿主機的特定目錄(通常是 /var/lib/docker/volumes/),便於通過文件系統工具(如tar,rsync)進行備份和遷移。

4、bind mounts:綁定掛載依賴於宿主機的配置與結構,這會破壞容器的可移植性,我們每個人的應用配置和代碼可能依賴於宿主機上的特定路徑,使得鏡像無法在其他環境中直接運行

        權限問題:容器內進程對文件的訪問權限完全取決於宿主機上該文件或目錄的權限設置,非常容易導致權限錯誤,需要仔細規劃用户和組ID,最好是專門記在筆記裏。

5、tmpfs mounts :內存掛載不會持久化到磁盤,這種掛載方式僅用於臨時存儲,或者是存儲一些不需要持久化的數據,比如session數據、臨時緩存等,不需要把所有東西都持久化到磁盤,減少磁盤的壓力,用來提升性能和保護敏感信息。不過這種掛載方式若是容器停止或重啓的話,數據就丟失了,所以該備份還是需要備份。

一個建議:生產環境中,請優先使用volumes,只有在需要與宿主機進行特定文件共享(比如傳遞配置文件、開發時代碼熱重載時),才考慮用Bind mounts。

至於備份:

數據持久化了,如何保證數據的安全?那就是備份。

volume的備份:由於volume由docker管理,不能直接cp,標準的備份流程是:

1、運行一個臨時容器,掛載需要備份的volume和一個用於存放備份文件的bind mount目錄。

2、在容器內使用tar或rsync,將volume數據打包到bind mount目錄

(docker run --rm -v my_volume:/data -v /host/backup:/backup alpine \

        tar -czf /backup/my_volume_backup.tar.gz -C /data .)

恢復:備份的恢復就是反向操作,將備份的文件解壓到一個新的volume中。

存儲策略:將volume配置在可靠的或者是隻有自己知道的存儲後端,比如RAID陣列、雲盤等等,並制定定期的快照和備份策略。

我找了一個圖,大概能總結一下。

Docker容器數據持久化存儲機制_docker