Docker資料管理(資料卷+資料卷容器)

misakivv發表於2024-05-29

目錄
  • 一、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 -A

Database 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
#之前建立好的容器不會有任何影響

相關文章