Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化
容器數(shù)據(jù)卷:可以實現(xiàn)宿主機與容器進行共享、容器數(shù)據(jù)持久化,容器與容器共享數(shù)據(jù)。可以在run鏡像時使用-v參數(shù)指定宿主機與容器進行掛載的目錄,也可以使用dockerfile的volume指定容器中容器數(shù)據(jù)卷,使用dockerfile構(gòu)建鏡像后,通過該鏡像創(chuàng)建容器,那么會在宿主機中自動生成一個與之掛載的目錄。使用這個dockerfile構(gòu)建的鏡像在run時使用參數(shù)volumes-from指定另外一個該鏡像的容器,可以實現(xiàn)容器與容器進行數(shù)據(jù)盤掛載。
一 使用-v實現(xiàn)宿主機與容器數(shù)據(jù)共享
使用centos鏡像,進行演示,進行鏡像拉取:
[root@localhost ~]# docker pull centos Using default tag: latest latest: Pulling from library/centos 7a0437f04f83: Pull complete Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 300e315adb2f 4 months ago 209MB創(chuàng)建并啟動容器,使用-v參數(shù)實現(xiàn)宿主機與容器數(shù)據(jù)盤掛載
docker run -it -v /myhost:/mycontainer 300e315adb2f使用docker inspcet 查看容器信息,可以看到數(shù)據(jù)已掛載,并且在宿主機創(chuàng)建了myhost目錄,在容器創(chuàng)建了mycontainer目錄,經(jīng)寫入文件可以看到數(shù)據(jù)會同步。
docker inspect centos "Mounts": [{"Type": "bind","Source": "/myhost","Destination": "/mycontainer","Mode": "","RW": true,"Propagation": "rprivate"}],可以看到RW是讀寫都支持,如果想讓容器只讀,可以如下設(shè)置
docker run -it -v /myhost:/mycontainer:ro 300e315adb2f使用docker inspect查看 發(fā)現(xiàn)是只讀模式
"Mounts": [{"Type": "bind","Source": "/myhost","Destination": "/mycontainer","Mode": "ro","RW": false,"Propagation": "rprivate"}],二 創(chuàng)建dockerfile進行掛載
首先創(chuàng)建一個dockerfile文件,在該文件使用volume指定容器掛載的目錄(不能指定宿主機目錄,宿主機目錄自動生成,使用inspect查看宿主機目錄),對該文件進行build會得到一個新的鏡像,使用這個鏡像創(chuàng)建容器,將會實現(xiàn)容器與宿主機數(shù)據(jù)掛載。
創(chuàng)建dockerfile:在/myDocker目錄下創(chuàng)建一個文件,名稱為Dockerfile
FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]CMD echo "finished,--------success1"CMD /bin/bash對dockerfile進行build生成自定義的鏡像 mycentos (注意結(jié)尾處有一個 .)
docker build -f /mydocker/Dockerfile -t mycentos .-f 指定dockerfile的目錄,當不指定時在當前目錄下找Dockerfile文件,-t 指定鏡像名稱 命名空間/鏡像名稱:標簽,命名空間可以不寫,標簽不寫默認是latest
Sending build context to Docker daemon 3.072kB Step 1/4 : FROM centos latest: Pulling from library/centos 7a0437f04f83: Pull complete Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1 Status: Downloaded newer image for centos:latest---> 300e315adb2f Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]---> Running in c08751afe82b Removing intermediate container c08751afe82b---> d7ab4215ac34 Step 3/4 : CMD echo "finished,--------success1"---> Running in 04941c2e5c86 Removing intermediate container 04941c2e5c86---> c204038019a5 Step 4/4 : CMD /bin/bash---> Running in 7db403016320 Removing intermediate container 7db403016320---> 2a327c3561b0 Successfully built 2a327c3561b0 Successfully tagged mycentos:latest鏡像mycentos創(chuàng)建成功,看到鏡像中指定了容器數(shù)據(jù)卷??VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
使用鏡像mycentos創(chuàng)建容器,容器名稱指定為r1
[root@localhost mydocker]# docker run -it --name="r1" mycentos [root@d8fe749fd7fe /]#按ctr+p+q退出而不停止容器。
使用docker inspcet查看容器數(shù)據(jù)卷掛載信息
{"Type": "volume","Name": "e7e59e7b26198b61f067260e6595dd622f94608819f6fd3377e7fd80265e10b1","Source": "/var/lib/docker/volumes/e7e59e7b26198b61f067260e6595dd622f94608819f6fd3377e7fd80265e10b1/_data","Destination": "/dataVolumeContainer2","Driver": "local","Mode": "","RW": true,"Propagation": ""}source就是自動生成的宿主機掛載目錄
三 容器與容器通過容器數(shù)據(jù)卷進行數(shù)據(jù)掛載
容器使用相同的鏡像創(chuàng)建(上一步構(gòu)建的鏡像mycentos),一個容器在創(chuàng)建并啟動時,使用--volumes-from 指定另外一個容器的id,則實現(xiàn)了兩個容器數(shù)據(jù)卷的數(shù)據(jù)掛載。
在上一步創(chuàng)建了容器r1
[root@localhost mydocker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d8fe749fd7fe mycentos "/bin/sh -c /bin/bash" 7 minutes ago Up 7 minutes r1再次創(chuàng)建兩個容器r2 r3,這兩個容器的volumes-from指向r1
[root@localhost mydocker]# docker run -it --volumes-from d8fe749fd7fe --name r2 mycentos [root@e5992892fd8b /]# [root@localhost mydocker]# docker run -it --volumes-from d8fe749fd7fe --name r3 mycentos [root@c01d90b3c1f0 /]# [root@localhost mydocker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c01d90b3c1f0 mycentos "/bin/sh -c /bin/bash" 24 seconds ago Up 23 seconds r3 e5992892fd8b mycentos "/bin/sh -c /bin/bash" About a minute ago Up About a minute r2 d8fe749fd7fe mycentos "/bin/sh -c /bin/bash" 14 minutes ago Up 14 minutes r1進入 r3 在容器數(shù)據(jù)卷掛載的目錄下創(chuàng)建文件,發(fā)現(xiàn)r1 r2也出現(xiàn)了該文件,掛載成功。
[root@localhost mydocker]# docker attach r3 [root@c01d90b3c1f0 /]# ls bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var dataVolumeContainer1 dev home lib64 media opt root sbin sys usr [root@c01d90b3c1f0 /]# cd dataVolumeContainer1 [root@c01d90b3c1f0 dataVolumeContainer1]# touch r3.txt [root@c01d90b3c1f0 dataVolumeContainer1]# read escape sequence [root@localhost mydocker]# docker attach r2 [root@e5992892fd8b /]# cd dataVolumeContainer1 [root@e5992892fd8b dataVolumeContainer1]# ls r3.txt [root@e5992892fd8b dataVolumeContainer1]# read escape sequence [root@localhost mydocker]# docker attach r1 [root@d8fe749fd7fe /]# cd dataVolumeContainer1 [root@d8fe749fd7fe dataVolumeContainer1]# ls r3.txt [root@d8fe749fd7fe dataVolumeContainer1]#?
總結(jié)
以上是生活随笔為你收集整理的Docker 使用容器数据卷 实现宿主机与容器共享数据 容器数据持久化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第七周 项目四-队列数组
- 下一篇: Unity3d学习记录之回合制游戏