『現學現忘』Docker基礎 — 33、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-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容器之間數據同步了。

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