Как сохранить образ контейнера в файл
Перейти к содержимому

Как сохранить образ контейнера в файл

  • автор:

Как сохранить образ docker

С помощью команды docker save «image» > «path».tar образ сохраняется, но весит очень много, около 2Гб, а также не открывается с ошибкой «Файл имеет неверный формат или поврежден» Мой Dockerfile:

FROM node:18-alpine WORKDIR /usr/src/app EXPOSE 3000 COPY package.json ./ RUN npm install COPY . . CMD ["npm", "run", "start"] 

docker-compose.yml:

version: '3.8' services: app: build: context: ./APP container_name: front ports: - '3000:3000' volumes: - .:/APP 

Возможно ли, что образ выгружается вместе со всеми зависимостями в виде ОС и тд, если да, то как выгрузить образ без этих зависимостей?

Отслеживать
задан 12 апр в 16:08
43 7 7 бронзовых знаков

а зачем? и как вы пытаетесь его открыть, что получаете ошибку «Файл имеет неверный формат или поврежден»?

12 апр в 18:06
Образ нужно развернуть на другой системе, а открыть я его пытался винраром и 7zip
12 апр в 21:49

для этих целей обычно используют docker registry, например docker hub или любой другой, но даже если вы хотите использовать docker save, то на другой машине нужно просто использовать docker load и все, а уменьшить образ можно с помощью multistage build

12 апр в 21:51

2 gb — это как-то очень много. Я собрал небольшое приложение в докере на образе node:18-alpine , и получил всего 172 мб, а после сжатия gzip и вовсе 50 мб. Вы уверены, что ничего лишнего не тащите в образ инструкцией COPY . . ?

13 апр в 2:49

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Да, image save выгружает образ целиком, включая базовый образ. Восстановить образ из архива командой image load

У вас получается архив размером 2 Гб? Это очень странно. Базовый образ всего 174 мб, сжатием gzip получается 50 мб.

Я сделал маленький образ

FROM node:18-alpine WORKDIR /usr/src/app EXPOSE 8081 COPY ./src . CMD ["node", "hello.js"] 

В ./src лежит единственный файл hello.js

var http = require("http"); http.createServer(function (request, response) < response.writeHead(200, < 'Content-Type': 'text/plain' >); response.end('Hello World\n'); >).listen(8081); console.log('Server started at http://localhost:8081/'); 
docker build . -t try-node 
docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE try-node latest 4445087d824e 13 minutes ago 175MB 
docker image save try-node | gzip > image.tar.gz du -sm image.tar.gz 
50 image.tar.gz 

Итого — выгруженный сжатый образ размером 50 мегабайт.

$ docker image rm try-node $ cat image.tar.gz | gzip -d | docker image load f1417ff83b31: Loading layer [==================================================>] 7.338MB/7.338MB 8f90faa0eb99: Loading layer [==================================================>] 164.2MB/164.2MB e2ed77d8fead: Loading layer [==================================================>] 7.819MB/7.819MB 1e9663a5b8eb: Loading layer [==================================================>] 3.584kB/3.584kB 03429486714c: Loading layer [==================================================>] 3.072kB/3.072kB 242deab87f84: Loading layer [==================================================>] 3.584kB/3.584kB Loaded image: try-node:latest 

Образ загружен и добавлен в список образов:

docker image ls try-node REPOSITORY TAG IMAGE ID CREATED SIZE try-node latest 4445087d824e 25 minutes ago 175MB 

Сохранить изменения в docker

Запустил docker с образом ubuntu. Обновил, поменял конфиги, вышел, зашел и ничего не сохранилось. Как правильно сохранять изменения в docker? Гугл предлагает сохранение образа, а мне надо сохранять изменения внутри контейнера.

NoobeR ★★★★
30.05.16 18:00:16 MSK

Use volumes, Luke!

theNamelessOne ★★★★★
( 30.05.16 18:02:09 MSK )

монтируй вольюм и пиши в него

leave ★★★★★
( 30.05.16 18:02:43 MSK )

Но скорее всего ты хочешь странного от докера.

staseg ★★★★★
( 30.05.16 18:03:06 MSK )
Последнее исправление: staseg 30.05.16 18:03:33 MSK (всего исправлений: 1)

Ответ на: комментарий от staseg 30.05.16 18:03:06 MSK

я хочу обновить ПО, подредачить конфиги и потом запускать с этими изменениями, а не делать всё с нуля

NoobeR ★★★★
( 30.05.16 18:04:44 MSK ) автор топика
Ответ на: комментарий от NoobeR 30.05.16 18:04:44 MSK

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

theNamelessOne ★★★★★
( 30.05.16 18:06:22 MSK )
Ответ на: комментарий от NoobeR 30.05.16 18:04:44 MSK

Смотри эту ссылку, обращай внимания на картинки и описания к ним.

theNamelessOne ★★★★★
( 30.05.16 18:07:40 MSK )
Ответ на: комментарий от NoobeR 30.05.16 18:04:44 MSK

Обновлять ПО вручную 99% не надо, просто используй свежий образ. Или создай его сам с помощью docker commit или Dockerfile. Конфиги и персистентные стораджи лучше просовывать с помощью volumes.

staseg ★★★★★
( 30.05.16 18:09:26 MSK )
Ответ на: комментарий от staseg 30.05.16 18:09:26 MSK

А, и еще важно понять разницу между контейнером и образом, у многих из-за этого каша в голове.

staseg ★★★★★
( 30.05.16 18:10:25 MSK )
Ответ на: комментарий от staseg 30.05.16 18:10:25 MSK

контейнер это то, что работает, а образ это то, из чего создаем контейнер?

NoobeR ★★★★
( 30.05.16 18:23:29 MSK ) автор топика
Ответ на: комментарий от NoobeR 30.05.16 18:23:29 MSK

Образ — это совокупность неизменяемых “слоев” (layers), представляющих различия (differences) в состояниях файловой системы. Контейнер — это рантайм-инстанс образа. Как я уже сказал, образа сами по себе неизменяемы, однако контейнеры содержат вдобавок к неизменяемым слоям образа содержат доступный для записи слой, в котором отражаются его изменения. Когда ты запустил контейнер и внёс изменения в конфиги, эти изменения записались в этот самый слой контейнера. Чтобы зафиксировать эти изменения, есть команда docker commit , которая создаёт из контейнера новый образ, добавляя его доступный для записи слой поверх неизменяемых слоёв базового контейнера. Можно также описывать изменения базового слоя декларативно с помощью Dockerfile .

theNamelessOne ★★★★★
( 30.05.16 18:34:46 MSK )
Ответ на: комментарий от theNamelessOne 30.05.16 18:34:46 MSK

NoobeR ★★★★
( 30.05.16 18:37:03 MSK ) автор топика
Ответ на: комментарий от theNamelessOne 30.05.16 18:34:46 MSK

Можно также описывать изменения базового слоя декларативно с помощью Dockerfile .

Можно также описывать изменения базового образа декларативно с помощью Dockerfile .

Посмотри ещё на volume’ы, вполне возможно, для твоей задачи они будут предпочтительней.

theNamelessOne ★★★★★
( 30.05.16 18:42:53 MSK )
Ответ на: Fix от theNamelessOne 30.05.16 18:42:53 MSK

я и так использую тома, для хранения самих сайтов (~/www). в контейнере ~/www смонтирован в /var/www/srv. если это правильно..

NoobeR ★★★★
( 30.05.16 18:47:32 MSK ) автор топика
Ответ на: комментарий от NoobeR 30.05.16 18:47:32 MSK

Ну так можно с помощью томов примонтировать конфиги.

theNamelessOne ★★★★★
( 30.05.16 18:54:50 MSK )
Ответ на: комментарий от theNamelessOne 30.05.16 18:54:50 MSK

что-то вроде ~/www/config/:/etc/apache2/sites-available ?

NoobeR ★★★★
( 30.05.16 18:56:46 MSK ) автор топика
Ответ на: комментарий от NoobeR 30.05.16 18:56:46 MSK

Насколько я знаю, в таком случае в типовой конфигурации апача ещё требуется симлинк в sites-enabled , так что лучше сразу монтировать туда.

theNamelessOne ★★★★★
( 30.05.16 19:00:09 MSK )
Ответ на: комментарий от theNamelessOne 30.05.16 19:00:09 MSK

NoobeR ★★★★
( 30.05.16 19:01:59 MSK ) автор топика
Ответ на: комментарий от NoobeR 30.05.16 18:04:44 MSK

я хочу обновить ПО, подредачить конфиги и потом запускать с этими изменениями, а не делать всё с нуля

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

В Docker же твоя задача решается так:

— Делаем Dockerfile для твоих изменений (исходный образ + действия в нём)
— Из Dockerfile делаем image (или это сделает автоматом docker-compose)
— Запускаем docker-образ, монтируя внутрь него индивидуальные для контейнера конфиги, сохраняемые данные и т.п.

Если тебе требуется сохранять сделанные в Docker изменения, то 99% за то, что ты делаешь что-то не так.

В чем разница между образами Docker и контейнерами?

В чем разница между образами Docker и контейнерами?

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

Почему используются образы и контейнеры Docker?

Контейнеры позволяют разработчикам упаковывать программное обеспечение для работы в любой целевой системе. Раньше вам приходилось упаковывать программное обеспечение специально для разных целевых систем. Например, если вы хотите, чтобы приложение работало в macOS и Windows, вам нужно было изменить дизайн приложения и упаковать его для разных систем.

Контейнеризация позволяет программному приложению работать в виде микросервисов в распределенных кроссплатформенных аппаратных архитектурах. Поскольку контейнеры очень портативны, эти программные приложения работают практически на любой машине с быстрым развертыванием. Например, корпоративное приложение может содержать сотни микросервисов. Они могут работать в виде контейнеров на нескольких машинах и виртуальных машинах (ВМ) в выделенном центре обработки данных и в облаке.

Как они работают: образы Docker и контейнеры Docker

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

Как работают контейнеры Docker

Контейнер Docker – это среда выполнения со всеми необходимыми компонентами, такими как код, зависимости и библиотеки, которые необходимы для запуска кода приложения без использования зависимостей хост-машины. Эта среда выполнения контейнера работает на движке на сервере, машине или облачном инстансе. Движок запускает несколько контейнеров в зависимости от доступных базовых ресурсов.

Чтобы развертывать и масштабировать набор контейнеров для эффективной связи между разными машинами или виртуальными машинами, необходима платформа оркестровки контейнеров, такая как Kubernetes. Это помогает независимо от того, находятся ли ваши машины локально или в облаке. Kubernetes управляет несколькими машинами, называемыми кластером, в контексте контейнерных операций.

Как работают образы Docker

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

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

Ключевые команды: образы Docker и контейнеры Docker

Для управления контейнерами Docker используются команды с параметрами. Стандартный формат команд – docker [options] [command] [arguments].

Контейнерные команды

В следующей таблице приведены часто используемые контейнерные команды. Еще несколько из них перечислены в документации Docker.

Команда

Объяснение

Перечисляет все контейнеры. Пометка -a показывает как работающие, так и неработающие контейнеры. Чтобы отображать только запущенные контейнеры, эту пометку можно опустить.

docker rename [container] [new_name]

Переименовывает данный контейнер в new_name.

docker start [container]

Запускает данный контейнер.

docker stop [container]

Останавливает данный контейнер.

docker wait [container]

Заставляет данный контейнер ждать остановки других работающих контейнеров.

Команды образов

Команд для работы с образами меньше по сравнению с количеством команд для контейнеров.

Docker build -t image_name .

Создает образ Docker с тегом image_name из файлов в текущем каталоге.

docker create [image]

Создает неработающий контейнер из данного образа.

docker run [image]

Создает и запускает контейнер на основе заданного образа.

Создает контейнеры Docker из образов Docker

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

Вот пример команды:

docker run -it MyImage bash

Эта команда создает контейнер из файла образа с именем MyImage. Пометка -it создает псевдотерминал в работающем контейнере. А если указать bash в качестве команды, в контейнере откроется терминал bash.

Ключевые отличия: образы Docker и контейнеры Docker

Контейнер Docker – это автономное запускаемое программное приложение или сервис. С другой стороны, образ Docker – это шаблон, загруженный в контейнер для его запуска, например набор инструкций.

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

Источник

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

Напротив, контейнеры Docker создаются непосредственно из файла образа Docker.

Композиция

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

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

Изменяемость

Образы Docker неизменяемы, что означает, что их нельзя изменить после создания. Если необходимо внести изменения в образ, нужно создать новый образ с требуемыми изменениями.

Напротив, контейнеры изменчивы и допускают модификацию во время выполнения. Изменения, внесенные в контейнер, относятся только к этому конкретному контейнеру и не влияют на связанный с ним образ. Некоторые примеры изменений – запись новых файлов, установка программного обеспечения или изменение конфигураций.

Когда использовать: образы Docker и контейнеры Docker

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

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

При этом управление упрощается при использовании образов и контейнеров. Например, ниже указанно, как можно использовать их в комбинации.

  • Масштабируйте приложение по горизонтали, запуская несколько инстансов контейнеров на основе одного и того же образа.
  • Автоматизируйте конвейеры непрерывной интеграции и развертывания (CI/CD), используя различные образы для сред разработки, тестирования и производства.
  • Помечайте различные версии образов и управляйте ими. Это поможет вам откатить или развернуть определенные версии по мере необходимости.

Краткое описание различий: образы Docker и контейнеры Docker

Образ Docker

Контейнер Docker

Многократно используемый файл общего доступа, применяемый для создания контейнеров.

Инстанс среды выполнения; автономное программное обеспечение.

Создано с помощью нижеуказанного:

Программный код, зависимости, библиотеки и Dockerfile

Слои, доступные только для чтения

Слои, доступные только для чтения, с дополнительным слоем для чтения и записи

Неизменяемость Если есть изменения, вам необходимо создать новый файл.

Изменяемый; вы можете изменить его во время выполнения по мере необходимости.

Для хранения сведений о конфигурации приложения в виде шаблона.

Для запуска приложения.

Как AWS может помочь удовлетворить ваши требования к контейнерам и образам?

Amazon Web Services (AWS) предоставляет множество предложений, обеспечивающих безопасное хранение образов контейнеров и управление ими.

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

Реестр эластичных контейнеров Amazon (Amazon ECR) – это полностью управляемый реестр контейнеров, предлагающий высокопроизводительный хостинг. Таким образом, вы можете надежно развертывать образы приложений и артефакты в любом месте. Разработчики, создающие контейнерные приложения, теперь могут находить и загружать официальные образы Docker непосредственно из Amazon ECR Public.

Эластичный контейнерный сервис Amazon (Amazon ECS) – это полностью управляемый сервис для оркестрации контейнеров. Он упрощает развертывание, контроль и масштабирование контейнерных приложений. Amazon ECS использует образы Docker в определениях задач для запуска контейнеров.

Создайте аккаунт и начните работу с Docker на AWS уже сегодня.

Как перенести / переместить образ Docker в другую систему?

В идеальном случае передача изображений Docker осуществляется через реестр Docker или через полностью управляемого поставщика, такого как AWS ECR или Google GCR. Вы можете легко загрузить изображение с помощью команды docker push , а другие могут получить изображение с помощью команды docker pull .

Хотя, если вам нужно переместить изображение с одного хоста на другой, чтобы протестировать его перед отправкой в ​​производственную среду, или вы хотите поделиться этим изображением с кем-то в офисе, это можно сделать, экспортировав изображение как .tar файл.

Docker поддерживает два разных типа методов для сохранения изображений контейнера в один архив.

  1. Docker save — Save используется для сохранения изображения (не контейнера)
  2. Docker export — Export используется для сохранения контейнера (не изображения)

Использование Docker Save Command:

Сохранение изображения Docker:

Во-первых, мы будем придерживаться плана, который сохраняет только изображение. Теперь пройдемся по команде docker save . Предположим, вам нужен образ Python с Alpine, который можно извлечь из Docker Hub:

$ docker pull python:2.7.17-alpine3.9 2.7.17-alpine3.9: Pulling from library/python e7c96db7181b: Already exists 1819f4b92bc2: Already exists 8061b3761cb3: Pull complete 73aebae115de: Pull complete Digest: sha256:5f6059d78f530c3c59c4842e104ddcfc772a27fb8fac0d900f4d77bcb4621d9b Status: Downloaded newer image for python:2.7.17-alpine3.9 docker.io/library/python:2.7.17-alpine3.9

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

$ docker save python:2.7.17-alpine3.9 > /path/to/save/my-python-container.tar

Просто убедитесь, что вы используете точное имя изображения и тег при создании tar. В нашем случае так и было python:2.7.17-alpine3.9 . Вы можете проверить, сработала ли вышеуказанная команда:

$ du -h my-python-container.tar 75M my-python-container.tar

Теперь вы можете отправить файл .tar другому лицу через rsync , scp или аналогичный протокол передачи файлов в соответствии с вашими предпочтениями.

Загрузка изображения докера:

Как только на целевой машине будет файл .tar , вы можете загрузить образ в локальный реестр, используя команду docker load :

$ docker load < my-python-container.tar

Теперь проверьте, есть ли у вас это изображение на целевом компьютере, с помощью docker images или docker image list . Конечный результат будет примерно таким:

$ docker image list REPOSITORY TAG IMAGE ID CREATED SIZE python 2.7.17-alpine3.9 3f0e580ded94 2 hours ago 74.9MB

Использование команды экспорта Docker:

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

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

$ docker pull alpine Using default tag: latest latest: Pulling from library/alpine e6b0cf9c0882: Pull complete Digest: sha256:2171658620155679240babee0a7714f6509fae66898db422ad803b951257db78 Status: Downloaded newer image for alpine:latest docker.io/library/alpine:latest

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

$ docker run -it --detach --name alpine-t alpine

Чтобы получить идентификатор контейнера и имя, которое мы создали, мы можем использовать команду docker ps . На всякий случай, если на вашей машине контейнер был остановлен по какой-либо причине, вы все равно можете получить идентификатор и имя, используя docker ps -a :

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 35f34fabfa84 alpine "/bin/sh" 14 seconds ago 8 seconds ago alpine-t

Как мы видим, наш идентификатор контейнера 35f34fabfa84 (он будет другим для вас), или вы также можете использовать имя контейнера; в нашем случае это alpine-t . Теперь мы можем запустить команду docker export для экспорта изображения экземпляра:

$ docker export 35f34fabfa84 > alpine-t.tar

Кроме того, вы также можете использовать OPTIONS, чтобы сделать то же самое, и ваш файл .tar будет готов для передачи.

$ docker export --output="alpine-t.tar" 35f34fabfa84

Теперь вы можете импортировать файл .tar на целевой компьютер, используя импорт докера:

$ sudo tar -c alpine-t.tar | docker import - alpine-t

Чтобы проверить, вы можете запустить контейнер с помощью --rm (он уничтожит контейнер, как только вы его выполните):

$ docker run --rm -it --name alpine-test alpine-t:[TAG]

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

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