Как скопировать/переместить контейнер Docker на другой хост

Фотография человека, работающего за компьютером.

Поскольку контейнеры Docker представляют собой небольшие коробки программного обеспечения, вы можете легко копировать и перемещать их с компьютера на компьютер. Может быть, вы работали с экземпляром Docker на своем локальном компьютере и решили переместить его на более мощный сервер. Или, возможно, вы просто хотите развернуть свой пользовательский контейнер на нескольких компьютерах, «скопировав и вставив» его. В других случаях вы можете быть недовольны поставщиком облачных вычислений и захотеть перейти к другому. Здесь мы покажем вам, как переместить существующий образ контейнера Docker и объемы данных с одного хоста Linux на другой.

Содержание

  • Сохранить образ контейнера с исходного хоста
  • Экспорт объема Docker из вашего контейнера
  • Загрузить образ контейнера на хост назначение
  • Импорт объема Docker в ваш контейнер
  • Передача образа без создания файла
  • Использование Docker Compose для перемещения всего развертывания Docker

Полезно знать: начните работать с контейнерами, установив Docker на свою дистрибуцию Linux.

Сохранить образ контейнера с исходного хоста

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

docker ps

Терминал, подчеркивающий доступные контейнеры Docker для системы.

Насчитайте контейнер, который вы хотите скопировать, затем остановите экземпляр:

docker stop NAME_OF_INSTANCE

Терминал, показывающий вывод команды docker stop.

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

docker commit NAME_OF_INSTANCE mycontainerimage

Терминал, показывающий вывод команды docker commit, создающего новое изображение из текущего.

Обратите внимание, что если экземпляр в настоящий момент работает, это действие приостановит его, пока его содержимое сохраняется. Если это проблема, вы можете избежать этой паузы, введя docker commit -p=false NAME_OF_INSTANCE mycontainerimage. Однако делать это не рекомендуется без крайней необходимости. Вероятность создания образа с неполными/несогласованными данными в этом случае увеличивается.

Теперь сохраните только что зафиксированный образ контейнера Docker в архивный файл:

docker save -o mycontainerimage.tar mycontainerimage

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

scp ./mycontainerimage.tar [email protected]:/home/ramces/

Экспорт объема Docker из вашего контейнера

Одним из недостатков сохранения образа Docker является то, что он не включает сопутствующие аксессуары Docker, которые вы настроили вместе с вашим контейнером. Это включает в себя любые сетевые привязки и объемы, которые вы создали для хранения ваших постоянных данных.

Чтобы правильно экспортировать ваш объем данных, сначала установите Git на вашем локальном компьютере:

sudo apt install git

Выполните следующую команду, чтобы скачать скрипт экспорта объема для Docker:

git clone https://github.com/ricardobranco777/docker-volumes.sh.git

Убедитесь, что у экспортного скрипта правильные разрешения, затем скопируйте его в «/usr/local/bin»:

sudo chmod +x ./docker-volumes.sh/docker-volumes.sh  
sudo cp ./docker-volumes.sh/docker-volumes.sh /usr/local/bin/

Проверьте, работает ли ваш скрипт правильно, а затем извлеките все связанные объемы для вашего контейнера:

docker-volumes.sh -h  
docker-volumes.sh NAME_OF_INSTANCE save mycontainerimage-volume.tar

Терминал, показывающий процесс резервного копирования любых связанных объемов данных для контейнера Docker.

Отправьте ваши только что архивированные файлы объема Docker на ваш удаленный компьютер:

scp ./mycontainerimage-volume.tar [email protected]:/home/ramces/

Загрузить образ контейнера на хост назначения

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

docker load -i ./mycontainerimage.tar

Используйте docker create, чтобы повторно инициализировать ваш образ контейнера Docker с его исходными флагами запуска с вашего исходного компьютера. Например, мой контейнер Docker Nginx изначально имел сопоставленный порт 80 на порт 8080 моего компьютера:

docker create --name my-nginx-container -p 8080:80 mycontainerimage

Запустите свой новый импортированный контейнер Docker:

docker start my-nginx-container

Подтвердите, что ваш импортированный образ работает должным образом, перечислив все активные контейнеры в системе:

docker ps

Терминал, показывающий тот же образ контейнера Docker, работающий на другой системе.

К вашему сведению: превратите свой Raspberry Pi в способную портативную фотогалерею, установив Photoprism с помощью Docker.

Импорт объема Docker в ваш контейнер

Чтобы импортировать файл объема Docker .tar, сначала установите Git на вашем новом хосте:

sudo apt install git

Точно так же, как и в вашей исходной системе, скачайте вспомогательный скрипт docker-volume.sh, установите его разрешения на «выполнение», а затем скопируйте его в каталог «/usr/local/bin» вашего нового компьютера.

Терминал, показывающий процесс получения и установки скрипта Docker Volume для резервного копирования данных, связанных с контейнерами.

Создайте новый контейнер Docker, используя ваш экспортированный файл изображения:

docker create --name my-nginx-container -v myvol:/usr/share/nginx/html -p 8080:80 mycontainerimage

Запустите скрипт docker-volume.sh с вашим исходным .tar файлом для загрузки его на демон Docker вашей новой системы:

docker-volumes.sh my-nginx-container load mycontainerimage-volume.tar

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

docker start my-nginx-container

Проверьте, загружает ли ваш контейнер правильно ваш объем, взглянув на его внутренние данные конфигурации:

docker inspect -f '{{ .Mounts }}' my-nginx-container

Терминал, подчеркивающий импортированные объемные данные на новую машину.

Передача образа без создания файла

Иногда вам может не понадобиться создавать файл mycontainerimage.tar.gz. Возможно, у вас недостаточно места на диске, так как контейнер содержит много данных. Вы можете сохранить, передать и загрузить образ на хост назначения за одну команду. После выполнения команды docker commit, о которой говорилось выше, вы можете использовать:

docker save mycontainerimage | ssh [email protected] docker load

Это должно работать и с Windows, так как теперь у него есть встроенный SSH-клиент (PuTTY больше не нужен).

Продолжите с командой docker create, которая соответствует вашей ситуации.

Примечание: Убедитесь, что вы правильно смонтировали любой объем Docker, который ранее был подключен к вашему контейнеру, перед тем как запускать импортированный образ.

Наконец, запустите ваш новый импортированный контейнер Docker, выполнив команду docker start, за которой следует имя вашего контейнера.

Терминал, показывающий процесс запуска нового контейнера и подтверждающий, что он работает правильно.

Использование Docker Compose для перемещения всего развертывания Docker

С помощью плагина Compose Docker позволяет создавать, настраивать и запускать сложные программы, не беспокоясь об основной программной оболочке сервера. Это, в свою очередь, позволяет вам создавать воспроизводимые развертывания приложений на различных системах Linux.

Чтобы начать миграцию вашей существующей настройки Docker к Docker Compose, сначала убедитесь, что плагин в вашем системе:

sudo apt install docker-compose-plugin docker-buildx-plugin

Создайте новую папку в вашей домашней директории для вашего развертывания Docker Compose:

mkdir ~/my-docker-compose && cd ~/my-docker-compose

Используйте ваш любимый текстовый редактор, чтобы создать файл «docker-compose.yml» для вашего приложения:

nano ./docker-compose.yml

Вставьте следующий блок кода в ваш файл Compose, а затем адаптируйте его под свои конкретные нужды:

version: '3'  
  
volumes:  
  myvol: # Замените на имя вашего импортированного объема.  
  
services:  
  nginx:  
    image: mycontainerimage # Замените на имя вашего импортированного образа Docker.  
    ports:  
      - "8080:80"  
    volumes:  
      - myvol:/usr/share/nginx/html # Замените "myvol" на имя вашего смонтированного образа.

Сохраните ваш новый файл Compose, затем выполните следующую команду, чтобы запустить его:

docker compose up -d

Наконец, проверьте, работает ли ваше развертывание Compose правильно. В моем случае я тестирую свой контейнер Docker Nginx, открывая веб-браузер и переходя по адресу «localhost:8080».

Скриншот, показывающий, что импортированный контейнер Nginx Docker работает правильно на новом компьютерном хосте.

Изучение того, как копировать и перемещать ваш контейнер Docker на другие хосты Linux, — это всего лишь одна из немногих задач, которые вы можете выполнить с помощью вашей машины. Изучите этот замечательный мир само-хостинга, установив сервер Minecraft на Linux с помощью Docker.

Автор изображения: Max Duzij через Unsplash. Все изменения и скриншоты исполнены Рамсесом Редом.