Как я перенес свой Docker-сервер на новую систему

Как я перенес свой Docker-сервер на новую систему


Вы когда-нибудь задумывались о переносе своих контейнеров Docker с одного сервера на другой? Недавно у меня возникло желание обновить свою домашнюю лабораторию, заменив старый сервер с креплением в стойку на более новый и мощный систему, но перенос моих контейнеров Docker оказался задачей, с которой я не знал, как справиться.

На самом деле это было не так сложно сделать, и заняло больше времени, чем было страшно или раздражающе. Перенос требует всего лишь несколько команд и много терпения (в зависимости от количества контейнеров Docker, которые вы запускаете). Итак, вот как я перенес свой сервер Docker на совершенно новую систему (без перемещения самой виртуальной машины).

Перемещение хостов Docker не должно быть подавляющим

В этом январе я впервые перенес контейнеры Docker. Я перешел с Unraid на полноценную установку Docker в виртуальной машине с Ubuntu. Честно говоря, это был довольно простой переход, и я использовал встроенные методы резервного копирования для некоторых приложений, а другие начал с нуля.

Тем не менее, я недавно решил переместить свой виртуальный хост Docker с одного сервера на другой. Хотя я думал о перемещении самой виртуальной машины, я решил пойти другим путём и перенести установку Docker на совершенно новую виртуальную машину.

Это было довольно тревожно, чтобы об этом думать. Мне придется отключить свои контейнеры Docker на некоторое время, чтобы выполнить миграцию, и есть много того, что может пойти не так во время передачи.

Однако, когда я углубился в процесс, он на самом деле оказался не таким ужасным, как я думал. Конечно, это заняло несколько часов (и, безусловно, я столкнулся с несколькими трудностями), но в целом это было довольно безболезненно и не так уж подавляюще.

Убедитесь, что новая система правильно подготовлена.

Я начал с того, что убедился, что моя новая виртуальная машина готова к работе. Сначала я убедился, что использую ту же версию Ubuntu: Server 24.04 LTS. Ubuntu Server уже более десяти лет является моим основным выбором, когда мне нужен сервер на Linux. Мне просто комфортно в нем.

После установки Ubuntu Server 24.04 на новый виртуальный хост, я удостоверился, что настроил Docker и все другие зависимости, которые мне понадобятся. Это включает в себя дополнительные драйверы для NVIDIA или Intel и удостоверение, что все папки были настроены так, как мне нужно для работы с Docker.

После того как я всё это настроил, я остановил как сервис Docker, так и сокет с помощью следующих команд:

systemctl stop docker.socket systemctl stop docker      

Вам, возможно, не нужно будет выполнять обе команды, но я это сделал. Это по сути отключило Docker, чтобы я мог вносить изменения в основную файловую систему Docker и не нарушить ничего.

Как только это было сделано, я запустил те же команды на старой системе. Мне нужно было убедиться, что Docker был отключен на старой системе перед сбором файлов, потому что это гарантировало, что ничего не изменится с момента, когда я начал миграцию, до момента, когда я закончил ее.

Это также означало, что все мои контейнеры Docker будут отключены. Честно говоря, это была самая неприятная часть для меня. Мой домашний лабораторный сервер управляет всем домом с помощью Docker, от Home Assistant до Audiobookshelf, Plex и многих других услуг. Отключение Docker означало отключение этих систем, поэтому мне нужно было дождаться подходящего момента для этого.

В конце концов, я нашел время, когда сервер был неактивен, и смог перейти к следующему шагу, отключив Docker и подготовив все файлы к transfer.

Собрать все файлы Docker

Это была самая длинная часть процесса для меня. В итоге я удалил довольно много файлов и папок из папки, в которую я монтирую свои Docker-куки, чтобы сделать этот процесс как можно быстрее, но это все равно заняло несколько часов.

В основном, вам нужно заархивировать вашу папку Docker, а затем, если вы используете другую область для монтирования томов, то и эту папку. Если вы просто используете тома Docker, то они будут захвачены первой командой.

Для начала я выполнил следующую команду на своем старом сервере:

sudo tar -czvf docker-backup.tar.gz /var/lib/docker      

Что это делает, так это создает резервную копию папки /var/lib/docker в файл tar.gz. В зависимости от того, сколько контейнеров вы запускаете, и используете ли вы Docker Volumes или нет, это может занять некоторое время. Для меня это заняло около 30-45 минут.

Затем я выполнил следующую команду на своем старом сервере:

sudo tar -cvzf docker-files.tar.gz /portainer      

Поскольку я использую Portainer в качестве менеджера Docker, я просто размещаю все свои Docker-файлы в папке /portainer на сервере. У меня есть /portainer/audiobookshelf, /portainer/plex и т. д. Вышеуказанная команда берет папку /portainer и упаковывает ее в небольшой архив, что упрощает перемещение. На резервное копирование ушло около часа из-за того, сколько данных у меня в папках Docker Volume.

Как только обе папки завершили архивирование, я был готов перейти к следующему этапу: перенести сжатые архивы на новый сервер.

Перемещение всего в новую систему — это просто.

У меня дома сеть со скоростью 2,5 Гбит/c, и я стараюсь полностью использовать её возможности, когда могу. Поэтому я нашёл команду, чтобы переместить файл с одного сервера на другой, одновременно показывая скорость передачи в терминале:

rsync -ah --info=progress2 docker-backup.tar.gz user@remote-host:/destination/path/      

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

Конечно, если вы предпочтете, вы можете использовать USB для передачи файлов с одного сервера на другой. Мой старый сервер (система Dell R720 для установки в стойку) имеет только USB 2.0, поэтому для меня было гораздо быстрее передать файлы по сети.

Как только файлы будут на новом сервере, просто распакуйте их на место. Я начал с папки Docker:

sudo tar -xpf docker-backup.tar.gz -C /      

Когда это закончилось, я побежал:

sudo tar -xpf docker-files.tar.gz -C /      

Это вернуло все мои старые файлы Docker и монтирования томов на свои места и сохранило правильные разрешения, что и составляет основную часть переноса.

На самом деле, создание tar-файлов Docker, перемещение их и затем распаковка заняли большую часть времени для переноса. В целом, эти три действия заняли около трех-четырех часов на моем сервере.

Однако, как только я это сделал, я был на шаг ближе к завершению перемещения. Теперь пришло время наконец запустить Docker на новом сервере.

Запустите Docker на новой системе, и ваши контейнеры должны запуститься.

С всеми файлами на месте я первый раз включил Docker со всеми контейнерами. Это было просто и потребовало всего две команды:

systemctl start docker systemctl start docker.socket      

Я ожидал, что после переезда много вещей сломается, когда я включу Docker. Вместо этого большинство вещей просто запустились и были готовы к работе. На самом деле, вот и всё, что нужно для запуска Docker на вашем новом компьютере.

Если конфигурация не сильно отличается между вашей старой и новой системой, тогда все должно сработать. Однако, если вы похожи на меня и изменили много между двумя системами, то следует обратить внимание на несколько вещей.

Вещи, на которые стоит обратить внимание при переезде

Одной из первых вещей, которые мне нужно было исправить, было изменение нескольких контейнеров, использующих NVIDIA runtime, на использование Intel runtime. На моем старом сервере у меня была видеокарта GTX 1650 для помощи в обработке ИИ и транскодировании. На новом сервере стоял i9-13900K с интегрированной графикой Intel, способной справляться с теми же рабочими нагрузками.

Это потребовало некоторой манипуляции, и я все еще не полностью переключился (я отказался от Scrypted и позволяю ему просто работать на процессоре вместо iGPU), но в целом это было довольно простое переключение.

Я также столкнулся с довольно большой проблемой с Home Assistant. Контейнер Docker Home Assistant, по какой-то причине, не перенёс ни одни из своих настроек. У меня есть некоторая конфигурационная информация, которую я сохраняю в /portainer/homeassistant, но он запустился так, как будто я никогда раньше не запускал Home Assistant.

Это было простое решение. Я просто включил старую виртуальную машину, вошел в Home Assistant, скачал файл резервной копии и восстановил его на новой виртуальной машине. Это сразу же запустило меня в работу.

Некоторые аспекты сетевого взаимодействия Docker также могут нуждаться в пересмотре. Например, для Scrypted мне пришлось изменить настройки на хостовую сеть, а не на новую сеть scrypted-default, которая была создана по какой-то причине.

Я также должен был установить статический IP на новой виртуальной машине. Затем мне нужно было обновить несколько других мелочей на сервере, чтобы все работало плавно с интегрированной графикой, которую я передавал.

В целом, это был довольно гладкий переезд, и я очень доволен новым сервером. Он быстрее, более отзывчивый и намного более мощный, чем старый сервер, при этом потребляет меньше электроэнергии.

Перемещение было относительно простым, и я рад, что научился переносить контейнеры Docker с одной системы на другую. Уверен, это пригодится мне в будущем!


Если вы никогда раньше не запускали контейнеры Docker или только начинаете, Docker — это замечательный инструмент. Он самостоятельно управляет почти всей моей домашней лабораторией.

Вот несколько моих любимых контейнеров Docker, которые, я считаю, должен запустить каждый любитель домашней лаборатории. Большинство из них легко настроить и они могут добавить много полезного в вашу конфигурацию. На самом деле, моя домашняя лаборатория стала одной из самых полезных вещей в моем доме.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *