Docker資料卷
阿新 • • 發佈:2019-01-28
資料卷簡介
轉載連結資料卷是一個可以供一個或多個容器使用的特殊目錄。
可以達到以下目的:
繞過“拷貝寫”系統,以達到本地磁碟 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