Docker學(xué)習(xí)五、docker容器數(shù)據(jù)卷

前言、Docker中的數(shù)據(jù)管理

Docker鏡像是由多個(gè)只讀層疊加而成,啟動(dòng)容器時(shí),Docker會(huì)加載只讀層并會(huì)在鏡像棧頂部添加一個(gè)讀寫層,如果運(yùn)行中的容器修改了現(xiàn)有的一個(gè)文件,那么該文件就會(huì)從只讀層復(fù)制一份到讀寫層中,該文件的只讀版本仍然存在,只是已經(jīng)被讀寫層中該文件的副本所隱藏,這就是docker的寫時(shí)復(fù)制機(jī)制。關(guān)閉重啟容器,其數(shù)據(jù)不受影響,但是刪除容器時(shí),其改變的讀寫層數(shù)據(jù)就會(huì)丟失。

圖片.png

容器在運(yùn)行項(xiàng)目時(shí)會(huì)產(chǎn)生數(shù)據(jù),比如運(yùn)行的mysql容器,那么一定會(huì)有數(shù)據(jù)的產(chǎn)生,那么問(wèn)題來(lái)了,數(shù)據(jù)是保存在容器內(nèi)部還是保存在外部?如果將數(shù)據(jù)保存在內(nèi)部,那么也就意味著我們改變了原有鏡像,這種做法是不可取的,因?yàn)樵诤笃诘溺R像升級(jí)將變得不可能了。除非我們?cè)诟淖冪R像后commit提交打成一個(gè)新的鏡像。顯然,數(shù)據(jù)是應(yīng)該保存在容器的外部,也就是說(shuō)保存在主機(jī)上。那么問(wèn)題又來(lái)了,數(shù)據(jù)保存在主機(jī)上,那么容器該如何讀取主機(jī)中的數(shù)據(jù)呢?

為了能夠持久化數(shù)據(jù)以及共享容器間的數(shù)據(jù),Docker提出了Volume的概念。簡(jiǎn)單來(lái)說(shuō),Volume就是目錄或者文件,它可以繞過(guò)默認(rèn)的聯(lián)合文件系統(tǒng),而以正常的文件或者目錄的形式存在于宿主機(jī)上。

容器中管理數(shù)據(jù)主要有兩種方式:

  • 數(shù)據(jù)卷(Data volumes):容器內(nèi)數(shù)據(jù)直接映射到本地主機(jī)環(huán)境
  • 數(shù)據(jù)卷容器(Data Volume Containers):使用特定容器維護(hù)數(shù)據(jù)卷,數(shù)據(jù)卷容器掛載數(shù)據(jù)卷,其他容器通過(guò)掛載數(shù)據(jù)卷容器實(shí)現(xiàn)數(shù)據(jù)傳遞共享

一、數(shù)據(jù)卷的概念

數(shù)據(jù)卷就是由docker掛載到容器中的目錄或者文件,但是不屬于UnionFS。數(shù)據(jù)卷的生命周期完全獨(dú)立于容器,docker不會(huì)在容器被刪除時(shí)而刪除其掛載的數(shù)據(jù)卷,因此可以實(shí)現(xiàn)持久化或共享數(shù)據(jù)。

特點(diǎn):

  • 數(shù)據(jù)卷可以在不同容器之間共享或重用數(shù)據(jù)
  • 數(shù)據(jù)卷中的更改直接生效
  • 數(shù)據(jù)卷中的更改不會(huì)包含在鏡像的更新之中

1-1、創(chuàng)建容器時(shí)添加數(shù)據(jù)卷

數(shù)據(jù)卷是一個(gè)可供容器使用的特殊目錄,它將主機(jī)操作系統(tǒng)目錄直接映射進(jìn)容器,類似于linux中的mount操作。在create或者run容器時(shí),可以通過(guò)-v參數(shù)指定主機(jī)的目錄,掛載到容器中的某一個(gè)目錄上,這樣,容器就在這個(gè)目錄讀寫數(shù)據(jù)了。從而實(shí)現(xiàn)了容器和數(shù)據(jù)的分離。例如:

docker run --name 容器名 -v /宿主機(jī)絕對(duì)路徑:/容器內(nèi)路徑 鏡像名

docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

二、Docker實(shí)戰(zhàn)案例五:Docker安裝MySQL實(shí)現(xiàn)宿主機(jī)和容器之間的數(shù)據(jù)共享

2-1、查找鏡像

docker search mysql
圖片.png

2-2、拉取鏡像

docker pull mysql

默認(rèn)拉取tag為latest的mysql官方鏡像

latest: Pulling from library/mysql
683abbb4ea60: Pull complete 
0550d17aeefa: Pull complete 
7e26605ddd77: Pull complete 
9882737bd15f: Pull complete 
999c06ab75f6: Pull complete 
c71d695f9937: Pull complete 
c38f847c1491: Pull complete 
5e0cb05a8fc3: Pull complete 
c89e3e373fca: Pull complete 
fa39a2c9922d: Pull complete 
b293d9c897c4: Pull complete 
3dc061869740: Pull complete 
Digest: sha256:43ed4f8c9d1695e97a39cdfe9475af9096e3723cfb79d820d8da00d61a277a85
Status: Downloaded newer image for mysql:latest

2-3、創(chuàng)建容器

新建本地映射到docker鏡像的mysql文件目錄,/mysql/conf、/mysql/logs、/mysql/data。

圖片.png

使用如下命令將提前創(chuàng)建好的/mysql/conf、/mysql/logs、/mysql/data掛載到容器中MySQL對(duì)應(yīng)的目錄中:

docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

2-4、查看并驗(yàn)證

查看MySQL容器是否正常運(yùn)行:

圖片.png

進(jìn)入容器內(nèi)部并進(jìn)入MySQL:

圖片.png

三、數(shù)據(jù)卷容器

如果用戶需要在多個(gè)容器之間共享一些持續(xù)更新的數(shù)據(jù),最簡(jiǎn)單的方式是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器也是一個(gè)容器,但是它的目的是專門用來(lái)提供數(shù)據(jù)卷供其他容器掛載。如果要授權(quán)一個(gè)容器訪問(wèn)另一個(gè)容器的Volume,我們可以使用--volumes-from參數(shù)來(lái)實(shí)現(xiàn)。可以使用數(shù)據(jù)卷容器對(duì)其中的數(shù)據(jù)卷進(jìn)行備份、恢復(fù)、以實(shí)現(xiàn)數(shù)據(jù)的遷移。

首先創(chuàng)建一個(gè)數(shù)據(jù)卷容器dbdata,并在其中創(chuàng)建一個(gè)數(shù)據(jù)卷掛載到/dbdata。

//創(chuàng)建一個(gè)數(shù)據(jù)卷容器
[root@xxx ~]# docker run -it -v /dbdata --name dbdata ubuntu

//查看目錄
root@d4bb57243d45:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

然后,可以在其他容器中使用--volumes-from來(lái)掛載dbdata容器中的數(shù)據(jù)卷,例如創(chuàng)建db1和db2兩個(gè)容器,并從dbdata容器掛載數(shù)據(jù)卷:

// 創(chuàng)建2個(gè)容器掛載dbdata容器中的數(shù)據(jù)卷
[root@xxx ~]# docker run -it --volumes-from dbdata --name db1 ubuntu
[root@xxx ~]# docker run -it --volumes-from dbdata --name db2 ubuntu

此時(shí),容器db1和容器db2都掛載同一個(gè)數(shù)據(jù)卷到相同的dbdata目錄。三個(gè)容器任何一方在該目錄下的寫入,其他容器都可以看到。例如,在dbdata容器中創(chuàng)建一個(gè)test文件,在db1容器中可能查看到它:

//在dbdata容器的數(shù)據(jù)卷中創(chuàng)建文件a
root@9e90f695bcb8:/dbdata# touch a
root@9e90f695bcb8:/dbdata# ll
total 4
drwxr-xr-x.  2 root root   14 Apr 14 10:02 ./
drwxr-xr-x. 22 root root 4096 Apr 14 10:01 ../
-rw-r--r--.  1 root root    0 Apr 14 10:02 a

//在db1容器中查看數(shù)據(jù)卷目錄dbdata,也發(fā)現(xiàn)了文件a
root@ab4426a23cb4:/dbdata# ll
total 4
drwxr-xr-x.  2 root root    6 Apr 14 10:01 ./
drwxr-xr-x. 22 root root 4096 Apr 14 10:02 ../
root@ab4426a23cb4:/dbdata# ls     
a

//db2結(jié)果和db1一樣
root@b4bea0f56613:/# cd dbdata/
root@b4bea0f56613:/dbdata# ll
total 4
drwxr-xr-x.  2 root root   14 Apr 14 10:02 ./
drwxr-xr-x. 22 root root 4096 Apr 14 10:03 ../
-rw-r--r--.  1 root root    0 Apr 14 10:02 a

可以多次使用--volumes-from參數(shù)來(lái)從多個(gè)容器掛載多個(gè)數(shù)據(jù)卷。還可以從其他已經(jīng)掛載了容器卷的容器來(lái)掛載數(shù)據(jù)卷。

使用--volumes-from參數(shù)所掛載數(shù)據(jù)卷的容器自身并不需要保持在運(yùn)行狀態(tài)。如果刪除了掛載容器(包括dbdata、db1和bd2),數(shù)據(jù)卷并不會(huì)被自動(dòng)刪除。如果要?jiǎng)h除一個(gè)數(shù)據(jù)卷,必須在刪除最后一個(gè)還掛載著它的容器時(shí)顯示使用docker rm -v命令來(lái)指定同時(shí)刪除關(guān)聯(lián)的數(shù)據(jù)卷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在使用Docker的過(guò)程中,往往需要對(duì)數(shù)據(jù)進(jìn)行持久化,或者需要在多個(gè)容器之間進(jìn)行數(shù)據(jù)共享,這必然涉及容器的數(shù)據(jù)管理...
    不屈真實(shí)閱讀 587評(píng)論 0 1
  • 用戶在使用docker的過(guò)程中,往往需要能查看容器內(nèi)應(yīng)用產(chǎn)生的數(shù)據(jù),或者需要把容器內(nèi)的數(shù)據(jù)進(jìn)行備份,甚至多個(gè)容器之...
    八目朱勇銘閱讀 445評(píng)論 0 1
  • 參考https://www.cnblogs.com/wade-luffy/p/6542539.html 生產(chǎn)環(huán)境中...
    老鼠AI大米_Java全棧閱讀 449評(píng)論 0 0
  • 1. 剛上大學(xué)的時(shí)候用小本子記賬,但是經(jīng)常記一段時(shí)間就中斷了,又間歇性地再開始,還是挺喜歡記賬這件事的,但是...
    美艷部落光榮閱讀 474評(píng)論 0 2
  • 很想去下雪的海邊走走, 大概很好看很好看, 今天學(xué)習(xí)的時(shí)候坐在窗戶邊, 看窗外一直揚(yáng)揚(yáng)灑灑地飄雪, 就想起高中時(shí)也...
    朝暮w閱讀 324評(píng)論 0 0

友情鏈接更多精彩內(nèi)容