我用 刪除了 docker sudo snap remove docker
。我實際上並不想刪除它,只是檢查我是否安裝了它(事後snap
應該使用),相信它會提示我類似的操作。但它只是繼續刪除了 docker。美好的。很快又重新安裝了一次。snap list
[Y/n]
apt
但是,我的容器在哪裡?所有影像和容器(docker ps -a)
都消失了!卸載花了很長時間,所以我想知道是否有一些備份或文件仍然保留並且容器可以恢復?不關心圖像,只關心容器。謝謝。
檢查過/var/snap/docker/common/var-lib-docker/containers
,但原來的容器不在那裡。
答案1
事實證明,花費很長時間的操作確實是備份,或者用他們的術語來說,是快照。來自文件:
快照是使用 snap save 命令手動生成的,並在刪除快照時自動生成(需要 snapd 2.39+)。快照可用於備份快照的狀態、將快照還原到先前的狀態以及將全新的 snapd 安裝還原到先前儲存的狀態。
我檢查了我的snapd
版本:
# snap --version
snap 2.52.1
snapd 2.52.1
series 16
ubuntu 21.04
kernel 5.11.0-40-generic
然後查看可用的快照:
# snap saved
Set Snap Age Version Rev Size Notes
1 docker 2h58m 20.10.8 1125 1.39GB auto
檢查快照是否正常:
# snap check-snapshot 1
Snapshot #1 verified successfully.
最後恢復自動快照:
# snap restore 1
Restored snapshot #1.
此時docker ps -a
仍然向我顯示了我在最新安裝後創建的容器,而不是我想要恢復的容器。也許如果我沒有創建新的容器,它就會起作用。但我知道至少容器文件已經恢復,因為我可以在/var/snap/docker/common/var-lib-docker/overlay2/
.這總比沒有好。小心snap remove
!
恢復原始容器
讓我回顧一下我是如何進入這種狀態的:
- ran
sudo snap remove docker
消滅了重要的容器 - 再次跑去
sudo snap install docker
安裝docker - run
docker-compose up
帶來了兩個新容器 - 運行
snap restore 1
恢復自動快照
此時我能夠找到恢復的容器文件,但docker ps -a
仍然沒有顯示實際的容器。總之,這就是我為取回完整容器所做的事情:
- 第二次安裝後刪除了所有可見的容器和映像,因為我不需要它們
- 再次刪除 docker
sudo snap remove docker
並注意到自動快照再次發生:“將快照“docker”的資料保存在自動快照集#2中”。 - 再次恢復第一個快照:
snap restore 1
現在,如果我這樣做,docker ps -a
我可以再次看到所有容器處於停止狀態!但有一個問題,其中一個無法啟動,並顯示以下訊息:Error: response from daemon: OCI runtime create failed: container with id exists:...
。
為了解決這個問題,我發現的最簡單的方法是docker commit <container-id>
使用生成的映像將其作為新容器啟動。我一看沒問題,就把壞掉的丟掉了。一切恢復正常!
順便說一句,使用卷將資料保存在容器中被認為是很好的做法。圖片也可以已儲存到存檔。