是什么
一句話:有點類似我們Redis里面的rdb和aof文件
先來看看Docker的理念:
* 將運用與運行的環境打包形成容器運行 ,運行可以伴隨着容器,但是我們對數據的要求希望是持久化的
* 容器之間希望有可能共享數據
Docker容器產生的數據,如果不通過docker commit生成新的鏡像,使得數據做為鏡像的一部分保存下來,
那么當容器刪除后,數據自然也就沒有了。
為了能保存數據在docker中我們使用卷。
能干嘛
- 容器的持久化
- 容器間繼承+共享數據
卷就是目錄或文件,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合文件系統,因此能夠繞過Union File System提供一些用於持續存儲或共享數據的特性:
卷的設計目的就是數據的持久化,完全獨立於容器的生存周期,因此Docker不會在容器刪除時刪除其掛載的數據卷
特點:
- 1:數據卷可在容器之間共享或重用數據
- 2:卷中的更改可以直接生效
- 3:數據卷中的更改不會包含在鏡像的更新中
- 4:數據卷的生命周期一直持續到沒有容器使用它為止
數據卷
直接命令添加
1、命令
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 鏡像名
docker run -it -v /wei:/wei centos
2、查看數據卷是否掛載成功
docker inspect df6f397beedd
3、容器和宿主機之間數據共享
4、容器停止退出后,主機修改后數據是否同步【完全同步】
5、命令(帶權限)
docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 鏡像名
DockerFile添加
1、根目錄下新建mydocker文件夾並進入
2、可在Dockerfile中使用VOLUME指令來給鏡像添加一個或多個數據卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。
3、File構建
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
4、build后生成鏡像
docker build --f /root/heian -t heian/centos .
5、run容器
6、通過上述步驟,容器內的卷目錄地址已經知道對應的主機目錄地址哪??
7、主機對應默認地址
數據完全可以同步
備注
Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄后多加一個--privileged=true參數即可
數據卷容器
是什么
命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器
總體介紹
1、以上一步新建的鏡像heian/centos為模板並運行容器dc01/dc02/dc03
2、它們已經具有容器卷
- /dataVolumeContainer1
- /dataVolumeContainer2
容器間傳遞共享(--volumes-from)
1、先啟動一個父容器dc01,在dataVolumeContainer2新增內容
2、dc02/dc03繼承自dc01
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
dc02/dc03分別在dataVolumeContainer2各自新增內容
3、回到dc01可以看到02/03各自添加的都能共享了
4、刪除dc01,dc02修改后dc03可否訪問
5、刪除dc02后dc03可否訪問
再進一步
6、新建dc04繼承dc03后再刪除dc03
結論:容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止