Всем привет! Недавно я столкнулся с проблемой нехватки памяти на основном диске под крупный проект, который разворачивается в 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)


  1. alexxisr
    10.10.2023 12:44

    Сложно то как в этих виндах всё. Я просто перетащил папку с докером на новый диск и создал симлинк на старом месте.


    1. mepihin Автор
      10.10.2023 12:44

      Да, согласен. На Windows все остальное проще, но не разработка ????


    1. saboteur_kiev
      10.10.2023 12:44

      Кто мешает сделать тоже самое на винде?
      Там тоже есть симлинки, автор статьи просто решил пойти сложным путем.


      1. mepihin Автор
        10.10.2023 12:44

        Если подскажите как, то смогу в будущем протестировать это решение и обновить статью на еще +1 метод.


        1. crawlingroof
          10.10.2023 12:44

          mklink


          1. mepihin Автор
            10.10.2023 12:44

            Понял, но есть ощущение, что это не сработает с wsl


            1. saboteur_kiev
              10.10.2023 12:44

              почему?

              NTFS поддерживает junction points? hard links, symbolic link (file/directory), просто в проводнике это наверное сложно сделать.
              Но их можно создать в консоли или файловом менеджере (FAR, например)

              и WSL, которая умеет в ntfs, базовые фичи ntfs тоже должно работать


  1. GoooodBoy
    10.10.2023 12:44

    Тоже сталкивался с такой задачей. Оно гуглится в пару секунд, к чему целую статью для этого писать?


    1. mepihin Автор
      10.10.2023 12:44

      Да, но мне выдавало в Яндекс решения, которые не работали. Из-за долгого поиска решил написать статью


      1. slonopotamus
        10.10.2023 12:44

        Попробуйте нормальный другой поисковик.


  1. aik
    10.10.2023 12:44
    +1

    Я надеюсь, у вас NTFS файловая система, а не FAT32?
    Тогда достаточно перенести папку докера на другой диск да сделать ссылку на неё на старом месте.


    1. mepihin Автор
      10.10.2023 12:44

      Про ссылку писал. Покажите как, добавлю в статью


      1. aik
        10.10.2023 12:44

        https://learn.microsoft.com/ru-ru/windows-server/administration/windows-commands/mklink


        Обычно mklink /d
        Изредка бывают капризные программы, тогда junction (/j) приходится использовать. Но это очень изредка.


        1. mepihin Автор
          10.10.2023 12:44
          -1

          Надо попробовать, но, что-то у меня есть ощущение, что wsl начнет ругаться.


          1. aik
            10.10.2023 12:44

            Я не вижу особых проблем. Там же вроде всё внутри vdx-файла находится? Единственное — наверное, надо будет тормознуть службу wsl, перенести файл образа куда надо, сделать оттуда линк и потом уже снова запустить wsl.


            1. mepihin Автор
              10.10.2023 12:44

              Да, ext4.vhdx файл


              1. aik
                10.10.2023 12:44
                +1

                Тогда вопросов не должно быть.
                Ну или даже не файл переносить, а всю структуру каталогов, где оно валяется и делать ссылку на неё.
                wsl — это же виртуальная машина и линукс напрямую с файловой системой хоста не работает, за это отвечает сама винда.


                А вот если попытаться работать с локальными дисками оттуда (которые в /mnt монтируются), то вопросы с правами доступа возникают иногда, chmod не проходит. У меня mc жаловался, к примеру.


  1. aik
    10.10.2023 12:44

    .