Как сохранить docker контейнер?
как сохранить докер контейнер, чтобы потом его можно было загружать на другие машины с уже предустановленными пакетами и файлами?
в файле Dockerfile я прописываю некоторые пакеты которые мне нужны установленными, потом делаю
docker build .
потом добавляю в докер некоторые файлы или ещё что-то
как мне потом всё это сохранить, чтобы весь этот контейнер в таком же виде скопировать на другие машины?
- Вопрос задан более трёх лет назад
- 4508 просмотров
Комментировать
Решения вопроса 2

PHP developer
Можно расписать все шаги в файле docker-compose и билдить и поднимать с помощью него, но еще можно создать свой имейдж, залить его на docker registry или dockerhub и оттуда стягивать на машину https://docs.docker.com/develop/develop-images/bas.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
1. Загрузить в docker registry (свой или чужой), в публичный docker hub и брать оттуда.
2. Сохранить образ в архив, скопировать на новое место и там загрузить:
docker save -o image.tar imagename1:latest imagename2:3.1415926
docker load -i image.tar
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Vue.js
- +2 ещё
Как настроить nginx для корректной работы с vue-router внутри docker compose?
- 2 подписчика
- час назад
- 13 просмотров
Как сохранить образ 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 апр 2023 в 16:08
43 7 7 бронзовых знаков
а зачем? и как вы пытаетесь его открыть, что получаете ошибку «Файл имеет неверный формат или поврежден»?
12 апр 2023 в 18:06
Образ нужно развернуть на другой системе, а открыть я его пытался винраром и 7zip
12 апр 2023 в 21:49
для этих целей обычно используют docker registry, например docker hub или любой другой, но даже если вы хотите использовать docker save, то на другой машине нужно просто использовать docker load и все, а уменьшить образ можно с помощью multistage build
12 апр 2023 в 21:51
2 gb — это как-то очень много. Я собрал небольшое приложение в докере на образе node:18-alpine , и получил всего 172 мб, а после сжатия gzip и вовсе 50 мб. Вы уверены, что ничего лишнего не тащите в образ инструкцией COPY . . ?
13 апр 2023 в 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
Основы Container Engine
Docker — это программная платформа для быстрой разработки, тестирования и развертывания приложений. SWR совместим с Docker, что позволяет использовать Docker CLI и API для управления образами.
Установка Docker
Перед установкой можно почитать инструкцию на официальном сайте. Docker совместим со многими операционными системами.
- Docker должен быть обновлен до версии 1.11.2 или более поздней.
- Если сервер работает в частной сети, привяжите IP-адрес, так как для установки требуется подключение к интернету.
На устройстве под управлением Linux выполните следующие команды, чтобы установить Docker:
curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh sudo systemctl daemon-reload sudo systemctl restart docker
Создание образа контейнера
Dockerfile — это текстовый файл, содержащий инструкции, которые можно вызвать в командной строке для создания образа.
Образ контейнера — это единый файл, из которого разворачиваются контейнеры.
При использовании браузера для доступа к контейнерному приложению, созданному из образа Nginx , по умолчанию отобразится страница приветствия Nginx.
В этом пункте создадим новый образ на основе образа Nginx и изменим приветственное сообщение на «Hello, SWR!».
-
Чтобы создать пустой файл с именем Dockerfile , выполните следующие команды:
mkdir mynginx cd mynginx touch Dockerfile
vim Dockerfile
Добавьте в Dockerfile :
FROM nginx RUN echo 'Hello,SWR!
' > /usr/share/nginx/html/index.html
- FROM — создает слой из базового образа. Dockerfile должен начинаться с FROM . В этом примере в качестве базового используется образ Nginx .
- RUN — выполняет команду для создания нового слоя. В этом примере команда echo выполняется для отображения «Hello, SWR!» Сохраните изменения и выйдите.
- -t nginx:v1: — указывает название образа и тег.
- . — указывает путь, по которому находится Dockerfile . Все содержимое по этому пути упаковывается и отправляется в Docker для создания образа.
Сжатие образа
В этом пункте описывается, как сжать образ контейнера в tar или tar.gz .
- Чтобы получить список образов, выполните команду docker images. Проверьте название и тег образа, который нужно сжать.
- Чтобы сжать образ в tar или tar.gz , выполните команду docker save [OPTIONS] IMAGE [IMAGE. ]. Для параметра OPTIONS можно установить значение –output или -o , указывающее, что образ экспортируется в файл.
$ docker save nginx:latest > nginx.tar $ ls -sh nginx.tar 108M nginx.tar $ docker save php:5-apache > php.tar.gz $ ls -sh php.tar.gz 372M php.tar.gz $ docker save --output nginx.tar nginx $ ls -sh nginx.tar 108M nginx.tar $ docker save -o nginx-all.tar nginx $ docker save -o nginx-latest.tar nginx:latest
Введение в Docker: образы, контейнеры и докер-файлы


Docker — это средство или система упаковки, доставки и запуска приложений. Он позволяет запускать приложения написанные на разных языках программирования благодаря унифицированному подходу к упаковке, доставке и запуску приложений. Поставляется Docker как набор Open Source программ, свободно доступных для скачивания как из репозиториев Linux, так и с сайта www.docker.com. Несмотря на то, что Docker стал уже давно стандартом в DevOps, до сих пор его установка у начинающих пользователей вызывает затруднения. Чтобы у наших читателей не было с этим проблем — мы подготовили краткую инструкцию по его установке. Появление докера сильно упростило процесс доставки и запуска приложений у конечных пользователей. Он смог стандартизировать эти процессы, предоставляя разработчикам сразу 3 мощных механизма:
- механизм сборки приложений в неизменяемые образа, которые избавляют от надобности сбора всех нужных зависимостей по всей хостовой ОС;
- механизм доставки программных продуктов до конечных пользователей, гарантирующий 100% совместимость с хостовой ОС;
- механизм развертывания приложений на любой *nix-системе, все зависимости от языка программирования на котором написано приложение.
Docker, следуя специальным инструкциям, прописанным разработчиком в конфигурационных файлах (Dockerfile и Docker-compose.yaml), собирает всё необходимое для запуска приложения в одно место — в образ. Docker-образ можно сравнить с CD-диском, с которого в будущем будет установлен и запущен некий софт. Контейнер в свою очередь — это запущенная копия образа.
В начале статьи мы сказали, что Docker — это целая экосистема, которая содержит различные компоненты. Давайте теперь рассмотрим эти компоненты поближе.
Компоненты экосистемы Docker

Компоненты экосистемы Docker можно разделить на две группы:
- Системные компоненты: Docker host (докер-хост), Docker daemon (докер-демон), Docker client (докер-клиент) и Docker-compose (менеджер запуска кластера контейнеров);
- Переменные компоненты: Docker image (докер-образ), Docker container (докер-контейнер), Docker registry (репозиторий), Dockerfile (докер-файл), Docker-compose.yaml (конфигурационный файл кластера контейнеров).
Пройдёмся вкратце по первой группе, затем подробно разберем компоненты второй группы:
- Docker host (докер-хост) — это просто компьютер или виртуальный сервер, на котором установлен Docker. Кстати, Docker можно запустить и из WSL 2. Это удобно, если вы работаете под Windows и используете Visual Studio Code. Прочитать о том как настроить WSL для работы с докером можно здесь.
- Docker daemon (докер-демон) — центральный системный компонент, который управляет всеми процессами докера: создание образов, запуск и остановка контейнеров, скачивание образов. Работает Docker daemon как фоновый процесс (демон) и постоянно следит за состоянием других компонентов.
- Docker client (докер-клиент) — это утилита, предоставляющая API к докер-демону. Клиент может быть консольным (*nix-системы) или графическим (Windows).
Разберём теперь подробнее компоненты второй группы. Начнём с центральных элементов — докер-образа.
Docker-образ

Docker образ — это шаблон (физически — исполняемый пакет), из которого создаются Docker-контейнеры. Образ хранит в себе всё необходимое для запуска приложения, помещенного в контейнер: код, среду выполнения, библиотеки, переменные окружения и конфигурационные файлы.
Docker-образ создаётся с помощью команды docker build, которая считывает конфигурацию создаваемого образа из специального конфигурационного файла — dockerfile.
В Dockerfile записываются команды и опции создания образа, а также некоторые настройки будущего контейнера, такие как порты, переменные окружения и другие опции.
Каждая команда записанная в dockerfile создаёт свой слой. Чем больше слоёв, тем дольше будет собираться образ и дольше загружаться контейнер. Финальный Docker-образ — это объединение всех слоев в один. Благодаря такому подходу можно переиспользовать уже готовые образа для создания новых образов.

Рассмотрим на реальном примере процесс формирования Docker-образа. Предположим мы хотим запустить Docker-контейнер с микросервисом написанном на Python. Поскольку контейнер изолирован от всего, что происходит на хостовой машине, наше приложение не сможет запуститься, ведь в контейнере нет питона, а питон в свою очередь не сможет запуститься без ОС.
Получается, чтобы запустить приложение на питоне, в контейнере должна быть ОС и Python. Возникает вопрос: откуда нам это всё взять? Разработчики Docker и здесь о нас позаботились, ведь если вы впервые собираете Docker-образ никаких готовых образов у вас на машине нет, поэтому Docker сам скачает указанный вами родительский образ в Dockerfile из репозитория hub.docker.com.
В нашем случае команды в Dockerfile будут такими:
FROM python:latest
RUN mkdir -p /usr/app/
WORKDIR /usr/app/
CMD [«python», «main.py»]
Первая команда говорит докеру следующие: возьми образ Python с тегом latest, а если его нет локально — скачай из хаба. Вторая команда — создаст директорию app. Третья команда установит директорию /usr/app/ в качестве рабочей директории, а команда CMD осуществит системный вызов, который будет выполнен при старте контейнера.
Docker заботится об используемых ресурсах, поэтому скачанные или собранные самостоятельно образы хранятся локально. Посмотреть их можно командой docker images. В ответ команда вернёт таблицу следующего вида:
REPOSITORY TAG IMAGE ID CREATED SIZE
acc-info latest 7069c8d4c76b 27 hours ago 1.05GB
python latest a5d7930b60cc 3 weeks ago 917MB
Вы могли заметить, что образы довольно объемны и хранить их локально накладно. Для экономии места и «правильной передачи образов другим разработчикам», Docker предлагает удобный инструмент загрузки образов в удалённый репозиторий.
Для загрузки образа в репозиторий сначала нужно залогиниться на hub.docker.com, а затем и в терминале, с помощью команды docker login. После логина соберите образ командой docker build и в качестве названия образа укажите свой никнейм с сайта hub.docker.com и через “/” желаемое название образа. В нашем случае это выглядит так:
docker build -t pseudolukian/acc-info .
После успешного создания образа, его можно загружать в удаленный репозиторий командой docker push с указанием названия образа:
docker push pseudolukian/acc-info
Загруженные образы появятся по адресу: https://hub.docker.com/repositories. Теперь вы можете их скачать на любую машине командой docker pull название образа.
Что нужно знать о Docker-образах:
- Образ — это только шаблон для создания контейнеров.
- В основе любого образа лежит родительский образ, который, как правило, содержит ОС.
- Образ состоит из слоев.
- Каждая команда в Dockerfile создаёт новый слой.
- Образы можно переиспользовать много раз.
- Образы можно загружать в удаленный репозиторий.
Если вы хотите больше практики и экспериментов с созданием Docker-образов — в нашей базе знаний есть инструкция, содержащая основные команды Docker по работе с образами.
Итак, с первой основной сущностью экосистемы Docker разобрались, переходим ко второй — Docker-контейнеру.
Docker-контейнер

Контейнер — это запущенный и изолированный образ с возможностью временного сохранения данных. Данные записываются в специальный слой «сверху» контейнера и при удалении контейнера данные также удаляются.
Для работы с контейнерами Docker предоставляет всего несколько основных команд: docker run/stop/restart. Однако команда run имеет множество полезных ключей, о которых просто необходимо знать. Ознакомиться с ними можно в базе знаний, в разделе Docker.
В определение контейнера нами было сказано, что контейнер хранит данные временно до его уничтожения в специальном слое «сверху контейнера». Данные удаляются вместе с контейнером. В общем виде Docker-контейнер со слоем записи можно представить так:

Но как же быть, если мы хотим, скажем, запускать базы данных или иные приложения в контейнере, для которых важна целостность данных? Docker предлагает два решения:
- Монтирование папки с хоста к контейнеру. Такое решение отлично подходит для разработки и отладки приложения, когда вносимые изменения на хосте сразу отражаются в контейнере. Конечно, для продакшна такой подход не годится.
- Создание специальных томов для хранения данных — Docker volume. DV — это обычные каталоги хоста, которые могут быть смонтированы как отдельные файловые системы (bind mounting) внутри контейнера.
Лучше всегда использовать второй вариант. Подключается Docker volume к контейнеру двумя различными способами: с помощью команды docker run с ключом -v — docker run —name python —rm -v home/test-volume/ : /data/ -d (сначала идёт путь к папке хоста, затем указывается папка монтирования) или через инструкцию VOLUME /data в Dockerfile. Результат будет одинаковым.
Docker-контейнеры могут не только хранить информацию в специальных томах, но и использовать их совместно с другими контейнерами. Всеми процессами коммуникации между контейнерами управляет демон Docker. Именно он создает и запускает контейнеры.
По умолчанию демон Docker использует собственный драйвер Docker runc, который тесно связан со следующими механизмами ядра:
- Cgroups (контрольные группы) — механизм управления ресурсами, используемыми контейнером (процессор, оперативная память и т.д.). С помощью cgroups Docker также реализует возможность остановки контейнеров — docker pause (freezing и unfreezing).
- Namespaces (пространства имен) — механизм изоляции контейнеров, гарантирующий, что файловая система, имя хоста, пользователи, сетевая среда и процессы любого контейнера полностью отделены от остальной части системы.
Ещё одна технология, которую Docker использует для хранения слоев в контейнере — файловая система с каскадно-объединенным монтированием (Union File System – UnionFS). Как видите Docker умело использует уже хорошо работающие технологии, и в этом его сила. Именно поэтому ранее мы выпустили большую обзорную статью о контейнеризации и разобрали там базовые механизмы ядра, использующиеся в контейнеризации.

История контейнеризации
Из статьи вы узнаете, что такое cgroups и namespaces, как они работают и, какими технологиями пользовались до их появления.
Сами по себе контейнеры не эфемерны, более того Docker их не скрывает и вы можете совершенно спокойно заглянуть в них. Они располагаются здесь: /var/lib/docker/containers. Обращаться к контейнеру как к набору файлов бывает полезно, когда вам нужно прочитать логи контейнера.
Подытожим, что мы узнали о Docker-контейнерах:
- Docker-контейнер — это запущенный Docker-образ со специальным слоем для записи и временного хранения информации.
- В одном контейнере должен находится один процесс — это философия Docker.
- Контейнеры полностью изолированы от хостовой ОС и других контейнеров.
- Контейнеры хранятся в виде папок и файлов в директории /var/lib/docker/containers .
- Контейнерам могут быть назначены внешние порты инструкцией EXPOSE и ключом -P команды docker run .
- Контейнеры могут сохранять информацию после уничтожения в томах Docker volume.
Как вы наверное уже догадались, условия запуска контейнера могут быть заданы двумя путями: прописаны в конфигурационном файле — Dockerfile или указаны в качестве аргументов и ключей команды docker run . Разберём подробнее вариант с указанием инструкций в Dockerfile.
Dockerfile

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

Существуют определенные правила и логика заполнения Dockerfile. Разберем базовые инструкции на примере Dockerfile с иллюстрации выше.
Любой код или набор инструкций выполняется сверху вниз. Поэтому Dockerfile всегда начинается с открывающей инструкции FROM , которая говорит демону Docker, какой образ для основы нужно взять. Если образа локально нет — он будет скачан с Docker hub.
Далее идет инструкция RUN с определенной командой. В нашем случае мы использовали команду mkdir -p для создания папки /app. Инструкций RUN может быть неограниченное количество, но стоит помнить, что каждая инструкция создает свой слой, поэтому хорошей практикой является запись цепочки команд через &&: RUN comand_1 && comand_2 && comand_3 .
Есть инструкции логически связанные между собой. Инструкция WORKDIR устанавливает активный рабочий каталог. Все последующие команды, такие как COPY , RUN , CMD и некоторые другие будут выполнены из рабочего каталога, установленного через WORKDIR .
С инструкцией COPY всё просто. Первым аргументом указывается папка для копирования, а вторым аргументом — папка в контейнере куда будут помещены файлы из копируемой директории. В нашем случае, из текущего каталога (“.” — каталог, в котором находится пользователь, “..” — каталог выше относительно “.”.), в котором находится пользователь, был скопирован файл requirements.txt и помещен в папку /app в контейнере.
Инструкцию RUN мы рассмотрели ранее. Тут лишь хотим обратить ваше внимание на её поведение в сочетании с инструкцией WORKDIR . Ранее инструкция COPY перенесла файл requirements.txt в контейнер. Кстати, в качестве финального пути мы могли указать “.”, так как инструкция WORKDIR установила в качестве рабочей директории контейнера папку /app . И теперь команда RUN будет выполнена именно из директории /app .
Финальной инструкцией в любом Dockerfile является CMD или ENTRYPOINT . В отличие от других инструкций CMD может быть только одна и она может быть переопределена при старте контейнера командой docker run . Инструкция CMD наследует условия установленные инструкцией WORKDIR .
Не все инструкции указанные в Dockerfile непосредственно исполняются при сборке образа и запуске контейнера. Например, инструкция EXPOSE лишь говорит демону Docker, что мы намереваемся пробросить указанный нами порт наружу контейнера — EXPOSE 80 . В этом примере мы хотим пробросить порт 80 изнутри контейнера наружу.
Однако после запуска контейнера «постучаться» на 80 порт к нему мы не сможем. Так как для подтверждения инструкции EXPOSE используется ключ -P команды docker run . Если требуется прокинуть порт и переназначить его снаружи — используется следующая команда: docker run -p 80:80 —name test_cont -d .
Подробнее об инструкциях Dockerfile и их специфики вы можете узнать из нашей статьи в базе знаний.
Итак, мы познакомились с основными элементами экосистемы Docker. Есть ещё специальная надстройка для управления множеством контейнеров Docker-compose, ей мы посвятим отдельную статью с подробным разбором, а пока подведем итог.
Что же такое Docker?

Docker — это система упаковки, доставки и развертывания приложений, распространяющаяся бесплатно. Docker состоит из следующих компонентов: Docker host, Docker daemon, Docker client, Docker-compose (не входит в стандартную поставку).
Центральный системный элемент инфраструктуры Docker — Docker daemon. Именно он создаёт образы и контейнеры, следит за их состоянием, управляет сетевым окружением контейнеров и работает с локальным и удалённым репозиторием.
Двумя основными сущностями, которыми оперирует Docker являются: образ и контейнер. Эти понятия тесно связаны.
Docker-образ — это шаблон, из которого создаются контейнеры. Образ содержит всё необходимое для запуска контейнеризированного приложения на любой *nix клиентской системе. Docker старается максимально переиспользовать уже готовые шаблоны, поэтому если нужный шаблон не будет найден локально — он будет скачан из удалённого репозитория.
Docker-контейнер — это запущенный и изолированный образ с дополнительным верхним write/read-слоем, хранящим временные данные, которые уничтожаются после удаления контейнера. Контейнерам можно назначать лимиты ресурсов и строить между ними сети. Для управления ресурсами используются cgroups, а для изоляции — namespaces.
Образы собираются исходя из инструкций заданных в специальном конфигурационном файле — Dockerfile. Контейнеры при запуске также используют часть инструкций Dockerfile и опции команды docker run. А для управления кластером или группой контейнеров используется надстройка Docker-compose и конфигурационный файл Docker-compose.yml.
Docker умело и уверенно использует уже проверенные технологии ядра, привнося минимум своих решений. Благодаря этому инфраструктура построенная на микросервисах, использующая Docker считается надежной, масштабируемой и легко поддерживаемой.
Docker отлично справляется с созданием и управлением образами и небольшим количеством контейнеров, однако современные инфраструктуры состоят из 100 микросервисов, для их менеджмента используется Kubernetes. О нём мы расскажем в ближайших публикациях, а пока мы готовим материалы, вы можете поупражняться в Docker, используя самые доступные серверы 1cloud на базе VMware и статьи из нашей базы знаний.