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

При использовании Docker мы начинаем с базового образа. Мы загружаем его, создаем изменения, и эти изменения сохраняются в слоях, образующих другое изображение.

Так что в конце концов у меня есть образ для моего экземпляра PostgreSQL и образ для моего веб-приложения, изменения в котором продолжают сохраняться.

Итак, вопрос: что такое контейнер?

33 ответа

Решение

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

Вы можете увидеть все ваши изображения с docker images в то время как вы можете увидеть ваши работающие контейнеры с docker ps (и вы можете увидеть все контейнеры с docker ps -a).

Итак, работающий экземпляр изображения - это контейнер.

Из моей статьи об автоматизации развертывания Docker:

Изображения Docker против Контейнеров

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

Что такое изображение?

Изображение - это инертный, неизменный файл, который по сути является снимком контейнера. Изображения создаются командой build, и они будут создавать контейнер при запуске с run. Изображения хранятся в реестре Docker, например https://registry.hub.docker.com/. Поскольку они могут стать достаточно большими, изображения разрабатываются так, чтобы они состояли из слоев других изображений, что позволяет передавать минимальный объем данных при передаче изображений по сети.

Локальные изображения могут быть перечислены, запустив docker images:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
<none>                    <none>              4ab0d9120985        3 months ago        486.5 MB

Некоторые вещи на заметку:

  1. ИД ИЗОБРАЖЕНИЯ - это первые 12 символов истинного идентификатора изображения. Вы можете создать много тегов для данного изображения, но их идентификаторы будут одинаковыми (как указано выше).
  2. ВИРТУАЛЬНЫЙ РАЗМЕР является виртуальным, поскольку он складывает размеры всех отдельных нижележащих слоев. Это означает, что сумма всех значений в этом столбце, вероятно, намного больше, чем дисковое пространство, используемое всеми этими образами.
  3. Значение в столбце РЕПОЗИТОРИИ исходит из -t флаг docker build команда или из docker tag существующее изображение. Вы можете помечать изображения с помощью номенклатуры, которая имеет смысл для вас, но знайте, что докер будет использовать этот тег в качестве расположения реестра в docker push или же docker pull,
  4. Полная форма тега [REGISTRYHOST/][USERNAME/]NAME[:TAG], За ubuntu выше, REGISTRYHOST определяется как registry.hub.docker.com, Так что если вы планируете хранить свое изображение под названием my-application в реестре на docker.example.com, вы должны пометить это изображение docker.example.com/my-application,
  5. Столбец TAG - это только часть [:TAG] полного тега. Это неудачная терминология.
  6. latest тег не магический, это просто тег по умолчанию, когда вы не указываете тег.
  7. Вы можете иметь изображения без тегов, идентифицируемые только по их идентификаторам IMAGE. Это получит <none> TAG и хранилище. Про них легко забыть.

Более подробную информацию об изображениях можно получить из документации и глоссария Docker.

Что такое контейнер?

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

Просмотр локальных запущенных контейнеров с docker ps:

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                    NAMES
f2ff1af05450        samalba/docker-registry:latest      /bin/sh -c 'exec doc   4 months ago        Up 12 weeks         0.0.0.0:5000->5000/tcp   docker-registry

Здесь я запускаю докерскую версию реестра докеров, так что у меня есть личное место для хранения моих изображений. Опять же, кое-что отметить:

  1. Как и IMAGE ID, CONTAINER ID является истинным идентификатором контейнера. Он имеет ту же форму, но идентифицирует другой тип объекта.
  2. docker ps только выводит запущенные контейнеры. Вы можете просмотреть все контейнеры (запущенные или остановленные) с docker ps -a,
  3. Имена могут быть использованы для идентификации запущенного контейнера через --name флаг.

Как избежать накопления изображения и контейнера?

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

Мы можем удалить все непомеченные изображения, комбинируя docker rmi с недавним dangling=true запрос:

docker images -q --filter "dangling=true" | xargs docker rmi

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

docker rm `docker ps --no-trunc -aq`

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

  1. Всегда удаляйте бесполезный, остановленный контейнер с docker rm [CONTAINER_ID],
  2. Всегда удаляйте изображение за бесполезным, остановленным контейнером с docker rmi [IMAGE_ID],

Проще говоря.

Изображения -

Файловая система и приложение конфигурации (только для чтения), которое используется для создания контейнеров. Подробнее

Контейнеры -

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


Другие важные условия, на которые следует обратить внимание:


Docker Daemon -

Фоновая служба, запущенная на хосте, которая управляет сборкой, запуском и распространением контейнеров Docker.

Docker клиент -

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

Docker Store -

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

Одна картинка стоит тысячи слов.

(Для более глубокого понимания, пожалуйста, прочитайте это.)

Резюме:

  • Извлечь изображение из Docker-концентратора или построить из Dockerfile => Дает изображение Docker (не редактируется).
  • Запустите изображение (docker run image_name:tag_name) => Дает работающее изображение, т.е. контейнер (редактируемый)

Хотя контейнер проще всего представить как бегущее изображение, это не совсем точно.

Изображение - это действительно шаблон, который можно превратить в контейнер. Чтобы превратить изображение в контейнер, движок Docker берет его, добавляет сверху файловую систему для чтения и записи и инициализирует различные настройки, включая сетевые порты, имя контейнера, идентификатор и ограничения ресурсов. Работающий контейнер имеет выполняемый в данный момент процесс, но контейнер также можно остановить (или закрыть в терминологии Докера). Выход из контейнера не совпадает с изображением, так как он может быть перезапущен и сохранит свои настройки и любые изменения файловой системы.

Может быть, объяснение всего рабочего процесса может помочь.

Все начинается с Dockerfile. Dockerfile - это исходный код образа.

Как только Dockerfile создан, вы создаете его для создания образа контейнера. Образ - это просто "скомпилированная версия" "исходного кода", который является Dockerfile.

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

Далее вы можете использовать изображение для запуска контейнеров. Работающий контейнер во многих отношениях очень похож на виртуальную машину (но без гипервизора).

В этом посте объясняется много основных вещей о контейнерах Docker (речь идет о Docker и Puppet, но есть много концепций, которые можно использовать в любом контексте)

Dockerfile > (Build)> Изображение > (Run) > Контейнер.

  • Dockerfile: содержит набор инструкций docker, которые настраивают вашу операционную систему так, как вам нравится, и устанавливает / настраивает все ваше программное обеспечение.

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

  • Контейнер: сама виртуальная операционная система, вы можете подключиться к ней по ssh и запускать любые команды, как если бы это была реальная среда. Вы можете запустить более 1000 контейнеров из одного изображения.

Workflow

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

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

Чтобы вывести список изображений, которые вы можете запустить, выполните:

docker image ls

Для вывода списка контейнеров вы можете выполнить команды:

docker ps

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

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

  • Изображение: изображение Docker состоит из ряда слоев только для чтения

  • Слой: каждый слой представляет инструкцию в Dockerfile изображения.

Example: Приведенный ниже Dockerfile содержит четыре команды, каждая из которых создает слой.

ОТ убунту:15.04

КОПИЯ. /приложение

RUN make / app

CMD python /app/app.py

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

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

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

Понимание изображений и контейнеров с точки зрения размера на диске

Чтобы просмотреть приблизительный размер работающего контейнера, вы можете использовать docker ps -s команда. Ты получаешь size а также virtual size как два выхода:

  • Размер: объем данных (на диске), который используется для слоя записи каждого контейнера

  • Виртуальный размер: объем данных, используемых для данных изображения, доступных только для чтения, используемых контейнером. Несколько контейнеров могут совместно использовать некоторые или все данные изображения, доступные только для чтения. Следовательно, они не являются аддитивными. Т.е. вы не можете добавить все виртуальные размеры, чтобы вычислить, какой размер диска используется образом.

Другая важная концепция - стратегия копирования при записи.

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

Я надеюсь, что это помогает кому-то, как я.

Проще говоря, если изображение является классом, то контейнер является экземпляром класса и является объектом времени выполнения.

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

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

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

Docker - одно из тех приложений, которые знают, как указать ОС (в основном Linux), под какими ограничениями запускать исполняемый файл. Исполняемый файл содержится в образе Docker, который является просто tar-файлом. Этот исполняемый файл обычно представляет собой урезанную версию дистрибутива Linux (Ubuntu, centos, Debian и т. Д.), Предварительно настроенную для запуска одного или нескольких приложений внутри.

Хотя большинство людей используют базу Linux в качестве исполняемого файла, это может быть любое другое бинарное приложение, если только хост-ОС может его запустить. (см. создание простого базового изображения с использованием нуля). Является ли двоичный файл в образе докера операционной системой или просто приложением, для хоста операционной системы это просто еще один процесс, отдельный процесс, управляемый заданными границами ОС.

Другие приложения, такие как Docker, могут указывать операционной системе хоста, какие границы применять к процессу во время его работы, включают LXC, libvirt и systemd. Docker использовал эти приложения для косвенного взаимодействия с ОС Linux, но теперь Docker взаимодействует напрямую с Linux, используя свою собственную библиотеку, называемую " libcontainer".

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

ИМО, отличающая Docker от любой другой контейнерной технологии, - это хранилище (Docker Hub) и инструменты управления, которые делают работу с контейнерами чрезвычайно простой.

Смотрите https://en.m.wikipedia.org/wiki/Docker_(Linux_container_engine)

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

Изображения отображают состояние контейнера в любой момент времени. Итак, основной рабочий процесс:

  1. создать образ
  2. начать контейнер
  3. внести изменения в контейнер
  4. сохранить контейнер обратно как изображение

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

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

1) Построить Dockerfile:

docker build -t my_image dir_with_dockerfile

2) Сохраните изображение в .tar файл

docker save -o my_file.tar my_image_id

my_file.tar будет хранить изображение. Откройте его tar -xvf my_file.tar и вы увидите все слои. Если вы погрузитесь глубже в каждый слой, вы увидите, какие изменения были добавлены в каждый слой. (Они должны быть довольно близки к командам в Dockerfile).

3) Чтобы заглянуть внутрь контейнера, вы можете сделать:

sudo docker run -it my_image bash

и вы можете видеть, что это очень похоже на ОС.

Можно подумать об изображении как о "снимке" контейнера.

Вы можете создавать образы из контейнера (новые "снимки"), а также запускать новые контейнеры из образа (создавать "снимок"). Например, вы можете создать экземпляр нового контейнера из базового образа, выполнить некоторые команды в контейнере, а затем "сделать снимок" этого нового образа. Затем вы можете создать 100 контейнеров из этого нового образа.

Другие вещи, которые следует учитывать:

  • Изображение состоит из слоев, а слои представляют собой снимки "различий"; когда вы нажимаете изображение, в реестр отправляется только "diff".
  • Dockerfile определяет некоторые команды на верхней части базового изображения, которое создает новые слои ("Diffs"), что в результате нового изображения ("снимок").
  • Контейнеры всегда создаются из изображений.
  • Теги изображений - это не просто теги. Это "полное имя" изображения ("репозиторий: тег"). Если одно и то же изображение имеет несколько имен, оно отображается несколько раз при выполненииdocker images.

Думаю, лучше сначала объяснить.

Предположим, вы запустите команду docker run hello-world. Что происходит?

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

Допустим, hello-world не существует. Сервер Docker переходит в Docker Hub (Docker Hub - это просто бесплатный репозиторий образов) и спрашивает: "Привет, Hub, у вас есть образ под названиемhello-world? Ответы хаба - да, верю. Тогда дай мне, пожалуйста. И начинается процесс загрузки. Как только образ Docker загружен, сервер Docker помещает его в кеш образа.

Итак, прежде чем мы объясним, что такое образы Docker и контейнеры Docker, давайте начнем с введения об операционной системе на вашем компьютере и о том, как в ней работает программное обеспечение.

Когда вы запускаете, например, Chrome на своем компьютере, он вызывает операционную систему, операционная система сама вызывает ядро ​​и спрашивает, эй, я хочу запустить эту программу. Ядру удается запускать файлы с вашего жесткого диска.

А теперь представьте, что у вас есть две программы: Chrome и Node.js. Для работы Chrome требуется Python версии 2, а для Node.js - Python версии 3. Если на вашем компьютере установлен только Python v2, будет запущен только Chrome.

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

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

Docker Client, Server, Machine, Images, Hub, Composes - это инструменты для проектов, части программного обеспечения, которые объединяются, чтобы сформировать платформу, в которой экосистема для создания и запуска чего-то, называемого контейнерами, теперь, если вы запустите команду, docker run redis достигнет чего-то, называемого docker CLI. в нечто, называемое Docker Hub, и загрузил единственный файл, называемый изображением.

Образ Docker:

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

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

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

Теперь давайте посмотрим, когда вы даете команду ниже:sudo docker run hello-world

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

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

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

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

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

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

Что такое контейнер. Прежде всего, изображение - это схема создания контейнера.

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

Изображение является эквивалентом определения класса в ООП, а слои - это разные методы и свойства этого класса.

Контейнер - это фактическое создание экземпляра изображения, так же, как объект является экземпляром или экземпляром класса.

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

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

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

Я хотел бы заполнить недостающую часть между docker images а также containers. Docker использует объединенную файловую систему (UFS) для контейнеров, которая позволяет монтировать несколько файловых систем в иерархию и отображаться как единую файловую систему. Файловая система из образа была смонтирована какread-only слой, и любые изменения в работающем контейнере вносятся в read-writeслой, установленный поверх этого. Из-за этого Docker нужно только посмотреть на самый верхний уровень чтения-записи, чтобы найти изменения, внесенные в работающую систему.

Как и в аспекте программирования,

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

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

Аналогично тому, что "когда экземпляр создан для образа", он называется "Контейнер"

Я бы сформулировал это по следующей аналогии:

+-----------------------------+-------+-----------+
|             Domain          | Meta  | Concrete  |
+-----------------------------+-------+-----------+
| Docker                      | Image | Container |
| Object oriented programming | Class | Object    |
+-----------------------------+-------+-----------+

Короче говоря.

Докер-образы:

Файловая система и приложение конфигурации (только для чтения), которое используется для создания контейнеров.

Докер-контейнеры:

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


Другие важные термины, на которые следует обратить внимание:

Докер-демон:

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

Докер-клиент:

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

Магазин докеров:

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

Картинка из этого сообщения в блоге стоит тысячи слов.

Краткое содержание:

  • Извлечь образ из Docker-хаба или собрать из Dockerfile => Дает образ Docker (не редактируемый).
  • Запустите образ (docker run image_name:tag_name) => Дает работающий образ, т.е. контейнер (редактируемый)

* В докере изображение - это неизменяемый файл , содержащий исходный код и информацию, необходимую для запуска приложения докера. Он может существовать независимо от контейнера.

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

Подобно тому, как объект является экземпляром класса на объектно-ориентированном языке программирования, контейнер Docker является экземпляром образа Docker.

Изображение для класса как контейнер для объекта.

Контейнер является экземпляром изображения, так как объект является экземпляром класса.

Образ - это план, из которого строятся контейнер / ы (запущенные экземпляры).

Короче:

Контейнер - это разделение (виртуальное) в ядре, которое использует общую ОС и запускает образ (образ Docker).

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

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

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

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();

Dockerfile похож на ваш bash-скрипт, который создает тарбол (изображение Docker).

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

Контейнер Docker запускает экземпляр изображения. Вы можете связать изображение с программой и контейнер с процессом:)

Образ или образ контейнера — это файл, который содержит код вашего приложения, среду выполнения приложения, конфигурации, зависимые библиотеки. Изображение в основном объединяет все это в один безопасный неизменяемый блок. Для создания образа используется соответствующая команда docker. Изображение имеет идентификатор изображения и тег изображения. Тег обычно имеет формат <docker-user-name>/image-name:tag.

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

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

Другие вопросы по тегам