Всем привет! Недавно я столкнулся с проблемой нехватки памяти на основном диске под крупный проект, который разворачивается в Docker. Вопрос переноса ресурсов Docker на HDD в 1ТБ стоят принципиально, так как не было других вариантов развернуть проект. И вот, что из этого вышло...
Для начала скажу, что у меня стоит SSD WD Green 120G, где стоит Windows и некоторый важный софт, а на HDD 1ТБ стоят другие программы, проекты и "личная жизнь".
Прислали инструкцию по разворачиванию проекта, где был довольно большой дамп MySql размером более 50Гб и множество контейнеров. Как-то не обращал внимания на этот вопрос, но в процессе оооооочень долгой установки Docker схлопнулся и сказал:
Работать я не буду, я вообще выключаюсь, мне душно и не хватает места на диске, чтобы я тут тебе твои проекты поднимал.
Я устал, я ухожу!
Новость не из приятных была. Крутил этот Docker и так и сяк по всем инструкциям в инете и офф документации, но именно под Windows ничего не выходило. И да, если вы в daemon.json поменяете data-root, то он попросту не будет работать... Здорово, правда?!
Спустя много времени тестов и перенастроек я смог найти решение! Возможно, вы уже знаете о нем, так что не судите строго. Я лишь пытаюсь помочь "путникам в мире Windows с кастрированными жесткими дисками".
И так, хватит болтать и приступим. Делайте все в точности по инструкции и будет вам счастье. Сразу скажу, что у меня Windows с Docker лежит на диске C, а хочу я перенести его на диск D, где есть папка Programs.
# выключаем wsl
wsl --shutdown
# экспортируем данные docker-desktop
wsl --export docker-desktop D:\docker-desktop.tar
# убираем регистрацию данных docker-desktop
wsl --unregister docker-desktop
# импортируем данные docker-desktop в новую директорию
wsl --import docker-desktop D:\wslStore\ D:\docker-desktop.tar --version 2
# удалите D:\docker-desktop.tar
После этих манипуляций, все ваши истории с DockerDesktop будут располагаться в D:\wslStore\. Но, это не означает, что данные (контейнеры, снимки и прочие) будут тоже находиться там. Для переноса именно данных Docker нужна дополнительная связка команд:
# выключаем wsl
wsl --shutdown
# экспортируем данные docker-desktop-data
wsl --export docker-desktop-data D:\docker-desktop-data.tar
# убираем регистрацию данных docker-desktop-data
wsl --unregister docker-desktop-data
# импортируем данные docker-desktop-data в новую директорию
wsl --import docker-desktop-data D:\Programs\Docker\ D:\docker-desktop-data.tar --version 2
# удалите D:\docker-desktop-data.tar
И вот только теперь именно под Windows ваш Docker будет храниться все свое барахло именно по пути D:\Programs\Docker\
Аналогично можно перенести и Ubuntu, и другие истории с wsl/Docker куда вам надо:
wsl --export Ubuntu ubuntu.tar
wsl --unregister Ubuntu
wsl --import Ubuntu D:\wslStore\Ubuntu\ ubuntu.tar --version 2
На эти решения я потратил целый день: то одно пробовал, то другое - и вот нашел рабую схему изменения директории хранения данных Docker под Windows.
Надеюсь, что эта информация была полезна. Ну, а если нет, то сильно не бейте :)
Комментарии (18)
aik
10.10.2023 12:44+1Я надеюсь, у вас NTFS файловая система, а не FAT32?
Тогда достаточно перенести папку докера на другой диск да сделать ссылку на неё на старом месте.mepihin Автор
10.10.2023 12:44Про ссылку писал. Покажите как, добавлю в статью
aik
10.10.2023 12:44https://learn.microsoft.com/ru-ru/windows-server/administration/windows-commands/mklink
Обычно mklink /d
Изредка бывают капризные программы, тогда junction (/j) приходится использовать. Но это очень изредка.mepihin Автор
10.10.2023 12:44-1Надо попробовать, но, что-то у меня есть ощущение, что wsl начнет ругаться.
aik
10.10.2023 12:44Я не вижу особых проблем. Там же вроде всё внутри vdx-файла находится? Единственное — наверное, надо будет тормознуть службу wsl, перенести файл образа куда надо, сделать оттуда линк и потом уже снова запустить wsl.
mepihin Автор
10.10.2023 12:44Да, ext4.vhdx файл
aik
10.10.2023 12:44+1Тогда вопросов не должно быть.
Ну или даже не файл переносить, а всю структуру каталогов, где оно валяется и делать ссылку на неё.
wsl — это же виртуальная машина и линукс напрямую с файловой системой хоста не работает, за это отвечает сама винда.А вот если попытаться работать с локальными дисками оттуда (которые в /mnt монтируются), то вопросы с правами доступа возникают иногда, chmod не проходит. У меня mc жаловался, к примеру.
alexxisr
Сложно то как в этих виндах всё. Я просто перетащил папку с докером на новый диск и создал симлинк на старом месте.
mepihin Автор
Да, согласен. На Windows все остальное проще, но не разработка ????
saboteur_kiev
Кто мешает сделать тоже самое на винде?
Там тоже есть симлинки, автор статьи просто решил пойти сложным путем.
mepihin Автор
Если подскажите как, то смогу в будущем протестировать это решение и обновить статью на еще +1 метод.
crawlingroof
mklink
mepihin Автор
Понял, но есть ощущение, что это не сработает с wsl
saboteur_kiev
почему?
NTFS поддерживает junction points? hard links, symbolic link (file/directory), просто в проводнике это наверное сложно сделать.
Но их можно создать в консоли или файловом менеджере (FAR, например)
и WSL, которая умеет в ntfs, базовые фичи ntfs тоже должно работать