Я удалил docker с помощью sudo snap remove docker
. На самом деле я не хотел его удалять, просто проверял, установил ли я его с помощью snap
(надо было использовать snap list
задним числом), надеясь, что он предложит мне что [Y/n]
-то вроде apt
этого. Но он просто удалил docker. Отлично. Его можно было быстро переустановить снова.
Но где мои контейнеры?! Все образы и контейнеры (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
!
Восстановление оригинальных контейнеров
Позвольте мне подвести итог тому, как я дошел до этого состояния:
- побежал
sudo snap remove docker
, который уничтожил важные контейнеры - побежал
sudo snap install docker
устанавливать докер снова - запустил
docker-compose up
, что вывело два новых контейнера - побежал
snap restore 1
восстанавливать автоматический снимок
На этом этапе я смог найти восстановленные файлы контейнеров, но docker ps -a
все еще не показывал сами контейнеры. Вкратце, вот что я сделал, чтобы вернуть полные контейнеры:
- удалил все видимые контейнеры и изображения после второй установки, так как они мне не нужны
- снова удалил докер
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>
использовать полученное изображение для запуска его как нового контейнера. После того, как я увидел, что с ним все в порядке, я избавился от сломанного. Все вернулось к норме!
Кстати, считается хорошей практикой использовать тома для сохранения данных в контейнерах. Изображения также могут бытьсохраненов архив.