亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

淺談docker學習之docker數據卷(volume)

2024-09-01 13:53:32
字體:
來源:轉載
供稿:網友

1.什么是數據卷volume

為了了解什么是Docker Volume,首先我們需要明確Docker內的文件系統是如何工作的。Docker鏡像被存儲在一系列的只讀層。當我們開啟一個容器,Docker讀取只讀鏡像并添加一個讀寫層在頂部。如果正在運行的容器修改了現有的文件,該文件將被拷貝出底層的只讀層到最頂層的讀寫層。在讀寫層中的舊版本文件隱藏于該文件之下,但并沒有被不破壞 - 它仍然存在于鏡像以下。當Docker的容器被刪除,然后重新啟動鏡像時,將開啟一個沒有任何更改的新的容器 - 這些更改會丟失。此只讀層及在頂部的讀寫層的組合被Docker稱為Union File System(聯合文件系統)。
為了能夠保存(持久)數據以及共享容器間的數據,Docker提出了Volumes的概念。很簡單,volumes是目錄(或者文件),它們是外部默認的聯合文件系統或者是存在于宿主文件系統正常的目錄和文件。

2.為什么使用數據卷volume

Docker的鏡像是由一系列的只讀層組合而來,當啟動一個容器的時候,Docker加載鏡像的所有只讀層,并在最上層加入一個讀寫層。這個設計使得Docker可以提高鏡像構建、存儲和分發的效率,節省了時間和存儲空間,然而也存在如下問題。

(1)容器中的文件在宿主機上存在形式復雜,不能在宿主機上很方便的對容器中的文件進行訪問

(2)多個容器之間的數據無法共享

(3)當刪除容器時,容器產生的數據將丟失

為了解決這些問題,Docker引入了數據卷(volume)機制。volume是存在一個或多個容器中的特定文件或文件夾,這個目錄能夠獨立于聯合文件系統的形式在宿主機中存在,并為數據的共享與持久提供一下便利。

(1)volume在容器創建時就初始化,在容器運行時就可以使用其中的文件

(2)volume能在不同的容器之間共享和重用

(3)對volume中的數據的操作會馬上生效

(4)對volume中數據操作不會影響到鏡像本身

(5)volume的生存周期獨立于容器的生存周期,即使刪除容器,volume仍然會存在,沒有任何容器使用的volume也不會被Docker刪除

3.如何使用數據卷 

3.1 從容器掛載volume(-v /path)

在使用docker run創建新容器的時候,可以使用-v 標簽為容器添加數據卷volume,以下用法是從容器中的某個文件夾創建volume,如果容器中指定的文件夾不存在,會自動生成

docker,數據卷,volume

在上面的概念中,有說道,宿主機應該會有一個文件夾綁定掛載到容器中的volume掛載點,那默認的宿主機上的文件夾在哪呢,使用docker inspect命令,查看下容器詳情(CRT令起一個SSH終端)

[root@localhost ~]# docker inspect volume-test01 [  {   "Id": "81a74152e6f45a3f780ac7cdc37c9a089814f9a70aad1d27747093ca3c3dae3e",   "Created": "2016-08-25T07:48:55.942949334Z",   "Path": "/bin/bash",   "Args": [],   "State": {    "Status": "running",    "Running": true,    "Paused": false,    "Restarting": false,    "OOMKilled": false,    "Dead": false,    "Pid": 10199,    "ExitCode": 0,    "Error": "",    "StartedAt": "2016-08-25T07:48:56.777918888Z",    "FinishedAt": "0001-01-01T00:00:00Z"   },   "Image": "sha256:4fd21defa24c8c07b3689b267a63d563ca0e26ef931b329fc3f3d46efb5bba2d",   "ResolvConfPath": "/var/lib/docker/containers/81a74152e6f45a3f780ac7cdc37c9a089814f9a70aad1d27747093ca3c3dae3e/resolv.conf",   "HostnamePath": "/var/lib/docker/containers/81a74152e6f45a3f780ac7cdc37c9a089814f9a70aad1d27747093ca3c3dae3e/hostname",   "HostsPath": "/var/lib/docker/containers/81a74152e6f45a3f780ac7cdc37c9a089814f9a70aad1d27747093ca3c3dae3e/hosts",   "LogPath": "",   "Name": "/volume-test01",   "RestartCount": 0,   "Driver": "devicemapper",   "MountLabel": "system_u:object_r:svirt_sandbox_file_t:s0:c47,c332",   "ProcessLabel": "system_u:system_r:svirt_lxc_net_t:s0:c47,c332",   "AppArmorProfile": "",   "ExecIDs": null,   "HostConfig": {    "Binds": null,    "ContainerIDFile": "",    "LogConfig": {     "Type": "journald",     "Config": {}    },    "NetworkMode": "default",    "PortBindings": {},    "RestartPolicy": {     "Name": "no",     "MaximumRetryCount": 0    },    "VolumeDriver": "",    "VolumesFrom": null,    "CapAdd": null,    "CapDrop": null,    "Dns": [],    "DnsOptions": [],    "DnsSearch": [],    "ExtraHosts": null,    "GroupAdd": null,    "IpcMode": "",    "Links": null,    "OomScoreAdj": 0,    "PidMode": "",    "Privileged": false,    "PublishAllPorts": false,    "ReadonlyRootfs": false,    "SecurityOpt": null,    "UTSMode": "",    "ShmSize": 67108864,    "ConsoleSize": [     0,     0    ],    "Isolation": "",    "CpuShares": 0,    "CgroupParent": "",    "BlkioWeight": 0,    "BlkioWeightDevice": null,    "BlkioDeviceReadBps": null,    "BlkioDeviceWriteBps": null,    "BlkioDeviceReadIOps": null,    "BlkioDeviceWriteIOps": null,    "CpuPeriod": 0,    "CpuQuota": 0,    "CpusetCpus": "",    "CpusetMems": "",    "Devices": [],    "KernelMemory": 0,    "Memory": 0,    "MemoryReservation": 0,    "MemorySwap": 0,    "MemorySwappiness": -1,    "OomKillDisable": false,    "PidsLimit": 0,    "Ulimits": null   },   "GraphDriver": {    "Name": "devicemapper",    "Data": {     "DeviceId": "29",     "DeviceName": "docker-253:0-101330881-9cb32851050b1707022b475489686582a272d883a56a8ff52f3344f56b65639f",     "DeviceSize": "10737418240"    }   },   "Mounts": [    {     "Name": "5ddd734c53a38a78a9f739157c63074b4aff736d4045925616d7753402304137",     "Source": "/var/lib/docker/volumes/5ddd734c53a38a78a9f739157c63074b4aff736d4045925616d7753402304137/_data",     "Destination": "/opt/vol-data",     "Driver": "local",     "Mode": "",     "RW": true,     "Propagation": ""    }   ],   "Config": {    "Hostname": "81a74152e6f4",    "Domainname": "",    "User": "",    "AttachStdin": true,    "AttachStdout": true,    "AttachStderr": true,    "Tty": true,    "OpenStdin": true,    "StdinOnce": true,    "Env": null,    "Cmd": [     "/bin/bash"    ],    "Image": "test/mycentos:v1.0",    "Volumes": {     "/opt/vol-data": {}    },    "WorkingDir": "",    "Entrypoint": null,    "OnBuild": null,    "Labels": {}   },   "NetworkSettings": {    "Bridge": "",    "SandboxID": "c73841812aab480cf8e6a02071e36951dceb002d7b36f7dc0b38ccd9db833ba5",    "HairpinMode": false,    "LinkLocalIPv6Address": "",    "LinkLocalIPv6PrefixLen": 0,    "Ports": {},    "SandboxKey": "/var/run/docker/netns/c73841812aab",    "SecondaryIPAddresses": null,    "SecondaryIPv6Addresses": null,    "EndpointID": "3e492b611d9bd2c202c8a6c8fe4b4a755393545348b1aeb4e60995609dabb07c",    "Gateway": "172.17.0.1",    "GlobalIPv6Address": "",    "GlobalIPv6PrefixLen": 0,    "IPAddress": "172.17.0.2",    "IPPrefixLen": 16,    "IPv6Gateway": "",    "MacAddress": "02:42:ac:11:00:02",    "Networks": {     "bridge": {      "IPAMConfig": null,      "Links": null,      "Aliases": null,      "NetworkID": "54001aaff29a231c9b2fe83459805d99dce0c21d6e2719f9b11bc90d8fe2f9c9",      "EndpointID": "3e492b611d9bd2c202c8a6c8fe4b4a755393545348b1aeb4e60995609dabb07c",      "Gateway": "172.17.0.1",      "IPAddress": "172.17.0.2",      "IPPrefixLen": 16,      "IPv6Gateway": "",      "GlobalIPv6Address": "",      "GlobalIPv6PrefixLen": 0,      "MacAddress": "02:42:ac:11:00:02"     }    }   }  } ] 

注意看Mounts節點(Docker的版本用的是1.10.3),數據卷的使用,類似于 Linux 下對目錄或文件進行 mount。

"Mounts": [    {     "Name": "5ddd734c53a38a78a9f739157c63074b4aff736d4045925616d7753402304137",     "Source": "/var/lib/docker/volumes/5ddd734c53a38a78a9f739157c63074b4aff736d4045925616d7753402304137/_data",     "Destination": "/opt/vol-data",     "Driver": "local",     "Mode": "",     "RW": true,     "Propagation": ""    }   ] 

docker,數據卷,volume
     

當我們在容器的volume上操作時,宿主機上對應的文件是否也會跟著變動呢?測試一下,在容器的volume上創建一個文件test.txt,然后查看宿主機是不是也會同步存在

docker,數據卷,volume

docker,數據卷,volume

經測試,當容器上的volume有變動時,宿主機也會跟著變動,那反過來呢?經測試也是一樣的。不管是容器掛載點發生變動還是宿主機對掛載目錄進行操作,令一方都會跟著變動。

利用docker commit生成新鏡像,然后docker run -it 運行新鏡像,發現容器掛載目錄下沒有任何文件了。說明生成新鏡像時,是不保存掛載文件的。

3.2從宿主機掛載volume(-v /host-path:/container-path)

將主機的文件或文件夾作為volume掛載時,可以用多個 -v標簽為容器添加多個volume,還可以使用:ro指定該volume為只讀。注意:如果容器中指定的掛載目錄存在相同的文件時,會被宿主機覆蓋掉

docker,數據卷,volume

在宿主機上建立了/opt/vol-01和/opt/vol-02掛載點,分別和容器中的/opt/vol-test-1和/opt/vol-test-2對應,前者權限默認讀寫,后者只能讀,用docker inspect

docker,數據卷,volume

當在容器的vol-test-2上新建操作時,會提示只讀.在宿主機上,2個掛載點新增,修改,刪除操作都OK,但是在容器中居然2個都不行,按理說應用是第二個vol-test-2不行才對,不知是哪里出問題了。

利用docker commit生成新鏡像,然后docker run -it 運行新鏡像,發現容器掛載目錄下沒有任何文件了。說明生成新鏡像時,是不保存掛載文件的。

3.3使用Dockerfile添加volume

使用VOLUME指令向容器添加volume

VOLUME /data

多個時VOLUME ["/data1","/data2"]

這種情況和第一個中情況docker run -v /data是一樣的。注意,dockerfile中使用volume是不能和第二種方法那樣掛載宿主機中指定的文件夾。這時為了保證Dockerfile的可移植性,因為不能保證所有的宿主機都有對應的文件夾。

需要注意的是,在Dockerfile中使用VOLUME指令后,如果嘗試對這個volume進行修改,這些修改指令都不會生效,比如下面例子,嘗試添加一個文件,并修改文件并改變文件所有權限

FROM test/mycent:v1.0 RUN useradd foo VOLUME /data RUN touch /data/x RUN chown -R foo:foo /data 

通過該Dockerfile創建鏡像并啟動容器后,該容器中存在用戶foo,并且能看到在/data掛載的volume,但是/data文件夾的所有者并沒有被改變為foo,而且/data下也沒有/data/x文件。但是如果順序反過來,先建文件,先授權,再掛載volume,那就得到期待的結果。

4.共享volume/數據卷容器(--volumes-from)

如果你有一些持續更新的數據需要在容器之間共享,最好創建數據卷容器。數據卷容器,其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的。

先創建一個名為dbdata的數據卷容器,專門共其他容器掛載。

docker,數據卷,volume

     在/opt/dbdata下創建了一個文件db.properties。

     再啟動2個容器,a,b都a--volumes-from dbdata,b --volumes-from a.

docker,數據卷,volume

docker,數據卷,volume

    可以看到vol_a,vol_b容器的/opt/dbdata下都有db.properties文件。在vol_b的/opt/dbdata下創建文件vol_b.txt時,容器dbdata,vol_a也都同時同步了。

    對dbdata,vol_a,vol_b使用命令docker inspect時,發現他們的Mounts下的Source都是一樣的,說明它們都綁定到宿主機的同一個目錄,所以當某個容器的掛載修改時,其他容器也看到了同樣的效果

docker,數據卷,volume

如果掛載源有多個時,可以使用多個--volumes-from,如

docker run -it --name vol_use --volumes-from vol_a --volumes-from vol_b test/mycentos:v1.0 /bin/bash.

   如果一個容器掛在了volume,即使容器停止了運行,該volume仍然存在,其他容器仍然可以繼續--volumes-from它。

docker,數據卷,volume

5.刪除volume

如果創建容器時掛載了volume,

在/var/lib/docker/volumes/04b003b21b873157433deffbaf08bb0c89d234d3ec3c6576fdd7b61f5d41163e/_data下會生成相應的文件(路徑,不同版本,不同操作系統會有所不同,具體可以用docker inspect查看容器具體信息),當刪除容器時,宿主機上的掛載目錄時不會刪除的,并且目錄名稱是隨機字符,不知意義,所以在刪除容器時,需要妥善處理容器的volume。刪除容器時一并刪除volume有2中方法

(1)docker rm -v 刪除容器。就是刪除容器時,加上-v

(2)docker run --rm .就是啟動容器的時候加上--rm,那么當容器運行停止時會自動刪除容器以及容器所掛載的volume

上面創建了容器dbdata,vol_a,vol_b,vol_c,現在使用docker rm -v看看有什么效果。

docker,數據卷,volume

vol_c是--volumes-from dbdata的,刪除vol_c時,宿主機的掛載目錄仍存在,沒刪掉,猜測那是因為還有其他容器在連著或者說是dbdata -v的時候創建的。那現在刪除dbdata容器試試看(vol_a是--volumes-from dbdata的,vol_a還沒刪除,驗證下能否刪除dbdata)。

docker,數據卷,volume

發現dbdata刪除時,宿主機那目錄仍然存在,同時也說明哪怕vol_a是--volumes-from dbdata的,vol_a還沒刪除,那也沒影響。同時也說明只要還有一個容器在掛載這宿主機的目錄,那宿主機的目錄就不會刪除。那接下來,把所有容器都刪除,再看結果。

docker,數據卷,volume

可以看到,當最后一個容器刪除后,宿主機那volume目錄終于刪除了.

6.備份、恢復或遷移volume

上面有測試過,當使用docker commit等手段生成新鏡像,然后再啟動鏡像生成新容器時,原先volume目錄下的文件不見了,可以生成新鏡像時,并沒有把volume下的文件一起打包生成鏡像。

volume作為數據的載體,在很多情況下需要對其中的數據進行備份、遷移,或是從已有數據恢復。一個很容易想到的方法就是用docker inspect命令查找到volume對應宿主機上對應的那個目錄位置,然后復制其中內容或使用tar打包。當這些笨拙的做法并不值得推薦,因為查找主機上文件夾后再操作容易出錯,也不適合腳本的自動化執行。

備份volume可以使用以下方法

 

復制代碼 代碼如下:

docker run --rm --volumes-from dbdata -v $(pwd):/backup test/mycentos:v1.0 tar cvf /back/data.tar /data

 

這行指令啟動了一個臨時的容器,這個容器掛載了兩個volume,第一個volume與要備份的volume共享,第二個volume將宿主機的當前目錄(也可以絕對路徑)掛載到容器的/backup下。容器運行后將要備份的容器(/data)備份到/backup/data.tar,然后刪除容器,備份后的data.tar就留在了當前目錄。操作驗證一下

docker,數據卷,volume

居然報錯了,說沒有權限。進入容器-it時,是docker隨機生成一個用戶的,至于怎樣給該用戶授權,以后再研究吧。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人精品一区二区三区电影免费| 欧美激情乱人伦| 国产精品第二页| 色与欲影视天天看综合网| 91免费人成网站在线观看18| 3344国产精品免费看| 欧美丰满少妇xxxxx| 中文字幕成人在线| 亚洲a一级视频| 成人精品一区二区三区电影黑人| 国产精品小说在线| 欧美黄色三级网站| 亚洲日本成人网| 亚洲精品www| 高清一区二区三区四区五区| 亚洲第一色中文字幕| 欧美激情视频在线| 色综合久久久久久中文网| 97成人精品区在线播放| 欧美体内谢she精2性欧美| 中文字幕欧美精品日韩中文字幕| 久久久精品一区| 高跟丝袜欧美一区| 国产欧美一区二区三区在线看| 91av在线播放| 日韩精品久久久久| 国产欧美一区二区三区视频| 欧美体内谢she精2性欧美| 亚洲精品日韩av| 久久99视频免费| yw.139尤物在线精品视频| 精品国产一区二区三区久久狼5月| 亚洲欧美日韩区| 色综合久综合久久综合久鬼88| 亚洲精品一区在线观看香蕉| 成人激情电影一区二区| 欧美日韩亚洲国产一区| 国产亚洲精品一区二555| 国产欧美精品va在线观看| 欧美性猛交xxxx黑人| 国产成人中文字幕| 日本精品免费一区二区三区| 欧美日韩国产精品一区二区三区四区| 国产亚洲激情视频在线| 亚洲天堂网在线观看| 欧美成人精品三级在线观看| 成人欧美一区二区三区黑人| 日韩中文字幕国产| 国产亚洲欧美aaaa| 亚洲国语精品自产拍在线观看| 热99在线视频| 国产欧美日韩高清| 国语自产精品视频在线看一大j8| 久久久久成人精品| 亚洲国产婷婷香蕉久久久久久| 97超视频免费观看| 日本sm极度另类视频| 91av在线国产| 久久综合九色九九| 久久91亚洲人成电影网站| 91干在线观看| 亚洲色图美腿丝袜| 国产精品视频xxxx| 久久亚洲国产精品成人av秋霞| 国产精品久久久久久久app| 国产97色在线|日韩| 深夜福利91大全| 国产97人人超碰caoprom| 2019中文字幕在线观看| 青草青草久热精品视频在线网站| 欧美日韩中文字幕在线| 国产主播喷水一区二区| 国产精品极品尤物在线观看| 欧美成人精品一区二区| 欧美另类精品xxxx孕妇| 伊人伊人伊人久久| 国产在线观看一区二区三区| 91欧美日韩一区| 狠狠躁夜夜躁人人爽天天天天97| 国产精品成人免费电影| 欧美xxxwww| 欧美性猛交丰臀xxxxx网站| 亚洲精品wwwww| 国产欧美最新羞羞视频在线观看| 欧美第一黄网免费网站| 亚洲成人精品视频| 久久久久久久香蕉网| 亚洲欧美一区二区精品久久久| 啪一啪鲁一鲁2019在线视频| 国产精品白嫩美女在线观看| 亚洲理论电影网| 国产成人精品久久| 国产精品夜间视频香蕉| 国产视频观看一区| 国产精品久久77777| 精品亚洲va在线va天堂资源站| 国产不卡一区二区在线播放| 国产成人精品一区二区在线| 欧美视频在线观看 亚洲欧| 中文字幕亚洲综合久久筱田步美| 九九精品在线视频| y97精品国产97久久久久久| 中文字幕成人精品久久不卡| 久久久久北条麻妃免费看| www.xxxx欧美| 久久国产精品久久国产精品| 欧美在线中文字幕| 日av在线播放中文不卡| 精品国产拍在线观看| 日韩av综合网| 国产综合福利在线| 亚洲成人黄色网址| 91精品91久久久久久| 青草青草久热精品视频在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品69精品一区二区三区| 亚洲最大福利网| 日韩亚洲成人av在线| 欧美电影在线播放| 欧美日韩中文在线观看| 久热99视频在线观看| 国产成人精品综合| 色综合久久悠悠| 欧美日韩国产精品专区| 欧美高清第一页| 亚洲最大福利网| 一区二区三区国产视频| 成人欧美在线视频| 欧美精品在线视频观看| 国产精品福利在线观看| 91午夜理伦私人影院| www.xxxx精品| 日韩在线观看精品| 91在线免费观看网站| 欧美一级大片在线免费观看| 久久国产色av| 欧美第一黄网免费网站| 欧美成人在线免费视频| 国产精品精品国产| 欧美性极品少妇精品网站| 亚洲va男人天堂| 国产精品福利久久久| 国产成人精品视频在线观看| 亚洲va电影大全| 色无极亚洲影院| 国产精品一区二区久久久| 日本一区二区在线播放| 成人免费高清完整版在线观看| 亚洲欧美国产va在线影院| 亚洲高清不卡av| 久久人91精品久久久久久不卡| 亚洲欧洲成视频免费观看| 欧美黄网免费在线观看| 欧洲日本亚洲国产区| 91超碰中文字幕久久精品| 国产精品色午夜在线观看| 国产伦精品一区二区三区精品视频| 国产精品久久久久久亚洲影视| 欧美美最猛性xxxxxx| 欧美一区三区三区高中清蜜桃| 97久久久免费福利网址| 欧美裸体xxxx极品少妇| 成人黄色在线观看| 2021久久精品国产99国产精品|