docker基础---数据卷volumes
1、數(shù)據(jù)卷
數(shù)據(jù)卷是一個(gè)可供一個(gè)或多個(gè)容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
- 數(shù)據(jù)卷可以在容器之間共享和重用
- 對(duì)數(shù)據(jù)卷的修改會(huì)立馬生效
- 對(duì)數(shù)據(jù)卷的更新,不會(huì)影響鏡像
- 卷會(huì)一直存在,直到?jīng)]有容器使用
*數(shù)據(jù)卷的使用,類似于 Linux 下對(duì)目錄或文件進(jìn)行 mount。
1.1 創(chuàng)建一個(gè)數(shù)據(jù)卷
在用?docker run?命令的時(shí)候,使用?-v?標(biāo)記來(lái)創(chuàng)建一個(gè)數(shù)據(jù)卷并掛載到容器里。在一次 run 中多次使用可以掛載多個(gè)數(shù)據(jù)卷。
下面創(chuàng)建一個(gè) web 容器,并加載一個(gè)數(shù)據(jù)卷到容器的?/webapp?目錄。
docker run -d -P --name web -v /webapp training/webapp python app.py*注意:也可以在 Dockerfile 中使用?VOLUME?來(lái)添加一個(gè)或者多個(gè)新的卷到由該鏡像創(chuàng)建的任意容器。
1.2 掛載一個(gè)主機(jī)目錄作為數(shù)據(jù)卷
使用?-v?標(biāo)記也可以指定掛載一個(gè)本地主機(jī)的目錄到容器中去。
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py上面的命令加載主機(jī)的?/src/webapp?目錄到容器的?/opt/webapp?目錄。這個(gè)功能在進(jìn)行測(cè)試的時(shí)候十分方便,比如用戶可以放置一些程序到本地目錄中,來(lái)查看容器是否正常工作。本地目錄的路徑必須是絕對(duì)路徑,如果目錄不存在 Docker 會(huì)自動(dòng)為你創(chuàng)建它。
*注意:Dockerfile 中不支持這種用法,這是因?yàn)?Dockerfile 是為了移植和分享用的。然而,不同操作系統(tǒng)的路徑格式不一樣,所以目前還不能支持。
Docker 掛載數(shù)據(jù)卷的默認(rèn)權(quán)限是讀寫,用戶也可以通過?:ro?指定為只讀。
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py加了?:ro?之后,就掛載為只讀了。
1.3 掛載一個(gè)本地主機(jī)文件作為數(shù)據(jù)卷
-v?標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash這樣就可以記錄在容器輸入過的命令了。
*注意:如果直接掛載一個(gè)文件,很多文件編輯工具,包括?vi?或者?sed --in-place,可能會(huì)造成文件 inode 的改變,從 Docker 1.1 .0起,這會(huì)導(dǎo)致報(bào)錯(cuò)誤信息。所以最簡(jiǎn)單的辦法就直接掛載文件的父目錄。
2、數(shù)據(jù)卷容器
如果你有一些持續(xù)更新的數(shù)據(jù)需要在容器之間共享,最好創(chuàng)建數(shù)據(jù)卷容器。
數(shù)據(jù)卷容器,其實(shí)就是一個(gè)正常的容器,專門用來(lái)提供數(shù)據(jù)卷供其它容器掛載的。
首先,創(chuàng)建一個(gè)命名的數(shù)據(jù)卷容器 dbdata:
docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres然后,在其他容器中使用?--volumes-from?來(lái)掛載 dbdata 容器中的數(shù)據(jù)卷。?
docker run -d --volumes-from dbdata --name db1 training/postgres還可以使用多個(gè)?--volumes-from?參數(shù)來(lái)從多個(gè)容器掛載多個(gè)數(shù)據(jù)卷。 也可以從其他已經(jīng)掛載了數(shù)據(jù)卷的容器來(lái)掛載數(shù)據(jù)卷。
docker run -d --name db3 --volumes-from db1 training/postgres*注意:使用?--volumes-from?參數(shù)所掛載數(shù)據(jù)卷的容器自己并不需要保持在運(yùn)行狀態(tài)。
如果刪除了掛載的容器(包括 dbdata、db1 和 db2),數(shù)據(jù)卷并不會(huì)被自動(dòng)刪除。如果要?jiǎng)h除一個(gè)數(shù)據(jù)卷,必須在刪除最后一個(gè)還掛載著它的容器時(shí)使用?docker rm -v?命令來(lái)指定同時(shí)刪除關(guān)聯(lián)的容器。 這可以讓用戶在容器之間升級(jí)和移動(dòng)數(shù)據(jù)卷。具體的操作將在下一節(jié)中進(jìn)行講解。
3、利用數(shù)據(jù)卷容器來(lái)備份、恢復(fù)、遷移數(shù)據(jù)卷
可以利用數(shù)據(jù)卷對(duì)其中的數(shù)據(jù)進(jìn)行進(jìn)行備份、恢復(fù)和遷移。
3.1 備份
首先使用?--volumes-from?標(biāo)記來(lái)創(chuàng)建一個(gè)加載 dbdata 容器卷的容器,并從本地主機(jī)掛載當(dāng)前到容器的 /backup 目錄。命令如下:
docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata容器啟動(dòng)后,使用了?tar?命令來(lái)將 dbdata 卷備份為本地的?/backup/backup.tar。
3.2 恢復(fù)
如果要恢復(fù)數(shù)據(jù)到一個(gè)容器,首先創(chuàng)建一個(gè)帶有數(shù)據(jù)卷的容器 dbdata2。
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash然后創(chuàng)建另一個(gè)容器,掛載 dbdata2 的容器,并使用?untar?解壓備份文件到掛載的容器卷中。
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
轉(zhuǎn)載于:https://www.cnblogs.com/fan-gx/p/10765493.html
總結(jié)
以上是生活随笔為你收集整理的docker基础---数据卷volumes的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java实现二叉树
- 下一篇: vue-cli2.0创建项目步骤