Docker基礎 5.Docker容器資料卷
阿新 • • 發佈:2018-12-14
Docker基礎
@Author:hanguixian
@Email:[email protected]
Docker文件:https://docs.docker.com/
Dcker中文文件:https://docs.docker-cn.com/
五.Docker容器資料卷
1.是什麼
- Docker的理念:
- 將運用與執行的環境打包形成容器執行,執行可以伴隨著容器,但是我們對資料的要求希望是持久化的
- 容器之間希望有可能共享資料
- Docker容器產生的資料,如果不通過docker commit生成成新的映象,使得資料做為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就沒有了。 為了能儲存資料在docker中我們使用卷。
2.能做什麼
- 卷就是目錄或檔案,存在於一一個或多個容器中,由docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System提供些用於持續儲存或共享資料的特性
- 卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的資料卷
特點:
- 1.資料卷可在容器之間共享或重用資料
- 2.卷中的更改可以直接生效
- 3.資料卷中的更改不會包含在映象的更新中
- 4.資料卷的生命週期一直持續到沒有容器使用它為止
容器的持久化
- 容器間繼承+共享資料
3.資料卷
容器內新增
直接命令新增
命令: docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 映象名
- 例子: docker run -it -v /myDataVolume:/dataVolumeContainer centos
檢視資料卷是否掛載成功
使用 docker inspect 容器id
"Mounts": [ { "Type": "bind", "Source
容器和宿主機之間資料共享
- 在宿主機中建立檔案,在容器中修改該檔案,可以看到檔案同步
- 命令: touch a.txt vim a.txt
容器停止退出後,主機修改後資料是否同步
- 容器先停止–>主機修改檔案–>容器重啟進入–>檢視主機修改過的檔案–>內容同步
命令(帶許可權)
- docker run -it -v /宿主機絕對路徑目錄:/容器內目錄
:ro
映象名 - 容器中,檔案是隻讀狀態,不能新增修改
- docker run -it -v /宿主機絕對路徑目錄:/容器內目錄
DockerFile新增
根目錄下新建mydocker資料夾並進入
- 命令 : mkdir /mydocker
可在Dockerfile中使用VOLUME指令來給映象新增一個或多個數據卷
- VOLUME [“/dataVolumeContainer’,”/dataVolumeContainer2”,”/dataVolumeContainer3”]
- 說明:
- 出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
- 由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。
File構建
- 在/mydocker下建立Dockerfile
#volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,------success" CMD /bin/bash
- 相當於:
docker run -it -v /host1:/dataVolumeContainer -v /host2:/dataVolumeContainer2 cnetos /bin/bash
build後生成映象
- 命令: docker build -f /mydocker/DockerFile -t hanguixian/centos_u .
[[email protected] mydocker]# docker build -f /mydocker/DockerFile -t hanguixian/centos_u . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM centos ---> 5182e96772bf Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] ---> Using cache ---> be7f6ccf6f5e Step 3/4 : CMD echo "finished,------success" ---> Running in 92492c960ec4 Removing intermediate container 92492c960ec4 ---> 6c3c0ea2b54c Step 4/4 : CMD /bin/bash ---> Running in 053f5f238bf9 Removing intermediate container 053f5f238bf9 ---> ca21681a1ecb Successfully built ca21681a1ecb Successfully tagged hanguixian/centos_u:latest
獲得一個新映象hanguixian/centos_u , run容器
docker images
[root@iZuf64yofkbhpt8m0ackshZ mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hanguixian/centos_u latest ca21681a1ecb 2 minutes ago 200MB
docker run -it hanguixian/centos_u
[root@iZuf64yofkbhpt8m0ackshZ mydocker]# docker run -it hanguixian/centos_u [[email protected]26cf1a5a8757 /]# ll total 64 -rw-r--r-- 1 root root 12005 Aug 4 22:05 anaconda-post.log lrwxrwxrwx 1 root root 7 Aug 4 22:04 bin -> usr/bin drwxr-xr-x 2 root root 4096 Aug 27 07:44 dataVolumeContainer1 drwxr-xr-x 2 root root 4096 Aug 27 07:44 dataVolumeContainer2 drwxr-xr-x 5 root root 360 Aug 27 07:44 dev drwxr-xr-x 1 root root 4096 Aug 27 07:44 etc drwxr-xr-x 2 root root 4096 Apr 11 04:59 home lrwxrwxrwx 1 root root 7 Aug 4 22:04 lib -> usr/lib lrwxrwxrwx 1 root root 9 Aug 4 22:04 lib64 -> usr/lib64 drwxr-xr-x 2 root root 4096 Apr 11 04:59 media drwxr-xr-x 2 root root 4096 Apr 11 04:59 mnt drwxr-xr-x 2 root root 4096 Apr 11 04:59 opt dr-xr-xr-x 148 root root 0 Aug 27 07:44 proc dr-xr-x--- 2 root root 4096 Aug 4 22:05 root drwxr-xr-x 10 root root 4096 Aug 4 22:05 run lrwxrwxrwx 1 root root 8 Aug 4 22:04 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Apr 11 04:59 srv dr-xr-xr-x 13 root root 0 Aug 27 07:44 sys drwxrwxrwt 7 root root 4096 Aug 4 22:05 tmp drwxr-xr-x 13 root root 4096 Aug 4 22:04 usr drwxr-xr-x 18 root root 4096 Aug 4 22:04 var
通過上述步驟,容器內的卷目錄地址已經知道對應的主機目錄地址哪?
- docker inspect 26cf1a5a8757
}, "Mounts": [ { "Type": "volume", "Name": "9a33a9f028e45e7410d0c908ccbcc496e1a321fa96d0781c3c61dac3c5c11f35", "Source": "/var/lib/docker/volumes/9a33a9f028e45e7410d0c908ccbcc496e1a321fa96d0781c3c61dac3c5c11f35/_data", "Destination": "/dataVolumeContainer1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "0a98062cdb70ecfb32e040c668ed0e1528f0b409173275da4ad6f0c5e0322ac2", "Source": "/var/lib/docker/volumes/0a98062cdb70ecfb32e040c668ed0e1528f0b409173275da4ad6f0c5e0322ac2/_data", "Destination": "/dataVolumeContainer2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }
主機對應預設地址
- /var/lib/docker/volumes/9a33a9f028e45e7410d0c908ccbcc496e1a321fa96d0781c3c61dac3c5c11f35/_data
備註
- Docker掛載主機目錄Docker訪問出現cannot open directory : Permission denied
- 解決辦法:在掛載目錄後多加一個–privileged=true引數即可
- 例如: docker run -it -v /myDataVolume:/dataVolumeContainer –privileged=true centos
4.資料卷容器
是什麼
- 命名的容器掛載資料卷,其他容器通過掛載這個(父容器)實現資料共享,掛載資料卷的容器,稱之為資料卷容器
簡介
- 以上一步新建的映象hanguixian/centos_u為模板並執行容器dc01/dc02/dc03
- 它們已經具有容器卷
- /dataVolumeContainer1
- /dataVolumeContainer2
容器間傳遞共享(–volume-from)
先啟動一個父容器dc01
- 命令: docker run -it –name doc1 hanguixian/centos_u
- 在dataVolumeContainer2新增內容
- cd dataVolumeContainer2
- vi a.txt
dc02/dc03繼承自dc01
–volumes-from
命令
docker run -it --name doc2 --volumes-from doc1 hanguixian/centos_u
[root@iZuf64yofkbhpt8m0ackshZ /]# docker run -it --name doc2 --volumes-from doc1 hanguixian/centos_u [root@ac3acc6567f3 /]# cd dataVolumeContainer2 [root@ac3acc6567f3 dataVolumeContainer2]# ll total 4 -rw-r--r-- 1 root root 7 Aug 27 08:19 a.txt
可以看dataVolumeContainer2中有我們在doc1中建立的a.txt
dc02/dc03分別在dataVolumeContainer2各自新增內容
回到dc01可以看到02/03各自新增的都能共享
刪除dc01,dc02修改後dc03可否訪問
- 可以
刪除dc02後dc03可否訪問
- 可以
新建dc04繼承dc03後再刪除dc03
- 可以
結論:容器之間配置資訊的傳遞,資料卷的生命週期一直持續到沒有容器使用它為止