Docker的數據管理(數據卷+數據卷容器)

文章目錄

    • 一、Docker的數據管理
      • 1、概述
      • 2、主要的技術(三種數據掛載方式)
        • 2.1、數據卷(Volumes)
        • 2.2、綁定掛載(Bind mounts)
        • 2.3、tmpfs掛載(Tmpfs mounts)
        • 2.4、之間的關系(數據在Docker主機上的存儲位置)
    • 二、數據卷示例
      • 1、創建一個命名的數據卷
      • 2、修改數據卷內文件內容
      • 3、啟動兩個容器并驗證數據共享
      • 4、宿主機與容器間的實時同步
        • 4.1、進入容器內部修改數據測試同步
        • 4.2、宿主機修改數據測試同步
      • 5、刪除容器驗證數據持久性
      • 6、只讀掛載
    • 三、數據卷案例:5.6版本MySQL數據遷移到MySQL5.7版本
      • 1、創建一個命名的數據卷
      • 2、Docker安裝MySQL5.6版本
      • 3、進入容器創建數據
      • 4、刪除mysql-5.6容器
      • 5、Docker安裝MySQL5.7版本
      • 6、進入容器進行驗證
    • 四、數據卷容器
      • 1、概述
      • 2、創建數據卷
      • 3、查看所有的數據卷
      • 4、修改數據卷內文件內容
      • 5、啟動一個掛載數據卷的容器
      • 6、啟動兩個客戶端容器
      • 7、訪問測試
      • 8、停止了卷容器創建新容器也可以引用他
      • 9、刪除卷容器后無法依據卷容器創建新容器

一、Docker的數據管理

1、概述

Docker的數據管理是指在Docker容器中對數據進行存儲、共享、備份和持久化的方法和技術。它允許用戶在保持容器輕量級的同時,確保容器產生的數據能夠安全、高效地存儲和管理。

2、主要的技術(三種數據掛載方式)

2.1、數據卷(Volumes)
  • 數據卷是Docker管理的、獨立于容器的存儲區域,提供了數據持久化和容器間共享的能力。
  • 數據卷存儲在Docker主機上的特定目錄,默認是 /var/lib/docker/volumes/(Linux系統),并且可以在容器間共享而不依賴于任何單一容器的生命周期。
  • 即使容器被刪除,數據依然存在。
2.2、綁定掛載(Bind mounts)
  • 綁定掛載是將宿主機上的文件系統路徑直接掛載到容器內的過程。
  • 這種方式允許直接利用宿主機的文件系統資源,但可能帶來數據管理上的復雜性和安全性考量。
  • 綁定掛載的存儲位置和數據格式完全由宿主機控制,不受到Docker的直接管理。
2.3、tmpfs掛載(Tmpfs mounts)
  • Tmpfs掛載是將數據存儲在宿主機的內存中而不是磁盤上,適用于臨時文件或對速度有高要求的場景。
  • 這種類型的存儲不會持久化,容器停止或宿主機重啟后數據將會丟失。
  • 適合存儲敏感信息或緩存數據,因其不會寫入磁盤,可以增加安全性。
2.4、之間的關系(數據在Docker主機上的存儲位置)

Types of mounts and where they live on the Docker host


這篇我們主要學習數據卷

二、數據卷示例

1、創建一個命名的數據卷

[root@localhost ~]# docker volume create web_data
web_data

2、修改數據卷內文件內容

[root@localhost ~]# docker volume inspect web_data
[{"CreatedAt": "2024-05-29T19:04:36+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/web_data/_data","Name": "web_data","Options": null,"Scope": "local"}
]
#這里的/var/lib/docker/volumes/web_data/_data就是數據卷在宿主機上的路徑。[root@localhost ~]# echo "nginx test" > /var/lib/docker/volumes/web_data/_data/index.html
#直接在宿主機上通過找到的路徑修改數據卷內的文件。

3、啟動兩個容器并驗證數據共享

[root@localhost ~]# docker run -itd --name nginx_v1 -v web_data:/usr/share/nginx/html -p 8085:80 nginx
73a584b4345b6bb05f99e153f5a92e1aaaf14b183ffb2173cd4238e1bd4edf60
[root@localhost ~]# docker run -itd --name nginx_v2 -v web_data:/usr/share/nginx/html -p 8086:80 nginx
5ce93af52b15d0f905fb749c483138f7e3247995186b9696709b3bd166bc10f6
[root@localhost ~]# curl -s 192.168.112.60:8085
nginx test
[root@localhost ~]# curl -s 192.168.112.60:8086
nginx test

image-20240529181720330

掛載在了相同宿主機目錄到容器內的/usr/share/nginx/html路徑,同時映射了不同的端口以區分訪問。

可以看到數據內容是可以共享的,都顯示nginx test

4、宿主機與容器間的實時同步

4.1、進入容器內部修改數據測試同步
[root@localhost ~]# docker exec -it nginx_v1 /bin/bash
root@73a584b4345b:/# echo "nginx test write !" > /usr/share/nginx/html/index.html
root@73a584b4345b:/# exit
exit
[root@localhost ~]# curl -s 192.168.112.60:8085
nginx test write !
[root@localhost ~]# curl -s 192.168.112.60:8086
nginx test write !

image-20240529182703059

4.2、宿主機修改數據測試同步
[root@localhost ~]# echo "nginx test write twice" > /var/lib/docker/volumes/web_data/_data/index.html
[root@localhost ~]# curl -s 192.168.112.60:8085                                                             nginx test write twice
[root@localhost ~]# curl -s 192.168.112.60:8086                                                           nginx test write twice

image-20240529183037863

5、刪除容器驗證數據持久性

[root@localhost ~]# docker rm -fv  `docker ps -qa`
5ce93af52b15
73a584b4345b
#這是刪除所有容器的命令針對刪除nginx_v1以及nginx_v2的命令如下:
docker rm -fv nginx_v1
docker rm -fv nginx_v2[root@localhost ~]# cat /var/lib/docker/volumes/web_data/_data/index.html
nginx test write twice

可以看到即使所有使用該數據卷的容器都被刪除,數據卷本身及其數據依然會被保留

直到顯式執行 docker volume rm 命令來刪除它。

6、只讀掛載

[root@localhost ~]# docker run -itd --name nginx_v3 -v web_data:/usr/share/nginx/html/:ro -p 8087:80 nginx
64737fc7e6fc60e6d4f6203735afb464bc3cdbacbacb92372e3112d35a3d1be8
[root@localhost ~]# docker run -itd --name nginx_v4 -v web_data:/usr/share/nginx/html/:ro -p 8088:80 nginx
fbb5c0dc949b2fca4d9e39b392d535233dfa57b48f348c028d1518cebd7a3560
[root@localhost ~]# docker exec -it nginx_v3 /bin/bash
root@64737fc7e6fc:/# echo "test readonly" > /usr/share/nginx/html/index.html
bash: /usr/share/nginx/html/index.html: Read-only file system

通過只讀方式掛載以后,在容器內部是不允許修改數據的

三、數據卷案例:5.6版本MySQL數據遷移到MySQL5.7版本

1、創建一個命名的數據卷

[root@localhost ~]# docker volume create mysql_data
mysql_data

2、Docker安裝MySQL5.6版本

[root@localhost ~]# docker run -d --name mysql-5.6 -p 3306:6606 -v mysql_data:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123 mysql:5.6
[root@localhost ~]# cd /var/lib/docker/volumes/mysql_data/_data/
[root@localhost _data]# ls
auto.cnf  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema
  • -d: 表示后臺運行容器(detached模式),即容器會在后臺運行而不是與當前終端交互。
  • --name mysql-5.6: 為容器指定一個名字,這里是mysql-5.6,便于后續管理和識別。
  • -p 3306:3306: 端口映射配置,將宿主機的3306端口映射到容器內的3306端口。
  • -v mysql_data:/var/lib/mysql/: 數據卷掛載,mysql_data是數據卷的名稱(如果沒有事先創建,Docker會自動創建一個匿名數據卷),這個數據卷掛載到容器內的/var/lib/mysql/目錄。
  • -e MYSQL_ROOT_PASSWORD=123: 設置環境變量,這里設置了MySQL的root用戶的密碼為123
  • mysql:5.6: 這是Docker鏡像的名稱和標簽,表示使用mysql鏡像的5.6版本來創建容器。

3、進入容器創建數據

[root@localhost _data]# docker exec -it mysql-5.6 /bin/bash
root@7ef4b48ecbcf:/# cd /var/lib/mysql
root@7ef4b48ecbcf:/var/lib/mysql# ls
auto.cnf  ib_logfile0  ib_logfile1  ibdata1  mysql  performance_schema
root@7ef4b48ecbcf:/var/lib/mysql# mysql -uroot -p123
mysql> create database test;
mysql> use test;
mysql> create table stu (id int(5),name varchar(20),age int(5));
mysql> insert into stu values(1,"zhangsan",18);

創建了個stu表插入了一條數據

4、刪除mysql-5.6容器

docker rm -f mysql-5.6

5、Docker安裝MySQL5.7版本

[root@localhost ~]# docker run -d --privileged=true --name mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 -v mysql_data:/var/lib/mysql/ mysql:5.7

6、進入容器進行驗證

[root@localhost ~]# docker exec -it mysql-5.7 /bin/bash
bash-4.2# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| stu            |
+----------------+
1 row in set (0.00 sec)mysql> select * from stu;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   18 |
+------+----------+------+
1 row in set (0.00 sec)

可以看到之前mysql-5.6創建的數據還在

四、數據卷容器

1、概述

數據卷容器是Docker中管理數據卷的一種高級用法,它允許用戶創建一個專門用于數據存儲的容器,并將其數據卷掛載到其他容器中。

這種方式使得數據可以跨容器共享,同時保持數據的持久性和可移植性。

數據卷容器主要用于數據的持久化存儲和跨容器共享,它本身并不運行任何實際的應用服務,而是作為一個存儲媒介存在。

2、創建數據卷

[root@localhost ~]# docker volume create my_volume
my_volume

3、查看所有的數據卷

[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     my_volume
local     mysql_data
local     web_data

4、修改數據卷內文件內容

[root@localhost ~]# echo "my_volume_test" > /var/lib/docker/volumes/my_volume/_data/index.html

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

[root@localhost ~]# docker run -itd --name volume_v1 -v my_volume:/usr/share/nginx/html:ro -p 8089:80 nginx
c9cff2a314fef930aa570680068e40c280a53d0921613b60d926c9ffd185200b

6、啟動兩個客戶端容器

[root@localhost ~]# docker run -itd --name web1 -p 8090:80 --volumes-from volume_v1 nginx
c036bb587750c2232e7e1efe11b4b421e2c0be275a0aec6da953e670ba6d47b0
[root@localhost ~]# docker run -itd --name web2 -p 8091:80 --volumes-from volume_v1 nginx
9bff8f66a04d701b46f6e94d39664758e22fa4ab6140dd48a1ce0212bb59b941

7、訪問測試

[root@localhost ~]# curl -s 192.168.112.60:8089
my_volume_test
[root@localhost ~]# curl -s 192.168.112.60:8090
my_volume_test
[root@localhost ~]# curl -s 192.168.112.60:8091
my_volume_test

image-20240529231724908

8、停止了卷容器創建新容器也可以引用他

[root@localhost ~]# docker stop volume_v1
volume_v1
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS                     PORTS                                   NAMES
9bff8f66a04d   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes               0.0.0.0:8091->80/tcp, :::8091->80/tcp   web2
c036bb587750   nginx     "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes               0.0.0.0:8090->80/tcp, :::8090->80/tcp   web1
c9cff2a314fe   nginx     "/docker-entrypoint.…"   8 minutes ago   Exited (0) 4 seconds ago                                           volume_v1
#停止卷容器volume_v1[root@localhost ~]# docker run -itd --name web3 -p 8092:80 --volumes-from volume_v1 nginx
7e8a3e82e6aacf32e5194d4a47d827f718685e0811ffc478b09a6e1748fd997f
[root@localhost ~]# curl -s 192.168.112.60:8092
my_volume_test
#可以獲取my_volume數據卷的內容

9、刪除卷容器后無法依據卷容器創建新容器

[root@localhost ~]# docker rm -f volume_v1
volume_v1
[root@localhost ~]# docker run -itd --name web4 -p 8093:80 --volumes-from volume_v1 nginx
docker: Error response from daemon: No such container: volume_v1.
See 'docker run --help'.[root@localhost ~]# curl 192.168.112.60:8089
curl: (7) Failed connect to 192.168.112.60:8089; 拒絕連接
[root@localhost ~]# curl 192.168.112.60:8090
my_volume_test
[root@localhost ~]# curl 192.168.112.60:8091
my_volume_test
[root@localhost ~]# curl 192.168.112.60:8092
my_volume_test
#之前創建好的容器不會有任何影響

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19548.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

偏微分方程算法之二階雙曲型方程交替方向隱格式(變形一)

目錄 一、研究目標 二、變形 三、算例實現 四、計算結果 本專欄介紹了二階雙曲型偏微分方程的交替方向隱格式的介紹和推導(鏈接如下),本節將進一步研究二維雙曲型方程初邊值問題其它的交替方向隱格式。

示例丨醫學、醫藥類查新點填寫參考案例

根據《科技查新技術規范》GB/T 32003-2015,科學技術要點是必須要包含查新點內容的,而查新點就是科學技術要點中能夠體現查新項目新穎性和技術進步的技術特征點。 在日常查新工作的接待中,我們發現醫學、醫藥類查新合同上查新點的書寫&#x…

計算機tcp/ip網絡通信過程

目錄 (1)同一網段兩臺計算機通信過程 (2)不同網段的兩臺計算機通信過程 (3)目的主機收到數據包后的解包過程 (1)同一網段兩臺計算機通信過程 如果兩臺計算機在同一個局域網中的同…

算法(九)希爾排序

文章目錄 希爾排序簡介代碼實現 希爾排序簡介 希爾排序(shell sort)選定一個小于N(數列長度)的整數gap作為第一增量,然后將所有距離為gap的元素分成一組,然后對每一組的元素進行插入排序。然后再取一個比前…

(1+X)Java程序設計高級(一)

Throwable:異常的基類,所有異常都繼承自 java.lang.Throwable 類,Throwable 類有兩個直接子類:Error 類和 Exception 類。Error:是 Java 應用程序本身無法恢復的嚴重錯誤,應用程序不需要捕獲、處理這些嚴重…

7.1 Go 錯誤的概念

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:「stormsha的主頁」…

【SQL每日一練】查詢二進制樹節點

文章目錄 題目一、題析二、題解1.MySQL/SqlServer2.Oracle 題目 有一個表BST,其中包含兩列:N和P,其中N表示二進制樹中節點的值,P是N的父級。 編寫一個查詢,以查找按節點值排序的二進制樹的節點類型。為每個節點輸出以…

迅狐跨境電商系統源碼:技術棧與多端集成

隨著全球化貿易的不斷深入,跨境電商系統源碼成為了連接不同國家和地區消費者與商家的重要橋梁。本文將探討跨境電商系統源碼的技術棧以及如何通過多端集成來提升用戶體驗。 技術棧概覽 跨境電商系統源碼的技術棧是構建高效、穩定平臺的基礎。以下是構建跨境電商系…

IP65 IP45 IP68等等數字防護等級

第一個數字的代表意義 : 0 表示無防護 ,對外界的人或物無特殊之防護 1. 表示防止大于50mm的固體物體侵入 ,防止人體(如手掌)因意外而接觸,內部之零件。防止較大尺寸(直徑大于50mm)的…

Oracle數據塊如何存儲真實數據

上周休假了幾天,頹廢了,沒有輸出。今天寫一點內容。 先拋出一個問題。表中的數據在Oracle數據塊中是如何存儲的呢?今天簡單說一下這個問題。通常數據庫中的表會存儲字符,數字,日期 這3種常見的數據類型。下面的例子就用這3種數據類型作說明 首先,Oracle數據塊底層存儲這…

Github 2024-05-31開源項目日報 Top10

根據Github Trendings的統計,今日(2024-05-31統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目4TypeScript項目3Jupyter Notebook項目2Vue項目1Cuda項目1Elixir項目1簡單、純凈的C/CUDA中的LLM培訓 創建周期:3 天開發語言:Cuda…

OpenCV中的圓形標靶檢測——背景概述

圓形標靶 如下圖所示,相機標定中我們使用帶有固定間距圖案陣列的平板,來得到高精度的標靶像素坐標,進而計算得到相機的內參、畸變系數,相機之間的變換關系,和相機與世界坐標系的變換關系(即外參)。 不過標靶的形式多樣,從圖案類型來看常見的有棋盤格、圓形標靶…

自然語言處理(NLP)神經網絡的數據預處理步驟

1. 文本清理(Text Cleaning) 目的:去除文本中的噪音和無關內容,確保輸入數據的質量和一致性。 方法: 去除標點符號:刪除文本中的標點符號(視任務需求,某些標點符號可能保留&#…

音視頻開發13 FFmpeg 音頻 相關格式分析 -- AAC ADTS格式分析

這一節,我們學習常用的音頻的格式 AAC,重點是掌握 AAC的傳輸格式 ADTS 頭部的信息,目的是 : 當音頻數據有問題的時候,如果是AAC的編碼,在分析 頭部信息的時候能夠根據頭部信息 判斷問題是否出現在 頭部。 A…

今天來講講,抖音小店商品的上架流程以及優化細節~

大家好,我是噴火龍。 做抖音小店選品選好之后,優化上架商品也是很重要的,也有很多需要注意的細節,今天就來給大家講講。 首先,軟件采集,大致分為七步。 1. 以抖精靈為例,注冊賬號登錄&#x…

到無窮大和更遠,用分形更好

文章目錄 一、說明二、分形到底是什么?三、更多更深刻的四、引進無窮小會產生什么樣的怪事?五、希爾伯特曲線六、還有什么有趣的要補充的嗎? 一、說明 ???????數學領域有太多有趣的領域,領域我特別感興趣。這是一個奇妙的…

orm 查詢

問題 rayon,city 地區和市 地區不會空 市可能會空 job_name 工作名稱 可能會空 envalid_date 有效期間 一天 一個星期 一個月 不限 四種 offset 分頁的每次獲取20條數據 在ORM(對象關系映射)查詢中,您需要根據提…

代碼隨想錄算法訓練營day41 | 509. 斐波那契數、70. 爬樓梯、746. 使用最小花費爬樓梯

理論基礎 動態規劃中每一個狀態一定是由上一個狀態推導出來的,這一點就區分于貪心,貪心沒有狀態推導,而是從局部直接選最優的 動態規劃的解題步驟 確定dp數組(dp table)以及下標的含義確定遞推公式dp數組如何初始化確定…

怎么看自己電腦的配置?提升電腦的使用效率

了解自己電腦的配置是非常重要的,它可以幫助您了解電腦的性能水平,從而更好地選擇適合的軟件和游戲,或者進行系統升級和維護。然而,許多用戶可能不知道怎么看自己電腦的配置信息。本文將介紹三種簡單的方法,幫助您輕松…

android studio修改字體大小

android studio修改菜單欄、工具欄字體大小 android studio修改編輯框字體大小