『現學現忘』Docker基礎 — 33、Docker資料卷容器的說明與共享資料原理

繁華似錦Fighting發表於2022-03-28

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-fudocker02-zidocker03-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容器建立後,會掛載好volume01volume02兩個目錄。

然後我們在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檔案。

image

演示:

# 進入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容器之間是否還能夠同步資料。

image

演示:

# 1.刪除docker01-fu容器
[root@192 ~]# docker rm -f docker01-fu
docker01-fu

image

# 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-fromdocker03-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容器之間資料同步了。

參考:https://www.cnblogs.com/bixiaoyu/p/9069778.html

相關文章