數據卷簡介
轉載鏈接數據卷是一個可以供一個或多個容器使用的特殊目錄。
可以達到以下目的:
繞過“拷貝寫”系統,以達到本地磁盤 IO 的性能,(比如運行一個容器,在容器中對數據卷修改內容,會直接改變宿主機上的數據卷中的內容,所以是本地磁盤IO的性能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。)
繞過“拷貝寫”系統,有些文件不需要在
docker commit
打包進鏡像文件。在多個容器間共享目錄。
在宿主和容器間共享目錄。
在宿主和容器間共享一個文件
創建數據卷
方法一:dockerfile
中指定 VOLUME 後的目錄,如 VOLUME /var/lib/test
方法二:docker run
命令中加 -v
選項。如:
docker run -d -P -v /webapp training/webapp python app.py
注意: 這裏定義的 /webapp
數據卷,但是不知道宿主機上與之對應的在哪裏。我們需要仔細的觀察 docker inspect
的結果,是非常長的一段東西。在這裏我只摘出我們需要的部分:
"Mounts": [
{
"Type": "volume",
"Name": "ae15b45565ac99bc8f770b226684f7ef707eb8a4d9b8111a0e6b8410ab7b7942",
"Source": "/var/lib/docker/volumes/ae15b45565ac99bc8f770b226684f7ef707eb8a4d9b8111a0e6b8410ab7b7942/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
"Volumes": {
"/webapp": {}
}
注意: 這裏 “Name”: “ae15b45565ac99bc8f770b226684f7ef707eb8a4d9b8111a0e6b8410ab7b7942”,這個並不是容器 id 而是數據卷的 ID,我們可以在 /var/lib/docker/volumes/
下找到名子爲這個數字的目錄。它就是我們數據卷在宿主機上對應的目錄。
直接掛載宿主機目錄
docker run -d -P -v /usr/local/docker/python/webapp:/webapp training/webapp python app.py
備份數據卷
這其實是利用 tar
命令來執行的。
備份的原理:使用 tar -zcvf
對數據卷打包壓縮
創建一個 MySQL 容器:
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
進入 /usr/local/docker/mysql
目錄,使用 tar -zxvf backup.tar.gz .
打包當前目錄,即可得到一個壓縮包,這個壓縮包就是我們需要的備份數據。
恢復數據卷
解壓縮備份數據壓縮包
tar -zxvf backup.tar.gz
重新啓動一個新的容器並將數據卷指向需要還原的數據卷目錄
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql