溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker中怎么如何管理數(shù)據(jù)

發(fā)布時(shí)間:2021-07-28 17:51:26 來(lái)源:億速云 閱讀:140 作者:chen 欄目:云計(jì)算

本篇內(nèi)容主要講解“Docker中怎么如何管理數(shù)據(jù)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Docker中怎么如何管理數(shù)據(jù)”吧!

Managing Data in Containers

到目前我們介紹了一些Docker的基礎(chǔ)感念, 知道了如何使用Docker的image, 也知道了如何在多個(gè)container間通過(guò)網(wǎng)絡(luò)通訊. 在這章里我們將介紹如何在docker的container內(nèi)管理數(shù)據(jù)以及如何在不同的container間共享數(shù)據(jù)。

我們將介紹兩種主要的在docker中管理數(shù)據(jù)的方法:

  • Data volumes 和

  • Data volume container

Data volumes

一個(gè) data volume 就是一個(gè)在一個(gè)或者多個(gè)container里的特殊用途的目錄。它繞過(guò)了 Union File System (譯者: 這里不確定, 需要研究)為持久化數(shù)據(jù)、共享數(shù)據(jù)提供了下面這一些有用的特性:

  • Data volumes 可以在不同的container之間共享和重用數(shù)據(jù)

  • 對(duì) Data volume 的修改及時(shí)生效(譯者:data volumn是一個(gè)目錄, 多個(gè)container都掛載這個(gè)目錄, 具體的可以通過(guò) docker inspect 看 volumne的信息)

  • 對(duì) data volume 修改內(nèi)容在升級(jí)image的時(shí)候不會(huì)被包括進(jìn)去 (譯者:在docker的整個(gè)設(shè)計(jì)中image是一個(gè)無(wú)狀態(tài)的, 這樣對(duì)升級(jí)重用非常有利。而標(biāo)記狀態(tài)的數(shù)據(jù), 比如數(shù)據(jù)庫(kù)的數(shù)據(jù), 生產(chǎn)的log之類的應(yīng)該放到volume里。volume的持久化和恢復(fù)在下面有介紹, 是通過(guò)文件的形式的, 而不是通過(guò)image)

  • Volumes 的持久化直到?jīng)]有container使用他們

Adding a data volume

你可以在docker run 的時(shí)候使用 -v 來(lái)添加一個(gè) data volume。這個(gè)參數(shù)在docker run 的時(shí)候可以多次使用來(lái)添加多個(gè) data volumes。讓我們?yōu)槲覀兊膚eb application container掛載一個(gè) volume。

$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py

這里一個(gè)新的volume會(huì)創(chuàng)建到container里的 /webapp. (譯者:如果你通過(guò)ssh或者通過(guò) -i 登陸到你的container的一個(gè)shell里, 使用 ls /webapp 可以驗(yàn)證掛載成功了)

注意: 你也可以在Dockerfile里添加 VOLUME 字段,這樣在創(chuàng)建一個(gè)新的image的 container是就會(huì)自動(dòng)的創(chuàng)建新的volume.

Mount a Host Directory as a Data Volume

使用 -v 不僅能創(chuàng)建一個(gè)新的 volume, 還可以把宿主機(jī)一個(gè)目錄mount到container里。

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

這條命令會(huì)把本地目錄 /src/webapp mount到container里的 /opt/webapp 目錄上。用這個(gè)方法來(lái)測(cè)試程序非常方便, 比如我們可以把我們的源代碼通過(guò)這個(gè)方法mount到container里, 修改本地代碼后立即就可以看到修改后的代碼是如何在container里工作的了。宿主機(jī)的目錄必須是絕對(duì)路徑, 如果這個(gè)目錄不存在docker會(huì)為你自動(dòng)創(chuàng)建。

注意 這里是沒法用 Dockerfile實(shí)現(xiàn)的, 因?yàn)檫@樣的用法有悖于可移植性和共享. 因?yàn)楸镜啬夸浘拖袼指嬖V我們的, 是和本地相關(guān)的, 不一定可以在所有的宿主機(jī)上工作.(譯者: 鬼知道你在使用image的時(shí)候的host是啥樣子的)

Docker默認(rèn)設(shè)置volume是可讀寫的,但是我們也可以mount一個(gè)目錄為只讀:

$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

這里我們同樣mount了 /src/webapp 目錄, 但是我們加上了 ro 參數(shù), 告訴docker這個(gè)volume是只讀的.

Creating and mounting a Data Volume Container

如果你有一些持久化的數(shù)據(jù), 并且想在不同的container之間共享這些數(shù)據(jù), 或者想在一些沒有持久化的container中使用, 最好的方法就是使用 Data Volumn Container, 在把數(shù)據(jù)mount到你的container里.(譯者:如開篇譯者提到的docker的container是無(wú)狀態(tài)的, 也就是說(shuō)標(biāo)記狀態(tài)的數(shù)據(jù),例如:數(shù)據(jù)庫(kù)數(shù)據(jù), 應(yīng)用程序的log 等等, 是不應(yīng)該放到container里的, 而是放到 Data Volume Container里, 這點(diǎn)和funcational programming很像, 所以我喜歡把一般的docker container 叫做 functional container用來(lái)區(qū)分 data volume container )

讓我們創(chuàng)建一個(gè)有名字的 Data Volume Container 來(lái)共享數(shù)據(jù).

$ docker run -d -v /dbdata --name dbdata training/postgres

這樣做之后就可以通過(guò) --volumes-from/dbdata mount到其他的container里了

$ docker run -d --volumes-from dbdata --name db1 training/postgres

還可以繼續(xù)共享到另外一個(gè)container里

$ docker run -d --volumes-from dbdata --name db2 training/postgres

-volumes-from 可以多次使用來(lái) mount 多個(gè)conatainer里的多個(gè)volumes。

這個(gè)操作是鏈?zhǔn)降模?我們?cè)赿b1 中通過(guò) --volumes-from mount進(jìn)來(lái)的 volume可以繼續(xù)被其他container使用

$ docker run -d --name db3 --volumes-from db1 training/postgres

(譯者: 這里我們不是直接使用 volume container, 而是使用db1 這個(gè)functional container 把volume 掛載到另外一個(gè) funcational container上的,所謂的鏈?zhǔn)骄褪?dbdata -> db1 -> db3)

如果你把所有mount volumes的container都移除掉, 包括初始化的那個(gè) dbdata container, volume才會(huì)被移除掉。通過(guò)這個(gè)屬性可以方便的升級(jí)升級(jí)數(shù)據(jù)或者在不同container間migrate數(shù)據(jù).

Backup, restore, or migrate data volumes

Volume的另外一個(gè)用處就是備份、恢復(fù)和migrate數(shù)據(jù)。 具體的做法如下,使用 --volumes-from 來(lái)創(chuàng)建一個(gè)新的container mount這個(gè)volume

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

這里我們啟動(dòng)了一個(gè)新的container, 從 dbdata 掛載了一個(gè)volume。同時(shí)掛載了一個(gè)本地目錄到這個(gè)container里。最后我們通過(guò)一個(gè) tar命令把 dbdata 里的數(shù)據(jù)備份到了 /backup 里。命令結(jié)束并且停止這個(gè)container后我們就在本地得到了一個(gè)備份的數(shù)據(jù).

(譯者: 這里使用的 ubuntu container, 就是為了把volume中的數(shù)據(jù)打包備份到host的某一個(gè)目錄里。)

備份的數(shù)據(jù)可以恢復(fù)到這個(gè)container, 或者其他使用這個(gè)volume的container。首先創(chuàng)建一個(gè)container

$ sudo docker run -v /dbdata --name dbdata2 ubuntu

之后un-tar備份文件到 data volume 里

$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

你可以使用你喜歡的工具加上上面的技術(shù)來(lái)自動(dòng)備份,遷移和恢復(fù)數(shù)據(jù).

Next steps

現(xiàn)在我們有多學(xué)了一些如何使用docker的知識(shí)。 下面我們將看下如何把Docker和Docker Hub提供的服務(wù)結(jié)合起來(lái)實(shí)現(xiàn)自動(dòng)build,以及學(xué)習(xí)一些私有repository的知識(shí).

到此,相信大家對(duì)“Docker中怎么如何管理數(shù)據(jù)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI