先來看看Docker的理念:git
Docker容器產生的數據,若是不經過docker commit生成新的鏡像,使得數據作爲鏡像的一部分保存下來,
那麼當容器刪除後,數據天然也就沒有了。github
爲了能保存數據在docker中咱們使用卷。docker
卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,所以可以繞過Union File System提供一些用於持續存儲或共享數據的特性:centos
卷的設計目的就是數據的持久化,徹底獨立於容器的生存週期,所以Docker不會在容器刪除時刪除其掛載的數據卷tomcat
特色:
1:數據卷可在容器之間共享或重用數據
2:卷中的更改能夠直接生效
3:數據卷中的更改不會包含在鏡像的更新中
4:數據卷的生命週期一直持續到沒有容器使用它爲止bash
docker run -it -v /宿主機目錄:/容器內目錄 centos /bin/bash
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
docker run -it -v /myDataVolum:/dataVolumContainer centos /bin/bash
能夠看出命名執行完就進入到一個鏡像名爲a82ff6c30fbb的centos下,查看centos下有dataVolumContainer這個新建的文件夾
進入到宿主機,發現也會新建個myDataVolum,這兩個文件夾中的數據是互通的測試
docker inspect 容器ID
docker inspect a82ff6c30fbb
docker ps -l -l :顯示最近建立的容器。
啓動centos鏡像ui
docker start a82ff6c30fbb docker attach a82ff6c30fbb
數據一致:
設計
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
ro:表示只讀不可寫
RW:表示讀寫
結論:設置上述的權限時(設置ro),在共享文件夾中,容器中只能查看不能寫入3d
進入dockerhub下載鏡像:https://hub.docker.com/
docker hub打開的太慢了,能夠去github上的搜索鏡像:https://github.com/docker-library/
如:tomcat鏡像的docker file :https://github.com/dockerlibrary/tomcat/blob/master/8.5/jdk8/openjdk/Dockerfile
根目錄下新建mydocker文件夾並進入,搜索tomcat,在tomcat的docker file裏發現有OpenJDK,因此這也是爲何tomcat鏡像包這麼大了。
docker下載的鏡像都有一個特色就是這些鏡像都是小型化的Linux系統
docker file裏的 「 \ 」是鏈接符,一行寫不下因此須要換行
docker file就是鏡像模板的描述文件
mkdir mydocker cd mydocker
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不可以直接在Dockerfile中實現。
因爲宿主機目錄是依賴於特定宿主機的,並不可以保證在全部的宿主機上都存在這樣的特定目錄。
# volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success1" CMD /bin/bash
docker build -f /mydocker/Dockerfile -t xdr630/centos .
運行後一層一層執行,以容器內的centos鏡像爲根本,就能夠建立另一個自定義的centos鏡像。
如今直接運行剛纔建立的容器,一運行就會直接在xdr630/centos 下建立兩個容器卷
docker images 容器名 能夠查詢images下是否有這個容器,如:
docker run -it xdr630/centos
在自定義的centos的容器卷1中建立a.txt而且寫入 hello Docker!
容器內有兩個容器卷,沒有指定對應的宿主機上的路徑。但docker會有默認的對應的路徑
這裏注意的是最新版的centos鏡像中默認對應的宿主機的路徑在「Mounts」值中
Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個--privileged=true參數便可
是什麼?
命名的容器掛載數據卷,其它容器經過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之爲數據卷容器
在dataVolumeContainer2新增內容
dc02/dc03繼承自dc01
--volumes-from
命令
docker run -it --name dc02 --volumes-from dc01 xdr630/centos
發現有剛纔新增的文件
dc02/dc03分別在dataVolumeContainer2各自新增內容