溫馨提示×

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

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

Docker存儲(chǔ)管理的方式有哪些

發(fā)布時(shí)間:2022-09-23 11:51:43 來(lái)源:億速云 閱讀:105 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“Docker存儲(chǔ)管理的方式有哪些”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Docker存儲(chǔ)管理的方式有哪些”文章吧。

一、存儲(chǔ)

對(duì)于數(shù)據(jù)來(lái)說(shuō),我們可以將其保存在容器中,但是會(huì)存在一些缺點(diǎn):

  • 當(dāng)容器不再運(yùn)行時(shí),我們無(wú)法使用數(shù)據(jù),并且容器被刪除時(shí),數(shù)據(jù)并不會(huì)被保存。

  • 數(shù)據(jù)保存在容器中的可寫(xiě)層中,我們無(wú)法輕松的將數(shù)據(jù)移動(dòng)到其他地方。

針對(duì)上述的缺點(diǎn)而言,有些數(shù)據(jù)信息,例如我們的數(shù)據(jù)庫(kù)文件,我們不應(yīng)該將其保存在鏡像或者容器的可寫(xiě)層中。Docker 提供三種不同的方式將數(shù)據(jù)從 Docker 主機(jī)掛載到容器中,分別為卷(volumes),綁定掛載(bind mounts),臨時(shí)文件系統(tǒng)(tmpfs)。很多時(shí)候,volumes 總是正確的選擇。

  • volumes 卷存儲(chǔ)在 Docker 管理的主機(jī)文件系統(tǒng)的一部分中(/var/lib/docker/volumes/)中,完全由 Docker 管理。

  • bind mounts 綁定掛載,可以將主機(jī)上的文件或目錄掛載到容器中。

  • tmpfs 僅存儲(chǔ)在主機(jī)系統(tǒng)的內(nèi)存中,而不會(huì)寫(xiě)入主機(jī)的文件系統(tǒng)。

無(wú)論使用上述的哪一種方式,數(shù)據(jù)在容器內(nèi)看上去都是一樣的。它被認(rèn)為容器文件系統(tǒng)中的目錄或單個(gè)文件。

二、卷列表

對(duì)于三種不同的存儲(chǔ)數(shù)據(jù)的方式來(lái)說(shuō),卷是唯一完全由 Docker 管理的。它更容易備份或遷移,并且我們可以使用 Docker CLI 命令來(lái)管理卷。

列出本地可用的卷列表可以使用如下命令:

docker volume ls

 運(yùn)行之后,你可能會(huì)看到一些環(huán)境中預(yù)置鏡像對(duì)應(yīng)的卷,或者顯示為空。

創(chuàng)建卷

創(chuàng)建卷我們可以直接使用如下命令:

docker volume create

上述命令會(huì)創(chuàng)建一個(gè)數(shù)據(jù)卷,并且會(huì)隨機(jī)生成一個(gè)名稱(chēng)。創(chuàng)建之后我們可以查看卷列表:

docker volume ls

Docker存儲(chǔ)管理的方式有哪些

這種由系統(tǒng)隨機(jī)生成名稱(chēng)的創(chuàng)建卷的方式被稱(chēng)為 匿名卷,直接使用該卷需要指定卷名,即自動(dòng)生成的 ID,所以創(chuàng)建卷時(shí)一般手動(dòng)指定其 name,例如我們創(chuàng)建一個(gè)名為 volume1 的卷。

docker volume create volume1

Docker存儲(chǔ)管理的方式有哪些

掛載卷

創(chuàng)建卷之后,我們可以用卷來(lái)啟動(dòng)一個(gè)容器,這里首先需要學(xué)習(xí) docker container run 命令的兩個(gè)參數(shù):

  • -v--volume

由三個(gè)由冒號(hào)(:)分隔的字段組成,[HOST-DIR:]CONTAINER-DIR[:OPTIONS]。

  • HOST-DIR 代表主機(jī)上的目錄或數(shù)據(jù)卷的名字。省略該部分時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè)匿名卷。如果是指定主機(jī)上的目錄,需要使用絕對(duì)路徑。

  • CONTAINER-DIR 代表將要掛載到容器中的目錄或文件,即表現(xiàn)為容器中的某個(gè)目錄或文件。

  • OPTIONS 代表配置,例如設(shè)置為只讀權(quán)限(ro),此卷僅能被該容器使用(Z),或者可以被多個(gè)容器使用(z)。多個(gè)配置項(xiàng)由逗號(hào)分隔。

例如,我們使用 -v volume1:/volume1:ro,z。代表的是意思是將卷 volume1 掛載到容器中的 /volume1 目錄。ro,z 代表該卷被設(shè)置為只讀(ro),并且可以多個(gè)容器使用該卷(z)。

  • --mount 由多個(gè)鍵值對(duì)組成,鍵值對(duì)之間由逗號(hào)分隔。

例如:type=volume,source=volume1,destination=/volume1,ro=true。

  • type,指定類(lèi)型,可以指定為 bind,volumetmpfs

  • source,當(dāng)類(lèi)型為 volume 時(shí),指定卷名稱(chēng),匿名卷時(shí)省略該字段。

  • 當(dāng)類(lèi)型為 bind,指定路徑。可以使用縮寫(xiě) src。

  • destination,掛載到容器中的路徑??梢允褂每s寫(xiě) dsttarget

  • ro 為配置項(xiàng),多個(gè)配置項(xiàng)直接由逗號(hào)分隔一般使用 true 或 false。

針對(duì)上述創(chuàng)建的卷 volume1,用其來(lái)運(yùn)行一個(gè)容器就可以使用如下命令:

docker container run \
    -it \
    --name niuma001 \
    -v volume1:/volume1 \
    --rm ubuntu /bin/bash

Docker存儲(chǔ)管理的方式有哪些

或者我們也可以使用 --mount,其語(yǔ)法格式如下:

docker container run \
    -it --name niuma002 \
    --mount type=volume,src=volume1,target=/volume1 \
    --rm ubuntu /bin/bash

Docker存儲(chǔ)管理的方式有哪些

從命令中,可以很明顯的得出,--mount 的可讀性更好。所以,推薦大家使用 --mount

docker container run 中我們使用了參數(shù) --rm,它的作用在容器退出時(shí)刪除容器。這里我們創(chuàng)建的鏡像只是希望它短期運(yùn)行,其用戶(hù)數(shù)據(jù)并無(wú)保留的必要,因而可以在容器啟動(dòng)時(shí)設(shè)置 --rm 選項(xiàng),這樣在容器退出時(shí)就能夠自動(dòng)清理容器內(nèi)部的文件系統(tǒng)。

值得注意的是,后臺(tái)運(yùn)行的容器無(wú)法使用 -d--rm 選項(xiàng)。

上述操作,我們分別運(yùn)行了兩個(gè)容器,并分別掛載了一個(gè)卷,還可多次使用該參數(shù)掛載多個(gè)卷或目錄。并且對(duì)于這兩個(gè)容器來(lái)說(shuō),由于我們使用的是同一個(gè)卷,所以他們將共享該數(shù)據(jù)卷,但是對(duì)于多個(gè)容器共享數(shù)據(jù)卷時(shí),需要注意并發(fā)性。大家可以分別連接到兩個(gè)容器中,操作數(shù)據(jù),驗(yàn)證其是同步的,這里就不再詳細(xì)演示了。

三、綁定掛載

 對(duì)于數(shù)據(jù)卷來(lái)說(shuō),其優(yōu)點(diǎn)在于方便管理。而對(duì)于綁定掛載 bind-mounts 來(lái)說(shuō),通過(guò)將主機(jī)上的目錄綁定到容器中,容器就可以操作和修改主機(jī)上該目錄的內(nèi)容。這既是其優(yōu)點(diǎn)也是其缺點(diǎn)。

 例如,我們將 /home/xiaoniuma 目錄掛載到容器中的 `/home/xiaoniuma 目錄下,使用的命令如下:

docker container run \
    -it \
    -v /home/xiaoniuma:/home/xiaoniuma \
    --name xiaoniuma003 \
    --rm ubuntu /bin/bash

Docker存儲(chǔ)管理的方式有哪些

而如果使用的是 --mount,相應(yīng)的語(yǔ)句如下:

docker container run \
    -it \
    --mount type=bind,src=/home/xiaoniuma,target=/home/xiaoniuma \
    --name xiaoniuma004 \
    --rm ubuntu /bin/bash

Docker存儲(chǔ)管理的方式有哪些

如果綁定掛載時(shí)指定的容器目錄是非空的,則該目錄中的內(nèi)容將會(huì)被覆蓋。并且如果主機(jī)上的目錄不存在,會(huì)自動(dòng)創(chuàng)建該目錄。

上述兩個(gè)操作針對(duì)的是目錄,而對(duì)于掛載文件來(lái)說(shuō),可能會(huì)出現(xiàn)一些特殊情況,涉及到綁定掛載和使用卷的區(qū)別。下面我們重現(xiàn)這一操作:

1.首先在當(dāng)前目錄,即 /home/xiaoniuma 目錄下,創(chuàng)建一個(gè) test.txt 文件。并向其中寫(xiě)入文本內(nèi)容 “test1”:

echo "test1" > test.txt

Docker存儲(chǔ)管理的方式有哪些

2.接著創(chuàng)建一個(gè)容器 xiaoniuma005,將 test.txt 文件掛載到容器中的 /test.txt 文件,并查看容器中 /test.txt 文件的內(nèi)容:

docker container run \
    -it \
    -v /home/xiaoniuma/test.txt:/test.txt \
    --name xiaoniuma005 ubuntu /bin/bash

Docker存儲(chǔ)管理的方式有哪些

Docker存儲(chǔ)管理的方式有哪些

3.這時(shí)新打開(kāi)一個(gè)終端,通過(guò) echo 命令向 /home/xiaoniuma/test.txt 文件追加內(nèi)容 “test2”,并在容器中查看 /test.txt 文件的內(nèi)容:

echo "test2" >> test.txt

Docker存儲(chǔ)管理的方式有哪些

4.這時(shí)無(wú)論是在容器中還是主機(jī)上都能查看到該文件的內(nèi)容。接下來(lái)在主機(jī)上查看 test.txt 的 inode 號(hào)。

Docker存儲(chǔ)管理的方式有哪些

使用 VIM 編輯該文件,添加 “test3”,并查看該文件的內(nèi)容:

Docker存儲(chǔ)管理的方式有哪些

Docker存儲(chǔ)管理的方式有哪些

Docker存儲(chǔ)管理的方式有哪些

Docker存儲(chǔ)管理的方式有哪些

如上圖所示,在主機(jī)上使用 VIM 編輯后,通過(guò) VIM 做出的修改不能在容器中查看到。這是因?yàn)?VIM 編輯保存文件的時(shí)候,會(huì)將文件內(nèi)容寫(xiě)入到一個(gè)新的文件中,保存好后,刪除掉原來(lái)的文件,并將新文件重命名,從而完成保存的操作。但是我們標(biāo)識(shí)文件是通過(guò) inode,因此 Docker 綁定的主機(jī)文件,依舊是 VIM 編輯之前的 inode,即舊文件。所以容器中看到的,依然是舊的內(nèi)容。
對(duì)于數(shù)據(jù)卷來(lái)說(shuō),由 Docker 完全管理,而綁定掛載,則需要我們自己去維護(hù)。我們需要自己手動(dòng)去處理這些問(wèn)題,這些問(wèn)題并不僅僅是上面演示的內(nèi)容,還可能有用戶(hù)權(quán)限,SELINUX 等問(wèn)題。

最后簡(jiǎn)單說(shuō)一下臨時(shí)文件系統(tǒng) tmpfs。它只存儲(chǔ)在主機(jī)的內(nèi)存中。當(dāng)容器停止時(shí),相應(yīng)的數(shù)據(jù)就會(huì)被移除。

docker run \
    -it \
    --mount type=tmpfs,target=/test \
    --name xiaoniuma008 \
    --rm ubuntu bash

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

如果容器之間需要共享一些持續(xù)更新的數(shù)據(jù),最簡(jiǎn)單的方式就是使用用戶(hù)數(shù)據(jù)卷容器。其他容器通過(guò)掛載這個(gè)容器實(shí)現(xiàn)數(shù)據(jù)共享,這個(gè)掛載數(shù)據(jù)卷的容器就叫做數(shù)據(jù)卷容器。數(shù)據(jù)卷容器就是一種普通容器,它專(zhuān)門(mén)提供數(shù)據(jù)卷供其它容器掛載使用。

首先,我們創(chuàng)建一個(gè)數(shù)據(jù)卷和數(shù)據(jù)卷容器,執(zhí)行的命令如下:

# 創(chuàng)建一個(gè)名為 vdata 的數(shù)據(jù)卷
docker volume create vdata
# 創(chuàng)建一個(gè)掛載了 vdata 的容器,這個(gè)容器就是數(shù)據(jù)卷容器
docker container run \
    -it \
    -v vdata:/vdata \
    --name XiaoniumaVolume ubuntu /bin/bash
# 在 /vdata 目錄下創(chuàng)建一個(gè)文本文件
echo "I am XiaoniumaVolume" > /vdata/f.txt

Docker存儲(chǔ)管理的方式有哪些

接下來(lái)我們分別打開(kāi)新的終端輸入以下命令,創(chuàng)建兩個(gè)容器,在執(zhí)行 docker container run 時(shí),我們添加參數(shù) --volumes-from 繼承數(shù)據(jù)卷容器 XiaoniumaVolume 掛載的數(shù)據(jù)卷。進(jìn)入容器后分別創(chuàng)建文件

# 創(chuàng)建容器 test1
docker container run \
    -it \
    --volumes-from XiaoniumaVolume \
    --name test1 ubuntu /bin/bash

# 查看 vdata 目錄是否存在
ls -dl /vdata/

# 創(chuàng)建一個(gè)文件,并寫(xiě)入內(nèi)容
echo "I am test1" > /vdata/test1.txt

Docker存儲(chǔ)管理的方式有哪些

同樣的,我們執(zhí)行上述操作,創(chuàng)建容器 test2。

# 創(chuàng)建容器 test2
docker container run \
    -it \
    --volumes-from XiaoniumaVolume \
    --name test2 ubuntu /bin/bash

# 查看 vdata 目錄是否存在
ls -dl /vdata/

# 創(chuàng)建一個(gè)文件,并寫(xiě)入內(nèi)容
echo "I am test2" > /vdata/test2.txt

Docker存儲(chǔ)管理的方式有哪些

我們進(jìn)入到 XiaoniumaVolume 容器所在的終端,在掛載的數(shù)據(jù)中查看文件的內(nèi)容:

# 查看數(shù)據(jù)卷中的內(nèi)容
ls -al /vdata/

Docker存儲(chǔ)管理的方式有哪些

從上圖的結(jié)果中我們可以看到,數(shù)據(jù)卷在三個(gè)容器之間是共享的。

五、數(shù)據(jù)備份

 數(shù)據(jù)存在于數(shù)據(jù)卷中,如果我們想要備份它,可以采用創(chuàng)建備份容器的方式。

docker container run \
   --volumes-from XiaoniumaVolume \
   -v /home/xiaoniuma/backup:/backup \
   ubuntu tar cvf /backup/backup.tar /vdata/
  • --volumes-from XiaoniumaVolume 使得備份容器繼承容器 XiaoniumaVolumeVolume 的數(shù)據(jù)卷。

  • -v /home/xiaoniuma/backup:/backup/home/xiaoniuma/backup 目錄采用綁定掛載的方式,掛載到容器的 /backup 目錄上。

  • tar cvf /backup/backup.tar /vdata 容器中執(zhí)行了這么一條壓縮歸檔命令,將 /vdata 中的全部數(shù)據(jù)打包到了 /backup/backup.tar,而剛剛的數(shù)據(jù)綁定,使得整個(gè)壓縮包存在于主機(jī)中,從而達(dá)到了數(shù)據(jù)備份的效果。

Docker存儲(chǔ)管理的方式有哪些

如上圖所示,數(shù)據(jù)卷中的所有數(shù)據(jù)都被打包到了 /home/xiaoniuma/backup 目錄中。

六、數(shù)據(jù)恢復(fù)

與數(shù)據(jù)備份相同的方式,我們可以使用如下命令創(chuàng)建恢復(fù)容器,來(lái)還原數(shù)據(jù)卷中的數(shù)據(jù)。

docker container run \
   --volumes-from XiaoniumaVolume \
   -v /home/xiaoniuma/backup:/backup \
   ubuntu tar xvf /backup/backup.tar -C /

這里解壓的路徑為 / 即 /vdata 的上一級(jí)目錄。由于與數(shù)據(jù)備份非常相似,這里不再給出結(jié)果分析。

以上就是關(guān)于“Docker存儲(chǔ)管理的方式有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向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