是什么
docker的理念將運行的環(huán)境打包形成容器運行叠赐,運行可以伴隨容器欲账,但是我們對數(shù)據(jù)的要求是希望持久化,容器之間可以共享數(shù)據(jù)芭概,Docker容器產(chǎn)生的數(shù)據(jù)赛不,如果不通過docker commit生成新的鏡像,使得數(shù)據(jù)作為容器的一部分保存下來谈山,那么當容器被刪除之后俄删,數(shù)據(jù)也就沒了,為了能夠保存數(shù)據(jù)奏路,在docker容器中使用卷畴椰。卷就是目錄或者文件,存在于一個或者多個容器中鸽粉,但是不屬于聯(lián)合文件系統(tǒng)斜脂,因此能夠繞過Union File System提供一些用于持久化數(shù)據(jù)或共享數(shù)據(jù)的特點
能干嘛?
卷的設(shè)計目的就是數(shù)據(jù)的持久化触机,完全獨立與容器的生命周期帚戳,因此Docker不會在容器刪除時刪除其掛載的數(shù)據(jù)卷。
特點:
?? 1. 數(shù)據(jù)卷可以在容器之間共享和重用數(shù)據(jù)儡首。
?? 2. 卷的更改可以直接生效片任。
?? 3. 數(shù)據(jù)卷的更改不會包含在鏡像的更新中。
?? 4. 數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止蔬胯。
容器的持久化
容器間繼承+共享數(shù)據(jù)
數(shù)據(jù)卷
容器內(nèi)添加
?1.直接命令添加:
??命令
???docker run -it -v /宿主機絕對路徑目錄:/容器內(nèi)目錄?鏡像名
???查看數(shù)據(jù)卷是否掛載成功。
????使用docker imspect 容器ID,返回的json串有這么一串數(shù)據(jù)說明掛載成功产场。
?容器和宿主機之間通信
容器關(guān)閉后在宿主機更改文件鹅髓,容器再次啟動數(shù)據(jù)仍然同步
命令(帶權(quán)限)
??docker run -it -v /宿主機絕對路徑目錄:/容器內(nèi)目錄:ro 鏡像名??(read only)
??此時主機能對數(shù)據(jù)卷進行更改,但是容器不能對其更改京景,只允許讀窿冯。
DockerFile
hello.java ---- hello.class
hello images ---- images DockerFile
實際就是鏡像的描述。
2.DockerFile添加
根目錄下新建mydocker文件夾并進入确徙。
在DockerFile中使用VOLUME指令給鏡像添加一個或者多個數(shù)據(jù)卷
VOLUME["/dataVolumeContainer","dataVolumeContainer2","dataVolumeContainer3"]
??出于可移植和分享的考慮醒串,用-v命令這種方法不能夠直在DockerFile中實現(xiàn),由于宿主機目錄是依賴于特定宿主機的米愿,并不能保證所有的宿主機都存在這樣的特定目錄厦凤。File構(gòu)建
build后生成鏡像-----獲得新的鏡像
也是一層一層的疊加,聯(lián)合文件系統(tǒng)
run容器
可以看到已經(jīng)創(chuàng)建兩個數(shù)據(jù)卷育苟,對應(yīng)主機路徑
Docker 掛載主機目錄Docker出項cannot open directory .:Permission denied
解決辦法:在掛載目錄后面 多加一個--privileged=true參數(shù)即可
docker run -it -v /mydatavolume:/datavolumecontainer --privileged=true 鏡像名
數(shù)據(jù)卷容器
命名的容器掛載數(shù)據(jù)卷较鼓,其他的容器通過掛載這個容器(父容器)實現(xiàn)數(shù)據(jù)共享,掛載數(shù)據(jù)卷的容器违柏,稱為數(shù)據(jù)卷容器
- 以上一步新建的鏡像為模板運行容器dc01/dc02/dc03
他們已經(jīng)具有容器卷/datavolumecontainer1和/datavolumecontainer2容器間傳遞共享(--volumes-from)
??啟動父容器dc01--在datavolumecontainer2中新增內(nèi)容
??dc01/dc02繼承自dc01(--volumes-from)
??子容器創(chuàng)建文件父容器查看
??刪除父容器子容器數(shù)據(jù)保留博烂,
容器之間配置信息的傳遞,數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止漱竖。