本博客為JDGan自修Docker的筆記,如有粗鄙之處,還請見諒~
閱讀本博客前,請確定了解了以前的blog:
Docker 自修筆記(五)
Docker的數據管理
Data volumes(數據卷)
Data volumes 是一種特別設計的目錄,繞開了聯合文件系統。
- Volumes在容器創建時就初始化,如果容器的父映像包含指定的掛載點上的數據,則在卷初始化時將現有數據復制到新卷中。
- 數據卷可以被容器共享。
- 可以對數據卷直接進行變更操作。
- 更新鏡像時,數據卷變更不會同步。
- 就算容器被刪了,數據卷還是會保存下來。
添加一個數據卷
Docker通過docker create
和docker run
添加-v
標簽來創建數據卷。
$ docker run -d -P --name web -v /webapp training/webapp python app.py
這樣就在容器里的/webapp
位置創建了一個新的數據卷。
也可以在Dockerfile里使用VOLUME直接添加數據卷。
定位數據卷
需要定位數據卷時,可以直接通過命令查看。
$ docker inspect web
...
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data", //主機地址
"Destination": "/webapp", //容器
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
...
將一個主機目錄設置為數據卷
Docker同樣可以通過-v
標簽將已有的主機目錄設置為數據卷。
$ docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py
其中/src/webapp
就是主機目錄,加載到容器中/webapp
,并運行起來。如果容器中的/webapp
已經存在,這個命令不會覆蓋,僅僅是在原文件基礎上添加一個讀寫層來運行,在這個數據卷被刪除后,原有的文件會恢復訪問。
- 容器目錄必須是絕對路徑,而主機目錄可以是相對或絕對路徑。
- 數據卷的名稱
name
必須符合規則:^[a-z0-9][a-z0-9\.-_]*$
。 - 容器絕對路徑必須以
/
開頭。
MAC
docker run -v /Users/<path>:/<container path> ...
Windows
docker run -v c:\<path>:c:\<container path>
Virtual machine
虛擬機等文件系統則需要設置文件共享才能使用 -v 命令
可以通過命令來修改數據卷的讀寫模式
$ docker run -d -P --name web -v /src/webapp:/webapp:ro training/webapp python app.py
也可以通過cached
降低數據卷的一致性需求來提高性能
$ docker run -d -P --name web -v /src/webapp:/webapp:cached training/webapp python app.py
安裝一個共享數據卷
在容器中創建一個名次數據卷。
$ docker run -d -P \
--volume-driver=convoy \ //如果不需要使用convoy,可以使用local
-v my-named-volume:/webapp \
--name web training/webapp python app.py
直接創建數據卷,附上docker插件。其中傳參的方式是o=<key>=<value>
:
$ docker volume create -d convoy --opt o=size=20GB my-named-volume
$ docker run -d -P \
-v my-named-volume:/webapp \
--name web training/webapp python app.py
數據卷標記
標記:z
表示數據卷可以背多個容器共享。
標記:Z
表示數據卷不能共享,是容器專用的私有卷。
將一個文件掛載為容器數據卷
-v
也可以將單個文件掛載到容器作為數據卷。
$ docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash
創建并部署數據卷容器
$ docker create -v /dbdata --name dbstore training/postgres /bin/true
$ docker run -d --volumes-from dbstore --name db1 training/postgres
$ docker run -d --volumes-from dbstore --name db2 training/postgres
$ docker run -d --name db3 --volumes-from db1 training/postgres
如果需要刪除容器同時刪除掛載的數據卷,則要使用docker rm -v
,否則該數據卷就會變為無關聯dangling
數據卷,可以通過docker volume ls -f dangling=true
查詢到這些數據卷。
刪除數據卷
$ docker run --rm -v /foo -v awesome:/bar busybox top
刪除所有沒有使用和掛載的數據卷并釋放空間:
$ docker volume prune
列出所有數據卷
$ docker volume ls
備份恢復和遷移數據卷
如果需要做到備份恢復和遷移數據卷,將需要用到--volumes-from
,舉個栗子:
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
這個栗子梨,創建了一個新的容器并啟動,掛載了dbstore容器的數據卷,部署在本地目錄/backup
,最后,通過tar
備份了dbdata
的數據卷到/backup/backup.tar
。
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"