如何恢復docker容器數據

項目測試環境數據庫數據丟失,特此記錄一下。當時是用 docker 安裝的,以為臨時使用一段時間,也沒有持久化。突然前天 docker 日志滿瞭,同事想著去清理日志,使用瞭如下命令:

docker system prune

結果當時 MySQL 容器當時正常處於停止狀態,結果容器一下子就被幹掉瞭,我們備份的數據還是三月份的,這下糟糕瞭。然後各種研究開始恢復。

然後我就去官方文檔去研究這個命令是幹什麼的,上面用到的 docker system prune 意思是:

Remove all unused containers, networks, images (both dangling and unreferenced), and optionally, volumes.

刪除所有未使用的容器、網絡、圖像(懸空和未引用的圖像)以及卷(可選)。

By default, volumes are not removed to prevent important data from being deleted if there is currently no container using the volume. Use the --volumes flag when running the command to prune volumes as well:

默認情況下,如果當前沒有使用卷的容器,則不會刪除卷以防止刪除重要數據。運行命令時也可以使用 --volumes 標志來修剪卷:

這下心放下瞭一半,還好數據卷沒有被刪除,我們可以利用數據卷可以進行恢復數據。接下來記錄下我的恢復方案吧。

1.查找數據卷位置

數據卷目錄在 /var/lib/docker/volumes 下,每個容器都會在該目錄下有一個文件夾,如果容器還存在的話,我們可以使用 docker inspect 容器ID 去查看 數據卷位置,這下容器被刪除瞭,可怎麼辦,隻能挨個去找瞭,一般 MySQL 容器數據卷目錄下會有一個 _data 目錄,該目錄下會顯示你每個數據庫的文件夾,最終找到瞭。

image-20210510113543085

image-20210510114631505

這個 cxhello 就是我們的測試庫,現在我們就可以恢復數據瞭。

2.恢復

使用 docker volume create 數據卷名字 命令新建一個數據卷,docker volume ls 查看數據卷列表

image-20210510114945865

註意:使用數據卷進行掛載的時候,數據卷必須是一個空的目錄,也就是說不能有任何數據。

然後創建容器

docker run -d -p 3309:3306 -v mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name huifu mysql:5.7

image-20210510115714866

在恢復數據之前需要把剛剛建立的數據卷裡面關聯的內容刪除掉,然後把之前的數據卷內容復制到現在的數據卷進行數據恢復。

cd /var/lib/docker/volumes/mysqldata/_data/
rm -f *
rm -f -R *

image-20210510130608341

復制內容到數據卷

cd /var/lib/docker/volumes/1db16a9dfdf3442b117ebc2ec11df5df4db717cfd567c77fa0a49905a9652fa0/_data/
cp -R * /var/lib/docker/volumes/mysqldata/_data/

image-20210510131213523

至此數據庫數據恢復完成,進入恢復的容器查看

image-20210510131728135

參考文章

https://docs.docker.com/engine/reference/commandline/system_prune/

https://www.cnblogs.com/cheyunhua/p/13433400.html

到此這篇關於如何恢復docker容器數據 的文章就介紹到這瞭,更多相關docker容器數據恢復內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: