2023-08-17 16:20:48來源:前段南玖
上篇文章的最后我們使用Docker部署了一個(gè)純前端項(xiàng)目,但還有一個(gè)很重要的問題就是容器中產(chǎn)生的數(shù)據(jù)(比如log文件),容器一旦被刪除,容器內(nèi)的所有數(shù)據(jù)也就沒有了,為了避免這個(gè)問題我們可以將數(shù)據(jù)存儲到容器之外(比如宿主機(jī)),這樣即使刪除容器也不會丟失數(shù)據(jù)。一旦容器故障,我們可以重新創(chuàng)建一個(gè)容器,將數(shù)據(jù)掛載到容器里,就可以快速恢復(fù)。
(相關(guān)資料圖)
Docker提供了以下幾種存儲方式:
「volume卷」:這種方式是在宿主機(jī)文件系統(tǒng)分配一塊專有存儲區(qū)域,由 Docker管理,并且與主機(jī)的核心功能隔離。非 Docker 進(jìn)程不能修改文件系統(tǒng)的這一部分?!妇硎窃?Docker 中持久保存數(shù)據(jù)的最佳方式」,它適合存儲數(shù)據(jù)庫數(shù)據(jù),可掛到多個(gè)容器上「bind mount 綁定掛載」:這種方式是直接把宿主機(jī)目錄映射到容器內(nèi),適合掛代碼目錄和配置文件,可掛到多個(gè)容器上「tmpfs mount臨時(shí)掛載」:這種方式僅存儲在主機(jī)系統(tǒng)的內(nèi)存中,并且永遠(yuǎn)不會寫入主機(jī)系統(tǒng)的文件系統(tǒng),適合存儲臨時(shí)文件,不可多容器共享這張圖很清晰的解釋了volume、bind mount、temps mount與容器和宿主機(jī)之間的關(guān)系,這三者最終都是存儲在宿主機(jī)上的。
重點(diǎn)了解volume數(shù)據(jù)卷:(其實(shí)綁定掛載也可以當(dāng)成volume來理解)
數(shù)據(jù)卷其實(shí)是宿主機(jī)上的一個(gè)目錄當(dāng)容器目錄與數(shù)據(jù)卷目錄綁定之后,雙方的修改都會立即同步一個(gè)數(shù)據(jù)卷可以被多個(gè)容器掛載一個(gè)容器也可以掛載多個(gè)數(shù)據(jù)卷「數(shù)據(jù)卷可以用來做容器數(shù)據(jù)持久化、外部機(jī)器與容器間接通信、容器之間間接通信」
數(shù)據(jù)卷操作數(shù)據(jù)卷(Volume)也是常見的 Docker 對象類型的一種,因此它也支持創(chuàng)建、查看、刪除等操作.
創(chuàng)建數(shù)據(jù)卷使用docker volume create [name]指令來創(chuàng)建一個(gè)數(shù)據(jù)卷
docker volume create nanjiu-data
查看所有的數(shù)據(jù)卷docker volume ls
查看卷信息使用docker volume inspect [name]指令來查看對應(yīng)卷信息
docker volume inspect nanjiu-data
從上圖我們可以看到Mountpoint數(shù)據(jù)卷掛載的地址,需要注意的是「對于非 Linux 系統(tǒng)而言(Windows 、Mac ),該目錄不存在于你的文件系統(tǒng)中,而是存在于 Docker 虛擬機(jī)中?!?/p>刪除數(shù)據(jù)卷
使用docker volume rm [name]指令來刪除對應(yīng)的數(shù)據(jù)卷
docker volume rm nanjiu-data
這里需要注意的是:
「數(shù)據(jù)卷是用來做持久化數(shù)據(jù)的,它的生命周期獨(dú)立于容器,所以Docker不會在容器被刪除后自動刪除數(shù)據(jù)卷,并且也不存在垃圾回收這樣的機(jī)制來處理沒有任何容器引用的 數(shù)據(jù)卷」「如果需要在刪除容器的同時(shí)移除數(shù)據(jù)卷,可以在刪除容器的時(shí)候使用 docker rm -v 指令」如果想要清除所有無容器引用的數(shù)據(jù)卷,可以使用以下指令:
docker volume prune
與容器一起使用數(shù)據(jù)卷本身是用來為容器做數(shù)據(jù)持久化的,所以單獨(dú)創(chuàng)建一個(gè)數(shù)據(jù)卷的意義并不大。
創(chuàng)建容器與數(shù)據(jù)卷命名數(shù)據(jù)卷可以使用docker run指定-v或-mount來創(chuàng)建數(shù)據(jù)卷,兩者產(chǎn)生的結(jié)果相同,最大的區(qū)別在于-v語法將所有選項(xiàng)組合在一個(gè)字段中,而--mount 語法則將它們分開。
docker run -itd -v nanjiu-vol:/nanjiu-data --name nanjiu nginx:latest
這里通過-v指定了數(shù)據(jù)卷的名稱為nanjiu-vol,并且對應(yīng)綁定容器中的路徑為/nanjiu-data對于容器中不存在的文件夾,Docker會幫我們自動新建,所以我們可以進(jìn)入到容器中查看是否有該文件夾
這里我們可以看到容器中對應(yīng)的數(shù)據(jù)卷目錄
匿名數(shù)據(jù)卷這里還有一種類型叫做匿名數(shù)據(jù)卷,他的創(chuàng)建方式只需要省略數(shù)據(jù)卷名稱就可以,然后Docker會為它生成一長串的hash值作為數(shù)據(jù)卷的名稱
docker run -itd -v /nanjiu-noname --name nanjiu-noname nginx:latest
驗(yàn)證數(shù)據(jù)持久化我們先在這個(gè)數(shù)據(jù)卷目錄新建一個(gè)文件,再把當(dāng)前容器刪除
然后我們再重新創(chuàng)建一個(gè)容器并綁定上面那個(gè)數(shù)據(jù)卷,如果數(shù)據(jù)卷中的內(nèi)容還存在,那就能夠證明數(shù)據(jù)是持久化存儲的,不會隨著容器的刪除而刪除
「從這里我們就能夠驗(yàn)證數(shù)據(jù)卷可以用來做持久化存儲了」
綁定掛載上面我們提到過它可以當(dāng)成數(shù)據(jù)卷來理解,因?yàn)樗谑褂眠^程中幾乎與數(shù)據(jù)卷類似,不同的地方是它其實(shí)是與宿主機(jī)的文件系統(tǒng)進(jìn)行綁定
docker run -itd -v ~/Desktop/nanjiu-mount-data:/nanjiu-mount-data --name nanjiu nginx:latest
這里-v的格式為 :,對應(yīng)綁定的是宿主機(jī)目錄與容器目錄
然后可以到桌面看對應(yīng)的文件是否存在
「綁定掛載可以讓宿主機(jī)與容器共享數(shù)據(jù),并且同樣不會隨容器的刪除而刪除,也可以用來實(shí)現(xiàn)數(shù)據(jù)持久化,上面有提到他適合用來掛載代碼目錄和配置文件」
數(shù)據(jù)共享容器與宿主機(jī)共享數(shù)據(jù)綁定掛載這個(gè)很好理解,上面那種bind mount綁定掛載方式就是最明確的,它是直接將宿主機(jī)上的目錄掛載到容器。
docker cpvolume數(shù)據(jù)卷的方式想要實(shí)現(xiàn)容器與宿主機(jī)共享數(shù)據(jù)稍微有點(diǎn)麻煩,因?yàn)椤高@種方式是在宿主機(jī)文件系統(tǒng)分配一塊專有存儲區(qū)域,由 Docker管理,并且與主機(jī)的核心功能隔離。非 Docker 進(jìn)程不能修改文件系統(tǒng)的這一部分」
但好在docker提供的docker cp命令可以用來拷貝文件,該docker cp命令可以將內(nèi)容從SRC_PATH復(fù)制到DEST_PATH. 您可以從容器的文件系統(tǒng)復(fù)制到本地計(jì)算機(jī),或者相反,從本地文件系統(tǒng)復(fù)制到容器。
docker cp 88eecfd2dd14:/nanjiu-data ~/Desktop/cpDir
然后查看本地桌面是否有了拷貝過來的內(nèi)容
通過這種方式也能實(shí)現(xiàn)宿主機(jī)與容器之間的數(shù)據(jù)共享,但它的缺點(diǎn)在于每次都需要手動操作,數(shù)據(jù)共享比較麻煩。
容器與容器之間共享數(shù)據(jù)綁定掛載這里第一種方式仍然是可以使用bind mount綁定掛載,因?yàn)橥粋€(gè)文件可以掛載到多個(gè)容器,這樣就可以借助宿主機(jī)中轉(zhuǎn)來實(shí)現(xiàn)容器之間的數(shù)據(jù)共享了,這種方式比較簡單易懂。
數(shù)據(jù)卷容器數(shù)據(jù)卷容器是一個(gè)專門為其它容器提供卷的容器,它提供的卷可以是bind mount,也可以是docker volume「數(shù)據(jù)卷容器在為其它容器提供卷功能時(shí)可以不需要處于運(yùn)行狀態(tài)」
這里創(chuàng)建了兩種類型的volume,同時(shí)掛載在nanjiu-vc這個(gè)數(shù)據(jù)卷容器上,這個(gè)容器可以不啟動
docker create --name nanjiu-vc \ > -v ~/Desktop/nanjiu-vc:/nanjiu-vc \> -v nanjiu-vc:/nanjiu-vc2 \> nginx:latest
其他容器可以通過--volumes-from使用nannie-vc這個(gè)數(shù)據(jù)卷容器
這里建了兩個(gè)容器都使用nanjiu-vc這個(gè)數(shù)據(jù)卷容器
這樣兩個(gè)容器就通過數(shù)據(jù)卷容器實(shí)現(xiàn)了數(shù)據(jù)共享。
「這種方式的優(yōu)點(diǎn)在于:」
與bind mount相比,不必為每一個(gè)容器指定宿主機(jī)path,所有path都在volume container中定義好了,容器只需與volume container關(guān)聯(lián),實(shí)現(xiàn)了容器與host的解耦。
使用volume container的容器,其mount point是一致的,有利于配置的規(guī)范和標(biāo)準(zhǔn)化,但也帶來一定的局限,使用時(shí)需要綜合考慮。
改造之前的log存儲方式之前的那種部署方式存在一個(gè)問題,如果容器出現(xiàn)故障被銷毀,那么容器內(nèi)產(chǎn)生的log文件也就沒有了,現(xiàn)在我們可以把它改造成將nginx產(chǎn)生的log文件使用數(shù)據(jù)卷存儲,當(dāng)容器出現(xiàn)故障,我們只需要重新創(chuàng)建一個(gè)容器并掛載數(shù)據(jù)就可以快速恢復(fù)log文件排查問題
修改Dockerfile# 指定node鏡像FROM node:16-alpine as builder# 指定工作目錄WORKDIR /code# 代碼復(fù)制到工作目錄ADD . /code# 安裝依賴RUN npm install --registry=https://registry.npm.taobao.org# 打包RUN npm run build# 指定nginx鏡像FROM nginx:alpine# 創(chuàng)建nginx日志目錄數(shù)據(jù)卷VOLUME ["/var/log/nginx"]# 復(fù)制打包后的代碼到nginx容器中COPY --from=builder /code/dist /usr/share/nginx/htmlCOPY /nginx.conf /etc/nginx/nginx.conf# 暴露端口EXPOSE 8080
重新打包鏡像docker build -t nanjiu:1.0.1 .
創(chuàng)建容器基于上面nanjiu:1.0.1鏡像創(chuàng)建一個(gè)容器nanjiu-web3docker run -d -p 9099:8080 --name nanjiu-web3 nanjiu:1.0.1
訪問頁面這里主要是為了產(chǎn)生nginx日志文件
將容器刪除docker stop 4355deda547f # 停止容器docker rm 4355deda547f # 刪除容器
容器雖然被刪除了,但數(shù)據(jù)卷并不會跟隨容器的刪除而刪除
新建容器綁定數(shù)據(jù)卷查看數(shù)據(jù)docker run -d \-v 3690f4f3b2d15466a9dfa7f692cba06add99daba3f76b8e7ffdc99b1c5937a8a:/nginx-data \--name nanjiu-web4 nginx:latest
這樣一來即使容器出現(xiàn)故障被刪除,也不影響查看log文件排查問題。
關(guān)鍵詞:
上篇文章的最后我們使用Docker部署了一個(gè)純前端項(xiàng)目,但還有一個(gè)很重要
8月17日,就委托律師事務(wù)所向電影《長安三萬里》制片方及導(dǎo)演發(fā)出律師
股價(jià)突破長期盤整:前30日在上下30%的幅度內(nèi)整理,今日有效突破。資金
歡迎來到物聯(lián)網(wǎng)技術(shù)的迷人世界,在這里,日常物品變得比以往任何時(shí)候都
導(dǎo)讀1、你說的考證就是全國造價(jià)員考試,有一定的難度,一般是10%---20%
為了挑戰(zhàn)OpenAI的GPT-3 5和GPT-4等閉源模型的主導(dǎo)地位,一系列開源模型
北京商報(bào)記者盧揚(yáng)韓昕媛北京實(shí)體書店超過2100家、萬人擁有書店超過0 94
隨著Wi-Fi6和Wi-Fi6E的普及,新的Wi-Fi標(biāo)準(zhǔn)即將問世。最終的Wi-Fi7標(biāo)準(zhǔn)
2023年是生成式AI技術(shù)取得重大突破的一年,ChatGPT等AI工具已經(jīng)走出科
DEFCON信息安全超級樂隊(duì)“死牛教”發(fā)布了Veilid(發(fā)音為vay-lid),這
一、背景介紹隨著vivo業(yè)務(wù)遷移到容器平臺,vivo云原生監(jiān)控體系面臨著指
今年年初,ChatGPT猶如一顆火種,激發(fā)了AI應(yīng)用的發(fā)展動力,AI產(chǎn)業(yè)進(jìn)入
RabbitMQ是一個(gè)功能強(qiáng)大的消息隊(duì)列系統(tǒng),它提供了靈活的插件機(jī)制,使用
8月17日消息,最近哈佛大學(xué)科學(xué)家利用谷歌云平臺克隆出一臺用于研究心
證券時(shí)報(bào)網(wǎng)訊,據(jù)四川日報(bào),近日,《四川天府新區(qū)營商環(huán)境創(chuàng)新改革行動