淺談docker Dockerfile 指令 VOLUME 介紹
在介紹VOLUME指令之前,我們來(lái)看下如下場(chǎng)景需求:
1)容器是基于鏡像創(chuàng)建的,最后的容器文件系統(tǒng)包括鏡像的只讀層+可寫(xiě)層,容器中的進(jìn)程操作的數(shù)據(jù)持久化都是保存在容器的可寫(xiě)層上。一旦容器刪除后,這些數(shù)據(jù)就沒(méi)了,除非我們?nèi)斯浞菹聛?lái)(或者基于容器創(chuàng)建新的鏡像)。能否可以讓容器進(jìn)程持久化的數(shù)據(jù)保存在主機(jī)上呢?這樣即使容器刪除了,數(shù)據(jù)還在。
2)當(dāng)我們?cè)陂_(kāi)發(fā)一個(gè)web應(yīng)用時(shí),開(kāi)發(fā)環(huán)境是在主機(jī)本地,但運(yùn)行測(cè)試環(huán)境是放在docker容器上。
這樣的話(huà),我在主機(jī)上修改文件(如html,js等)后,需要再同步到容器中。這顯然比較麻煩。
3)多個(gè)容器運(yùn)行一組相關(guān)聯(lián)的服務(wù),如果他們要共享一些數(shù)據(jù)怎么辦?
對(duì)于這些問(wèn)題,我們當(dāng)然能想到各種解決方案。而docker本身提供了一種機(jī)制,可以將主機(jī)上的某個(gè)目錄與容器的某個(gè)目錄(稱(chēng)為掛載點(diǎn)、或者叫卷)關(guān)聯(lián)起來(lái),容器上的掛載點(diǎn)下的內(nèi)容就是主機(jī)的這個(gè)目錄下的內(nèi)容,這類(lèi)似linux系統(tǒng)下mount的機(jī)制。 這樣的話(huà),我們修改主機(jī)上該目錄的內(nèi)容時(shí),不需要同步容器,對(duì)容器來(lái)說(shuō)是立即生效的。 掛載點(diǎn)可以讓多個(gè)容器共享。
下面我們來(lái)介紹具體的機(jī)制。
一、通過(guò)docker run命令
1、運(yùn)行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash
其中的 -v 標(biāo)記 在容器中設(shè)置了一個(gè)掛載點(diǎn) /data(就是容器中的一個(gè)目錄),并將主機(jī)上的 /home/xqh/myimage 目錄中的內(nèi)容關(guān)聯(lián)到 /data下。
這樣在容器中對(duì)/data目錄下的操作,還是在主機(jī)上對(duì)/home/xqh/myimage的操作,都是完全實(shí)時(shí)同步的,因?yàn)檫@兩個(gè)目錄實(shí)際都是指向主機(jī)目錄。
2、運(yùn)行命令:docker run --name test1 -it -v /data ubuntu /bin/bash
上面-v的標(biāo)記只設(shè)置了容器的掛載點(diǎn),并沒(méi)有指定關(guān)聯(lián)的主機(jī)目錄。這時(shí)docker會(huì)自動(dòng)綁定主機(jī)上的一個(gè)目錄。通過(guò)docker inspect 命令可以查看到。
xqh@ubuntu:~/myimage$ docker inspect test1
[
{
"Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c",
.............................
"Mounts": [
{
"Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01",
"Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true
}
],
...........................
上面 Mounts下的每條信息記錄了容器上一個(gè)掛載點(diǎn)的信息,"Destination" 值是容器的掛載點(diǎn),"Source"值是對(duì)應(yīng)的主機(jī)目錄。
可以看出這種方式對(duì)應(yīng)的主機(jī)目錄是自動(dòng)創(chuàng)建的,其目的不是讓在主機(jī)上修改,而是讓多個(gè)容器共享。
二、通過(guò)dockerfile創(chuàng)建掛載點(diǎn)
上面介紹的通過(guò)docker run命令的-v標(biāo)識(shí)創(chuàng)建的掛載點(diǎn)只能對(duì)創(chuàng)建的容器有效。
通過(guò)dockerfile的 VOLUME 指令可以在鏡像中創(chuàng)建掛載點(diǎn),這樣只要通過(guò)該鏡像創(chuàng)建的容器都有了掛載點(diǎn)。
還有一個(gè)區(qū)別是,通過(guò) VOLUME 指令創(chuàng)建的掛載點(diǎn),無(wú)法指定主機(jī)上對(duì)應(yīng)的目錄,是自動(dòng)生成的。
#test FROM ubuntu MAINTAINER hello1 VOLUME ["/data1","/data2"]
上面的dockfile文件通過(guò)VOLUME指令指定了兩個(gè)掛載點(diǎn) /data1 和 /data2.
我們通過(guò)docker inspect 查看通過(guò)該dockerfile創(chuàng)建的鏡像生成的容器,可以看到如下信息
"Mounts": [
{
"Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21",
"Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data",
"Destination": "/data1",
"Driver": "local",
"Mode": "",
"RW": true
},
{
"Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36",
"Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data",
"Destination": "/data2",
"Driver": "local",
"Mode": "",
"RW": true
}
],
可以看到兩個(gè)掛載點(diǎn)的信息。
三、容器共享卷(掛載點(diǎn))
docker run --name test1 -it myimage /bin/bash
上面命令中的 myimage是用前面的dockerfile文件構(gòu)建的鏡像。 這樣容器test1就有了 /data1 和 /data2兩個(gè)掛載點(diǎn)。
下面我們創(chuàng)建另一個(gè)容器可以和test1共享 /data1 和 /data2卷 ,這是在 docker run中使用 --volumes-from標(biāo)記,如:
可以是來(lái)源不同鏡像,如:
docker run --name test2 -it --volumes-from test1 ubuntu /bin/bash
也可以是同一鏡像,如:
docker run --name test3 -it --volumes-from test1 myimage /bin/bash
上面的三個(gè)容器 test1 , test2 , test3 均有 /data1 和 /data2 兩個(gè)目錄,且目錄中內(nèi)容是共享的,任何一個(gè)容器修改了內(nèi)容,別的容器都能獲取到。
四、最佳實(shí)踐:數(shù)據(jù)容器
如果多個(gè)容器需要共享數(shù)據(jù)(如持久化數(shù)據(jù)庫(kù)、配置文件或者數(shù)據(jù)文件等),可以考慮創(chuàng)建一個(gè)特定的數(shù)據(jù)容器,該容器有1個(gè)或多個(gè)卷。
其它容器通過(guò)--volumes-from 來(lái)共享這個(gè)數(shù)據(jù)容器的卷。
因?yàn)槿萜鞯木肀举|(zhì)上對(duì)應(yīng)主機(jī)上的目錄,所以這個(gè)數(shù)據(jù)容器也不需要啟動(dòng)。
如:
docker run --name dbdata myimage echo "data container"
說(shuō)明:有個(gè)卷,容器之間的數(shù)據(jù)共享比較方便,但也有很多問(wèn)題需要解決,如權(quán)限控制、數(shù)據(jù)的備份、卷的刪除等。這些內(nèi)容后續(xù)文章介紹。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Dockerfile中CMD和ENTRYPOINT命令詳解
- 編寫(xiě)最佳的Dockerfile的方法
- 詳解Dockerfile 中的 COPY 與 ADD 命令
- Docker中鏡像構(gòu)建文件Dockerfile與相關(guān)命令的詳細(xì)介紹
- 詳解利用Dockerfile構(gòu)建mysql鏡像并實(shí)現(xiàn)數(shù)據(jù)的初始化及權(quán)限設(shè)置
- Dockerfile中的ENV指令的具體使用詳解
- Docker Dockerfile的使用實(shí)例
- Dockerfile制作官方Tomcat鏡像及鏡像使用詳解
- Dockerfile中常用命令匯總
- 利用Dockerfile部署SpringBoot項(xiàng)目的方法
- 利用Dockerfile制作java運(yùn)行環(huán)境的鏡像的方法步驟
- docker Dockerfile文件制作自己的鏡像的方法
- Dockerfile 指令 ADD 和 COPY介紹
- Dockerfile中multi-stage(多階段構(gòu)建)詳解
- Docker 基礎(chǔ)之Dockerfile命令詳解
- 使用Dockerfile部署nodejs服務(wù)的方法步驟
- Dockerfile指令詳解
- Docker構(gòu)建文件Dockerfile簡(jiǎn)單入門(mén)
相關(guān)文章
Spring Boot使用Docker分層打包的設(shè)置方法
Spring Boot 現(xiàn)在支持分層打包技術(shù)了, 我們也來(lái)用一用, 加速Docker打包, 構(gòu)建的時(shí)候速度也會(huì)非常快.本文重點(diǎn)給大家介紹Spring Boot使用Docker分層打包的設(shè)置方法,感興趣的朋友一起看看吧2021-08-08
docker連接spring boot和mysql容器方法介紹
這篇文章主要介紹了docker連接spring boot和mysql容器方法介紹,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
docker部署訪(fǎng)問(wèn)postgres數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
本文主要介紹了docker部署訪(fǎng)問(wèn)postgres數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
Docker安裝運(yùn)行apache2服務(wù)器做圖片服務(wù)器的方法
這篇文章主要介紹了Docker安裝運(yùn)行apache2服務(wù)器做圖片服務(wù)器的方法,需要的朋友可以參考下2017-06-06
用docker一鍵部署前后端分離項(xiàng)目的詳細(xì)流程
這篇文章主要介紹了如何用docker一鍵部署前后端分離項(xiàng)目的詳細(xì)流程,通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-03-03
docker compose自定義網(wǎng)絡(luò)實(shí)現(xiàn)固定容器ip地址
這篇文章主要介紹了docker compose自定義網(wǎng)絡(luò)實(shí)現(xiàn)固定容器ip地址,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
dockerfile指令構(gòu)建docker鏡像的示例代碼
本文主要介紹了dockerfile指令構(gòu)建docker鏡像的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
用docker部署RabbitMQ環(huán)境的詳細(xì)介紹
這篇文章主要介紹了用docker部署RabbitMQ環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07
解決docker重啟redis,mysql數(shù)據(jù)丟失的問(wèn)題
這篇文章主要介紹了解決docker重啟redis,mysql數(shù)據(jù)丟失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11

