????數(shù)據(jù)卷與dockerfile
? ? ? ? ? ? ? ? ? ? ? ? 原創(chuàng)者:文思
一山宾、容器數(shù)據(jù)卷
1烹困、什么是數(shù)據(jù)卷罕伯,能做什么
卷就是目錄或文件,存在于一個或多個容器中燃观,由docker掛載到容器褒脯,但不屬于聯(lián)合文件系統(tǒng),因此可以繞過UnionFileSystem提供一些用于持續(xù)存儲或共享數(shù)據(jù)的特性缆毁。
能做什么:容器持久化番川、數(shù)據(jù)共享
2、用命令添加數(shù)據(jù)卷
docker?run?–v宿主機路徑:/容器目錄 鏡像名
示例:已打開交互終端方式進(jìn)入容器
docker run -it -v /myDataVolume:/dataVolumeContainer centos
運行docker inspect 查看容器內(nèi)部細(xì)節(jié)
可以看到已經(jīng)綁定成功积锅,并且可以讀寫爽彤。在宿主機的myDataVolume下新建host.txt后進(jìn)入容器觀察:
發(fā)現(xiàn)容器的dataVolumeContainer文件夾里也有host.txt了。然后打開并編輯容器里的host.txt我們看看宿主機上的會不會同步變化:
保存退出后缚陷,然后查看宿主機文件:
看到宿主機上的文件也同步一樣适篙。
當(dāng)容器停止時,主機上的修改能同步過去嗎箫爷?示例驗證:
首先退出當(dāng)前容器
宿主機上新建host0.txt并編輯:
查看確保docker沒有任何運行中的容器實例:
doker start 容器實例ID嚷节,啟動容器并進(jìn)入數(shù)據(jù)卷目錄查看:
可以看到容器停止退出后聂儒,主機修改數(shù)據(jù)后仍然同步。
容器目錄后加參數(shù)可代表只讀或只寫等硫痰,如:docker? run? –v宿主機路徑:/容器目錄:ro 鏡像名衩婚。代表只讀,宿主機的數(shù)據(jù)可以單向的傳過來效斑,容器里不能任何修改非春,這里不再進(jìn)行演示。
二缓屠、DockerFile
DockerFile:鏡像模板的描述文件
出于移植性和分享性的考慮奇昙,用-v主機目錄:容器目錄這種方式不能直接在DockerFile中實現(xiàn)。在DockerFile中使用VOLUME指令來給鏡像添加一個或多個數(shù)據(jù)卷敌完。
使用示例:
1储耐、File構(gòu)建-新建mydocker文件并使用VOLUME指令來給鏡像添加一個或多個數(shù)據(jù)卷:
2、build后生成鏡像:build -f dockerfile文件 -t 自定義鏡像名 .
用docker images查看可以看到生成的新鏡像滨溉。
3什湘、docker inspect 新鏡像可以看到?jīng)]有指定宿主機,但會根據(jù)數(shù)據(jù)卷默認(rèn)出來
三晦攒、數(shù)據(jù)卷容器
命名的容器掛載數(shù)據(jù)卷闽撤,其它容器通過掛載這個父容器實現(xiàn)數(shù)據(jù)共享,掛載數(shù)據(jù)卷的容器稱為數(shù)據(jù)卷容器勤家。
--volume-from容器間傳遞共享
啟動我們自定義新建的鏡像:
[root@f76a128edd1cdataVolumeContainer2]# touch dc01_add.txt
然后再以此鏡像啟動一個容器示例dc02(weicl@mysql5:/myDataVolume$ sudo docker run -it--name dc02 --volumes-from dc01 mydocker/centos):
可以看到dc02中也有dc01_add.txt,也就是繼承了dc01腹尖。
假如dc03也繼承dc01,將dc01刪除后伐脖,dc02新增文件热幔,dc03中也會被同步進(jìn)來,這就是docker的數(shù)據(jù)分享讼庇。
結(jié)論:容器之間配置信息的傳輸绎巨,數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止。