先來看看Docker的理念:docker
Docker容器產生的數據,若是不經過docker commit生成新的鏡像,使得數據作爲鏡像的一部分保存下來, 那麼當容器刪除後,數據天然也就沒有了。json
爲了能保存數據在docker中咱們使用卷。centos
一句話:有點相似咱們Redis裏面的rdb和aof文件bash
卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,所以可以繞過Union File System提供一些用於持續存儲或共享數據的特性:ui
卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以Docker不會在容器刪除時刪除其掛載的數據卷spa
特色:設計
做用:code
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
示例:視頻
docker run -it -v /outData:/inData centos
-v
命令有新建文件夾功能繼承
docker inspect 容器ID
若是存在數據卷,從json中能夠看出
... "HostConfig": { "Binds": [ "/outData:/inData" ], ...
相似於共享文件夾,文件夾內的文件和文件內容互通
容器中止退出後,主機修改後數據依然同步
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
ro即read only,表示Docker容器對數據卷的權限爲只讀。
Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied 解決辦法:在掛載目錄後多加一個--privileged=true
參數便可
根目錄下新建mydocker文件夾並進入
可在Dockerfile中使用VOLUME
指令來給鏡像添加一個或多個數據卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄
這種方法不能直接在Dockerfile中實現。 因爲宿主機目錄是依賴於特定宿主機的,並不可以保證在全部的宿主機上都存在這樣的特定目錄。
File構建
在mydocker目錄下建立dockerfile文件,內容以下:
# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success1" CMD /bin/bash
build後生成鏡像
docker build -f /mydocker/dockerfile -t hwj/centos .
使用鏡像生成容器
進入容器後能夠發如今根目錄存在兩個數據卷目錄
查看主機對應的目錄地址
docker inspect 容器ID
返回的json串中有相關信息,這裏與視頻教程不一樣,應該是由於Docker版本差別致使
"Mounts": [ { "Type": "volume", "Name": "adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3", "Source": "/var/lib/docker/volumes/adc7baa50e75533e1fbeab169cdfe532c99b9ec5daf5e85c1b09e9898f6af9e3/_data", "Destination": "/dataVolumeContainer1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f", "Source": "/var/lib/docker/volumes/94e57b312fc3e44ee6029b94af08ab265dea04a0ccf34ab717bd17eea0ac419f/_data", "Destination": "/dataVolumeContainer2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器
以上面的DockerFile添加建立的鏡像,先啓動一個父容器dc01
在dataVolumeContainer2新增內容
啓動容器dc02/dc03繼承自dc01
docker run -it --name dc02 --volumes-from dc01 hwj/centos
回到dc01能夠看到02/03各自添加的都能共享了
結論:容器之間配置信息的傳遞,數據卷的生命週期一直持續到沒有容器使用它爲止