Docker容器產生的數據,若是不經過docker commit生成新的鏡像,使數據作爲鏡像的一部分保存下來,那麼當容器刪除後,數據天然也就沒有了。docker
爲了能保存數據在docker中咱們使用卷。目的就是爲了讓容器內的數據吃持久化.centos
卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,所以可以繞過Union File System提供一些用於持續存儲或共享數據的特性:卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以Docker不會在容器刪除時刪除其掛載的數據卷bash
# 雙向讀寫權限 docker run -it -v /宿主機目錄:/容器內目錄 鏡像名稱 # 宿主機可讀寫,容器只讀 docker run -it -v /宿主機目錄:/容器內目錄:ro 鏡像名稱
效果 :測試
先在宿主機建立host_share
目錄ui
# 執行命令 docker run -it -v /宿主機目錄:/容器內目錄 鏡像名稱 docker run -it -v /host_share:/container_share centos
進入容器內部,發現container_share文件夾成功建立設計
按Ctrl+P+Q暫時退出容器(容器不關閉)3d
# 查看容器內部信息 docker inspect 容器ID
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不可以直接在Dockerfile中實現。code
因爲宿主機目錄是依賴於特定宿主機的,並不可以保證在全部的宿主機上都存在這樣的特定目錄。下面介紹使用 DockerFile 添加數據卷blog
FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success!" CMD /bin/bash
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
經過這種方法能夠在容器中添加多個數據卷,對應的宿主機共享地址會默認設置繼承
# docker build -f DockerFIle絕對路徑 -t 命名空間/鏡像名稱 . # 注意 . 不要忘了 docker build -f /mydocker/mydockerfile -t moti/centos .
紅框勾選的就是在宿主機的對應路徑
命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器
先建立一個容器c1,在dataVolumeContainer1添加共享數據c1.txt
建立容器c2繼承自c1,查看 dataVolumeContainer1 裏面的文件,並在 dataVolumeContainer1 中添加c2.txt
建立容器c3繼承自c1,查看 dataVolumeContainer1 裏面的文件,並在 dataVolumeContainer1 中添加c3.txt
刪除c1容器,查看c2和c3中的文件是否有變化(原來有c1.txt c2.txt c3.txt共三個文件)
能夠發現,c1刪除,對c2,c3是不影響的,那麼c2與c3會不會共享文件?
能夠看到,儘管c1刪除了可是c2和c3仍然是數據共享的,那麼刪除c2,查看c3的數據有沒有什麼變化
結論:容器之間配置信息的傳遞,數據卷的生命週期會一直持續到沒有容器使用它爲止