文章目錄
- 一、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主機上的存儲位置)
這篇我們主要學習數據卷
二、數據卷示例
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
掛載在了相同宿主機目錄到容器內的
/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 !
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
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
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
#之前創建好的容器不會有任何影響