容器中管理資料有兩種方式:
- 資料卷(Data Volumes)
- 資料卷容器(Data Volume Dontainers)
1,資料卷
資料卷是一個可供容器使用的特殊目錄,他繞過檔案系統,提供很多有用的特性:
- 可以在容器之間共享和重用
- 對資料卷的修改會立刻生效
- 對資料卷的更新不影響鏡像
- 一直存在直到沒有容器使用
資料卷的使用類型linux下對目錄或檔案進行mount操作。
- 在容器中建立一個資料卷
在使用docker run指令的時候,使用-v标記可以在容器内建立一個資料卷,多次使用-v可以建立多個資料卷。
栗子:使用training/webapp 鏡像建立一個web容器,并建立一個資料卷挂載到容器的/webapp目錄:
docker run -d -P --name web -v /webapp training/webapp python app.py,其中-P是允許外部通路容器需要暴漏的端口。
- 挂在一個主機目錄作為資料卷
使用-v标記也可以指定挂載一個本地目錄到容器中作為資料卷:
docker run -P -d --name web2 -v /src/webapp:/opt/webapp training/webapp python app.py,加載主機的/src/webapp目錄到容器的/opt/webapp目錄:
這個功能在進行測試的時候非常友善,可以在本地目錄放一些檔案或程式,然後在容器中使用。
- 挂載一個主機檔案作為資料卷
-v也可以指定一個本地檔案挂載到容器中作為資料卷:
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash,這樣就可以記錄在容器内輸入過的曆史指令了。
2,資料卷容器
如果需要多個容器共享一些經常更新的資料,最簡單的方式就是使用資料卷容器。資料卷容器就是一個普通的容器,專門提供資料卷給其他容器挂載:
首先,建立一個資料容器dbdata,并在其中建立一個資料卷挂載點dbdata:
docker run -it -v /dbdata --name dbdata ubuntu
然後可以在其他容器使用--volumes-from來挂載dbdata容器中資料卷,例如建立db1、db2兩個容器,并從dbdata容器挂載資料卷:
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
此時,容器db1和db2挂載同一個資料卷到/dbdata目錄。三個容器任何一個在該目錄寫入,其他容器都可以看到。
3,利用資料卷容器遷移資料
- 備份
使用下面到指令來備份dbdata資料卷容器到資料卷:
docker run --volumes-from dbdata -v /bk:/bk --name worker ubuntu tar cvf /bk/bk.tar /dbdata
- 恢複
首先建立一個帶有資料卷到容器:
docker run -it -v /dbdata --name dbdata2 ubuntu /bin/bash
然後建立一個新的容器,挂載dbdata2容器,将bk.tar解壓到容器中:
docker run --volumes-from dbdata2 -v /bk:/bk ubuntu tar xvf /bk/bk.tar