『現學現忘』Docker基礎 — 33、Docker數據卷容器的說明與共享數據原理
- 2022 年 3 月 28 日
- 筆記
- 高級測試技能 - Docker基礎
1、數據卷容器的說明
(1)什麼是數據卷容器
一個容器中已經創建好的數據卷,其它容器通過這個容器實現數據共享。那麼這個容器,稱之為數據卷容器。(也可以說叫父容器)
(2)數據卷容器的作用
數據卷容器的作用就是,實現多個容器間的數據傳遞共享。
如果你有一些持續更新的數據需要在容器之間共享,最好創建數據卷容器。
數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。
(3)需要使用的Docker參數
--volumes-from
:容器間傳遞共享。
(4)補充:容器數據卷和數據卷容器的區別
Docker容器數據卷:
- 文件是數據持久化的最常見的保存方式。
由於文件系統的隔離,以及本身是以沙盒形式運行等性質,使其對保存需要持久化的數據並不穩定。
對此,Docker使用了數據卷這種專門定製的形式。 - 數據卷就是一個掛載在容器內文件或目錄。
在容器中,數據卷是從外界掛載到內部容器中的,所以可以脫離容器的生命周期而獨立存在。
正式由於數據卷的生命周期並不等同於容器的生命周期,在容器退或者是刪除之後,數據卷仍然不會受到影響,會依然存在於Docker中。
數據卷的特點:
數據卷中的數據並不能繼承於鏡像,也不在聯合文件系統臨時層所管理的範圍內,所以鏡像層面的寫時複製不會作用於數據卷中的數據,而這些數據也不會被docker commit
提交到新的鏡像中。
- 1)文件的操作不是在沙盒環境中進行的,而是直接作用於宿主機內真實的硬盤I/O中;
- 2)外界直接掛在到容器中,脫離了容器的生命的周期;
- 3)生命周期不受容器控制,能夠安全有效的存儲文件到數據卷中;
- 4)數據卷獨立於容器之外,可實現多個容器共享一個數據卷。
Docker數據卷容器:
將一個運行的容器作為數據卷,其他容器可以通過掛載這個容器(也叫父容器)實現數據共享。
優勢:
- 1)輕鬆的將數據卷進行歸類和匯總;
- 2)能夠更好的管理容器與數據卷之間的關係;
- 3)更加合理的控制數據卷的生命周期。
2、數據卷容器共享數據原理
我們以上一篇文章中創建的wukong/centos
鏡像為例,進行演示。
將會以wukong/centos
鏡像啟動三個容器:docker01-fu
、docker02-zi
、docker03-zi
。
操作1:
創建docker01-fu
容器,並操作。
# 1.查看本地docker鏡像
[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wukong/centos 1.0 98b1b6590b78 2 hours ago 209MB
centos latest 300e315adb2f 3 months ago 209MB
# 2.運行wukong/centos鏡像,創建docker01-fu容器
[root@192 ~]# docker run -it --name docker01-fu wukong/centos:1.0
# 3.查看該容器器內容
[root@d2ad442398d5 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Mar 19 14:37 dev
drwxr-xr-x. 1 root root 66 Mar 19 14:37 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 123 root root 0 Mar 19 14:37 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Mar 19 04:07 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
drwxr-xr-x. 2 root root 6 Mar 19 14:37 volume01 # 數據卷目錄
drwxr-xr-x. 2 root root 6 Mar 19 14:37 volume02 # 數據卷目錄
我們可以看到wukong/centos
容器創建後,會掛載好volume01
和volume02
兩個目錄。
然後我們在volume02
目錄中創建一個docker01-fu_add.txt
文件。
# 創建文件
[root@d2ad442398d5 /]# mkdir /volume02/docker01-fu_add.txt
# 查看文件中的內容
[root@d2ad442398d5 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
之後ctrl + P + Q
退出容器。
操作2:
創建docker02-zi
容器,並操作。
執行如下命令:
docker run -it --name docker02-zi \
--volumes-from docker01-fu \
wukong/centos:1.0
演示:
# 1.創建docker02-zi容器
[root@192 ~]# docker run -it --name docker02-zi \
> --volumes-from docker01-fu \
> wukong/centos:1.0
[root@0ce44b3e129e /]#
# 2.查看docker02-zi容器
[root@0ce44b3e129e /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Mar 19 14:56 dev
drwxr-xr-x. 1 root root 66 Mar 19 14:56 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 127 root root 0 Mar 19 14:56 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Mar 19 04:07 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
drwxr-xr-x. 2 root root 6 Mar 19 14:37 volume01
drwxr-xr-x. 3 root root 33 Mar 19 14:48 volume02
# 我們可以看到docker02-zi容器中,也有volume01和volume02目錄
# 因為他們是同一個鏡像創建的容器。
# 我們查看volume02目錄中的內容
[root@0ce44b3e129e /]# ls -l /volume02/
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
[root@0ce44b3e129e /]#
從上面看出,我們在新創建的docker02-zi
容器中的,/volume02/
數據卷目錄中發現,有docker01-fu
容器中創建的docker01-fu_add.txt
文件。
結論:docker01-fu
容器中創建的內容,同步到了docker02-zi
容器上面。
說明:
docker01-fu
容器就可以叫做父容器,也稱之為數據卷容器。即:通過
--volumes-from
我們就可以是容器間的數據共享了。
在docker02-zi
容器的/volume02/
目錄中創建docker02-zi_add.txt
文件。
# 創建文件
[root@0ce44b3e129e /]# mkdir /volume02/docker02-zi_add.txt
# 查看文件中的內容
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
之後ctrl + P + Q
退出容器。
操作3:
創建docker03-zi
容器,並操作。
執行如下命令:
docker run -it --name docker03-zi \
--volumes-from docker01-fu \
wukong/centos:1.0
演示:
# 1.創建docker03-zi容器
[root@192 ~]# docker run -it --name docker03-zi \
> --volumes-from docker01-fu \
> wukong/centos:1.0
[root@14e91c379eb0 /]#
# 2.我們查看volume02目錄中的內容
[root@14e91c379eb0 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
結論:我們可以看到新創建的docker03-zi
容器,同步了docker01-fu
容器和docker02-zi
容器中創建的文件。
我們在docker03-zi
容器中創建docker03-zi_add.txt
文件。
# 創建文件
[root@14e91c379eb0 /]# mkdir /volume02/docker03-zi_add.txt
# 查看文件中的內容
[root@14e91c379eb0 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
之後ctrl + P + Q
退出容器。
操作4:
我們再到docker01-fu
容器和docker02-zi
容器中,看看是否能夠同步到docker03-zi
容器中創建的docker03-zi_add.txt
文件。
演示:
# 進入docker01-fu容器
[root@192 ~]# docker attach docker01-fu
# 查看/volume02目錄中的內容
[root@d2ad442398d5 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
# `ctrl + P + Q`退出容器
# 進入docker01-fu容器
[root@192 ~]# docker attach docker02-zi
# 查看/volume02目錄中的內容
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
結論:我們從docker01-fu
容器和docker02-zi
容器中都可以看到,docker03-zi
容器中創建的docker03-zi_add.txt
文件。
說明:這三個容器可以之間可以互相同步數據。
操作5:
我們現在把docker01-fu
容器或直接刪除停掉,看看docker02-zi
容器和docker03-zi
容器之間是否還能夠同步數據。
演示:
# 1.刪除docker01-fu容器
[root@192 ~]# docker rm -f docker01-fu
docker01-fu
# 2.進入docker02-zi容器
[root@192 ~]# docker attach docker02-zi
# 3.查看/volume02目錄中內容,可以看到之前共享的數據還在。
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
# 4.在/volume02目錄中內容創建docker02-zi_update.txt文件
[root@0ce44b3e129e /]# mkdir /volume02/docker02-zi_update.txt
[root@0ce44b3e129e /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:56 docker02-zi_update.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
[root@0ce44b3e129e /]#
ctrl + P + Q
退出容器。
# 5.進入docker03-zi容器
[root@192 ~]# docker attach docker03-zi
# 6.查看/volume02目錄中的內容
[root@14e91c379eb0 /]# ls -l /volume02
total 0
drwxr-xr-x. 2 root root 6 Mar 19 14:48 docker01-fu_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:01 docker02-zi_add.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:56 docker02-zi_update.txt
drwxr-xr-x. 2 root root 6 Mar 19 15:15 docker03-zi_add.txt
[root@14e91c379eb0 /]#
結論:我們可以看到,刪除了docker01-fu
容器,原先三個容器同步的數據依然存在,並且docker02-zi
容器和docker03-zi
容器之間依然可以互相同步新增的數據。
操作6:
我們還可以繼續做如下操作,但是我們就進行敘述了,不進行代碼演示了。
步驟(1):如果在通過wukong/centos
鏡像,啟動一個docker04-zi
容器,--volumes-from
於docker03-zi
容器。
結論:docker04-zi
容器會和docker02-zi
容器、docker03-zi
容器,這三個容器之間互相同步數據。
步驟(2):如果按照操作(1)之後,把docker03-zi
容器刪除掉。
結論:docker04-zi
容器會和docker02-zi
容器之間依然互相同步,且所有的數據都會存在。
3、總結
數據卷容器的生命周期為一直持續到沒有容器使用它為止。
這相當於一種備份機制,可以利用數據卷容器來備份、恢復、遷移數據。
4、練習:MySQL實現數據共享
目標:多個MySQL實現數據共享。
以MySQL 5.7鏡像為例。
步驟1:啟動mysql-01鏡像。
docker run -p 3310:3306 \
--name mysql-01 \
-v /etc/mysql/conf.d \
-v /var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
以匿名掛載的方式實現數據卷掛載。
步驟2:啟動mysql-02鏡像。
docker run -p 3310:3306 \
--name mysql-02 --volumes-from mysql-01 \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
這個時候,就可以實現兩個MySQL容器之間數據同步了。