docker筆記12-容器資料卷volumes
資料卷的概念
我們知道,當我們把一個執行中的容器關閉後,容器裡面的資料就沒有了(如果你做了docker commit操作,資料會保留到新的映象裡面)。所以我們就需要用容器資料捲來把資料進行持久化儲存。
還有一種情況,就是希望容器之間有可能共享資料,這時也需要容器資料卷。
一句話,資料卷就是用來解決資料持久化和資料共享的。
卷就是目錄或檔案,存在一個或者多個容器中,由docker宿主機掛載到容器上,但不屬於聯合檔案系統,因此能繞過聯合檔案系統提供一些用於持久儲存或共享資料的特性。
卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此docker不會在容器刪除時刪除其掛載的資料卷。
特點:
1)資料卷可在容器之間共享或重用資料;
2)卷的更改可以直接生效;
3)資料卷中的更改不會包含在映象的更新中;
4) 資料卷的生命週期一直持續到沒有容器使用它為止。
5)資料卷可以完成容器到宿主機、宿主機到容器之間的資料共享。
容器內新增資料卷
在容器內新增資料卷有兩種方法,一個是直接用命令新增,一個是用dockerfile新增,下面分別介紹。
直接命令新增資料卷
1)命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 映象名
說明:-v是volume卷的意思
宿主機絕對目錄和容器內目錄都不用提前建立
[root@t-docker chenzx]# docker run -it -v /myDataVolume:/dataVolumeContainer centos [root@8ad4df9ec2fd /]# ls anaconda-post.log dataVolumeContainer etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv tmp var [root@8ad4df9ec2fd /]# cd dataVolumeContainer/
2)檢視資料卷是否掛載成功
[root@t-docker myDataVolume]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8ad4df9ec2fd centos "/bin/bash" 5 minutes ago Up 5 minutes lucid_swartz [root@t-docker myDataVolume]# docker inspect 8ad4df9ec2fd "Mounts": [ { "Type": "bind", "Source": "/myDataVolume", "Destination": "/dataVolumeContainer", "Mode": "", "RW": true, ##注意RW是true才能可讀寫 "Propagation": "rprivate"
3)驗證容器和宿主機之間資料共享
在/myDataVolume和/dataVolumeContainer上各建立檔案,都能互相看到。
4)容器停止退出後,主機修改後資料是否同步
答案:還同步
5)帶許可權的資料卷
命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 映象名
說明:-v是volume卷的意思
宿主機絕對目錄和容器內目錄都不用提前建立
ro:是read only的意思
[root@t-docker chenzx]# docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos [root@c13998a78deb /]# ls [root@t-docker myDataVolume]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c13998a78deb centos "/bin/bash" 2 minutes ago Up 2 minutes wonderful_khorana [root@t-docker myDataVolume]# docker inspect c13998a78deb "Mounts": [ { "Type": "bind", "Source": "/myDataVolume", "Destination": "/dataVolumeContainer", "Mode": "ro", "RW": false, ##不能寫,只能讀 "Propagation": "rprivate"
6) 其他
有時候可能會出現docker掛載的宿主機目錄,容器訪問出現cannot open directory:permission denied。
解決辦法:在掛載目錄後面多加一個--privileged=true引數即可。
[root@t-docker chenzx]# docker run -it -v /myDataVolume:/dataVolumeContainer -privileged=true centos
dockerfile方式新增資料卷
1)根目錄下新建mydocker資料夾並進入
[root@t-docker chenzx]# mkdir /mydocker [root@t-docker chenzx]# cd /mydocker/
2)可在dockerfile中使用volume指令來給映象新增一個或多個資料卷
語法:VOLUME ["/dataVolumeContainer",'/data/VolumeContainer2','/dataVolumeContainer3']
說明:出於可移植性和分享的考慮,用-v主機目錄:容器目錄這種方法不能直接在dockerfile中實現。因為宿主機目錄是依賴於特定宿主機的,並不能保證在所有的宿主機上都存在這樣的特定目錄。
3)dockerfile構建
[root@t-docker chenzx]# cd /mydocker/ [root@t-docker mydocker]# cat Dockerfile #volume test #繼承centos映象 FROM centos #在上面繼承的centos目錄下建立兩個資料卷 VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,--------success1" CMD /bin/bash
4)build後生成映象
[root@t-docker mydocker]# cd /mydocker/ [root@t-docker mydocker]# docker build -f /mydocker/Dockerfile -t chenzx/centos . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 5182e96772bf Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] ---> Running in d7a71c40c684 Removing intermediate container d7a71c40c684 ---> 1edef45a66a2 Step 3/4 : CMD echo "finished,--------success1" ---> Running in 0cad5eaf3a5e Removing intermediate container 0cad5eaf3a5e ---> 027d129bc237 Step 4/4 : CMD /bin/bash ---> Running in 0f4088e1bf0e Removing intermediate container 0f4088e1bf0e ---> a37b96c1c7a7 Successfully built a37b96c1c7a7 Successfully tagged chenzx/centos:latest [root@t-docker mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE chenzx/centos latest a37b96c1c7a7 18 seconds ago 200MB
說明: -t是-tag list的意思
5)run容器
[root@t-docker mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE chenzx/centos latest a37b96c1c7a7 7 minutes ago 200MB [root@t-docker mydocker]# docker run -it chenzx/centos [root@3ccb67a921de /]# [root@3ccb67a921de /]# ls anaconda-post.log dataVolumeContainer1 dev home lib64 mnt proc run srv tmp var bin dataVolumeContainer2 etc lib media opt root sbin sys usr [root@3ccb67a921de /]#
ls後看到容器內有dataVolumeContainer1和dataVolumeContainer2兩個目錄
6)檢視容器內的卷目錄地址對應宿主機目錄地址
[root@t-docker /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ccb67a921de chenzx/centos "/bin/sh -c /bin/bash" 6 minutes ago Up 6 minutes gallant_jang [root@t-docker /]# docker inspect 3ccb67a921de "Mounts": [ { "Type": "volume", "Name": "0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d", "Source": "/var/lib/docker/volumes/0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d/_data", "Destination": "/dataVolumeContainer1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06", "Source": "/var/lib/docker/volumes/18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06/_data", "Destination": "/dataVolumeContainer2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }
上面我們看到是宿主機上的
/var/lib/docker/volumes/0055c21730734a9a73751de1ae1c7a5865f369e180d911490569d4aa1b78479d/_data對應容器裡面的/dataVolumeContainer1,
var/lib/docker/volumes/18c5bc0fba2ec1913a7fd4997fc2181d16f2640d0c271571c0b580db89797c06/_data對應容器裡面的/dataVolumeContainer2
容器資料卷
命名的容器掛載資料卷,其他容器透過掛載這個父容器實現資料共享,掛載資料卷的容器,稱之為資料卷容器。
下面我們以上一步新建的映象chenzx/centos為模板並執行容器dc01/dc02/dc03。
我們透過前面新建的映象chenzx/centos為模板,生成的容器是掛載著/dataVolumeContainer1和/dataVolumeContainer2兩個資料卷。
1)先啟動一個父容器dc01,並在dataVolumeContainer2中新增內容
[root@t-docker chenzx]# docker images chenzx/centos REPOSITORY TAG IMAGE ID CREATED SIZE chenzx/centos latest a37b96c1c7a7 3 hours ago 200MB [root@t-docker chenzx]# docker run -it --name dc01 chenzx/centos [root@b786166d80d7 /]# ls dataVolumeContainer1 dataVolumeContainer2 [root@b786166d80d7 /]# cd dataVolumeContainer1 [root@b786166d80d7 dataVolumeContainer1]# touch dc01_add.txt [root@t-docker chenzx]# [root@t-docker chenzx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b786166d80d7 chenzx/centos "/bin/sh -c /bin/bash" 8 minutes ago Up 8 minutes dc01
2)dc02/dc03繼承dc01(--volumes-from引數)
[root@t-docker chenzx]# docker run -it --name dc02 --volumes-from dc01 chenzx/centos [root@e71e1991a17b /]# ls anaconda-post.log dataVolumeContainer1 dev home lib64 mnt proc run srv tmp var bin dataVolumeContainer2 etc lib media opt root sbin sys usr [root@e71e1991a17b /]# cd dataVolumeContainer1 [root@e71e1991a17b dataVolumeContainer1]# ls dc01_add.txt [root@e71e1991a17b dataVolumeContainer1]# touch dc02_add.txt [root@e71e1991a17b dataVolumeContainer1]# ls dc01_add.txt dc02_add.txt [root@t-docker chenzx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e71e1991a17b chenzx/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes dc02 b786166d80d7 chenzx/centos "/bin/sh -c /bin/bash" 14 minutes ago Up 14 minutes dc01
[root@t-docker chenzx]# docker run -it --name dc03 --volumes-from dc01 chenzx/centos [root@69c4c254cb0f /]# cd dataVolumeContainer1 [root@69c4c254cb0f dataVolumeContainer1]# ls dc01_add.txt dc02_add.txt [root@69c4c254cb0f dataVolumeContainer1]# touch dc03_add.txt [root@69c4c254cb0f dataVolumeContainer1]# ls dc01_add.txt dc02_add.txt dc03_add.txt [root@t-docker chenzx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69c4c254cb0f chenzx/centos "/bin/sh -c /bin/bash" 2 minutes ago Up About a minute dc03 e71e1991a17b chenzx/centos "/bin/sh -c /bin/bash" 7 minutes ago Up 7 minutes dc02 b786166d80d7 chenzx/centos "/bin/sh -c /bin/bash" 18 minutes ago Up 18 minutes dc01
3) 回到dc01可以看到dc02/dc03新增的資料了
[root@t-docker chenzx]# docker exec -it dc01 /bin/bash [root@b786166d80d7 /]# ls anaconda-post.log dataVolumeContainer1 dev home lib64 mnt proc run srv tmp var bin dataVolumeContainer2 etc lib media opt root sbin sys usr [root@b786166d80d7 /]# cd dataVolumeContainer1 [root@b786166d80d7 dataVolumeContainer1]# ls dc01_add.txt dc02_add.txt dc03_add.txt
4)刪除dc01,dc02修改後dc03可否訪問
[root@t-docker chenzx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69c4c254cb0f chenzx/centos "/bin/sh -c /bin/bash" About an hour ago Up About an hour dc03 e71e1991a17b chenzx/centos "/bin/sh -c /bin/bash" About an hour ago Up About an hour dc02 b786166d80d7 chenzx/centos "/bin/sh -c /bin/bash" About an hour ago Up About an hour dc01 [root@t-docker chenzx]# [root@t-docker chenzx]# docker rm -f dc01 dc01 [root@t-docker chenzx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69c4c254cb0f chenzx/centos "/bin/sh -c /bin/bash" About an hour ago Up About an hour dc03 e71e1991a17b chenzx/centos "/bin/sh -c /bin/bash" About an hour ago Up About an hour dc02 [root@t-docker chenzx]# docker attach dc02 [root@e71e1991a17b dataVolumeContainer1]# ls dc01_add.txt dc02_add.txt dc03_add.txt [root@e71e1991a17b dataVolumeContainer1]# touch dc02_update.txt [root@e71e1991a17b dataVolumeContainer1]# ls dc01_add.txt dc02_add.txt dc02_update.txt dc03_add.txt
5)刪除dc02後,dc03仍然可以訪問
6)新建dc04繼承dc03後再刪除dc03
[root@t-docker chenzx]# docker run -it --name dc04 --volumes-from dc03 chenzx/centos [root@7b7f4dd0c965 /]# cd dataVolumeContainer1 [root@7b7f4dd0c965 dataVolumeContainer1]# ls dc01_add.txt dc02_add.txt dc02_update.txt dc03_add.txt
7)j結論:容器之間配置資訊的傳遞。資料卷的生命週期一直持續到沒有容器使用它為止。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2213253/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- docker資料卷(Data Volumes)Docker
- Docker學習筆記:映象、容器、資料卷Docker筆記
- Docker資料管理(資料卷+資料卷容器)Docker
- Docker 容器資料卷 三Docker
- docker - [10] 容器資料卷Docker
- Docker容器的資料卷Docker
- Docker容器資料卷、DockerfileDocker
- Docker(六)容器資料卷Docker
- Docker 資料卷,資料卷容器詳細介紹Docker
- [Docker 系列]docker 學習六,資料卷容器Docker
- [Docker 系列]docker 學習 五,容器資料卷Docker
- 容器技術之Docker資料卷Docker
- 【Docker】資料卷及容器連線Docker
- Docker 入門系列二:容器的資料卷Docker
- Docker 學習筆記(第五集:資料卷)Docker筆記
- 容器資料卷
- docker學習筆記(4)- 應用資料管理(容器外)Docker筆記
- Docker筆記二之容器Docker筆記
- Docker筆記(六):容器管理Docker筆記
- Docker資料卷Docker
- 『現學現忘』Docker基礎 — 28、Docker容器資料卷介紹Docker
- 『現學現忘』Docker基礎 — 29、Docker容器資料卷的應用Docker
- docker容器卷是什麼Docker
- 『現學現忘』Docker基礎 — 33、Docker資料卷容器的說明與共享資料原理Docker
- Docker筆記(八):資料管理Docker筆記
- docker系列(四):資料卷Docker
- Docker學習總結(四)——容器間的通訊和資料卷Docker
- docker筆記34-容器資源需求、資源限制及HeapSterDocker筆記
- Docker 與 K8S學習筆記(十 二)容器間資料共享DockerK8S筆記
- Docker小白到實戰之容器資料卷,整理的明明白白Docker
- docker建立mysql、nginx資料卷DockerMySqlNginx
- Mac使用Docker時,卷預設掛載路徑/var/lib/docker/volumes不存在問題MacDocker
- Docker-nginx資料卷掛載DockerNginx
- docker 資料卷掛載總結Docker
- Docker 學習筆記(第三集:容器)Docker筆記
- Docker筆記(十三):容器日誌採集實踐Docker筆記
- docker筆記49-容器虛擬化網路Docker筆記
- docker學習筆記-為容器配置重啟策略Docker筆記