1. 程式人生 > >Docker資料卷

Docker資料卷

資料卷簡介

轉載連結

資料卷是一個可以供一個或多個容器使用的特殊目錄。

可以達到以下目的:

  1. 繞過“拷貝寫”系統,以達到本地磁碟 IO 的效能,(比如執行一個容器,在容器中對資料卷修改內容,會直接改變宿主機上的資料卷中的內容,所以是本地磁碟IO的效能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。)

  2. 繞過“拷貝寫”系統,有些檔案不需要在 docker commit 打包進映象檔案。

  3. 在多個容器間共享目錄。

  4. 在宿主和容器間共享目錄。

  5. 在宿主和容器間共享一個檔案

建立資料卷

方法一: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