Docker基礎(chǔ)——數(shù)據(jù)持久化

????因為容器內(nèi)的文件系統(tǒng)是不互通的,所以不通過額外的配置無法從一個容器訪問另一個容器的文件,所以我們需要通過為容器掛載卷的形式讓容器內(nèi)部空間和主機上的硬盤路徑連通,這樣多個容器可以通過訪問同一個主機地址上的文件達(dá)到數(shù)據(jù)互通的效果。簡單的說就是將容器外部的文件系統(tǒng)的一部分掛載進(jìn)容器內(nèi)部,內(nèi)部的變化會體現(xiàn)在外部、外部的變化內(nèi)部也一樣能感受到。
????卷上的數(shù)據(jù)因為存儲在容器之外,所以不會因為容器的銷毀而被刪除,被重建的容器也能繼承到之前容器放在掛載卷位置的數(shù)據(jù)。
????我們可以通過兩種形式使用卷:
????1、先創(chuàng)建卷,在容器啟動的時候配置其使用已經(jīng)創(chuàng)建好的卷。
????2、在創(chuàng)建容器的時候創(chuàng)建臨時卷。
????上述代碼使用docker volume create創(chuàng)建了一個名為todo-db的卷,在運行容器時使用 --mount屬性指定掛載卷的動作,type=volume表示掛載類型為卷,src=todo-db指定了使用的卷名稱,target=/etc/todos指定了卷掛載的容器內(nèi)部文件路徑。
????在這個示例中預(yù)先創(chuàng)建好的卷就像一個數(shù)據(jù)桶,我們只需要關(guān)心將卷掛載到容器內(nèi)部的路徑就可以正常的使用卷為我們提供的數(shù)據(jù)持久化能力,我們不必關(guān)心卷掛載的主機文件系統(tǒng)路徑在哪也不用擔(dān)心會被誤刪,docker在幫我們管理。
????上述指令可以讓我們查看預(yù)定義的卷的信息,Mountpoint是數(shù)據(jù)在磁盤上的實際位置。在大多數(shù)機器上,您可能需要具有從主機訪問該目錄的根訪問權(quán)限。
????上述代碼是另一種掛載卷的方式,通過將type設(shè)置為bind使用綁定的方式將src表示的主機路徑與target表示的容器內(nèi)部路徑掛載到一起,這可以視作上一種方式的DIY簡化版本。
????這種寫法適合在開發(fā)階段調(diào)試應(yīng)用,我們只需要執(zhí)行以下命令就能獲得一個可直接參加開發(fā)工作的容器:
????這里新出現(xiàn)的 -w 是Dockerfile中“working directory”的縮寫,用于指定應(yīng)用的運行目錄。
????node:18-alpine參數(shù)指定了容器的運行環(huán)境依賴。
? ? sh -c 表示使用sh運行可執(zhí)行腳本,當(dāng)容器文件準(zhǔn)備結(jié)束時會自動執(zhí)行這一命令。
????上述代碼通過--mount將當(dāng)前目錄掛載到容器內(nèi)部,依靠容器內(nèi)的node環(huán)境來執(zhí)行主機路徑上的代碼,我們對代碼的任何改動都會被node服務(wù)實時編譯。