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

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

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

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

20 ответов


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

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

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


из моей статьи о Автоматизация Развертывания Докер:

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

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

что такое образ?

изображение-это инертный, неизменяемый файл, который по существу является моментальным снимком контейнера. Изображения создано с помощью построить команда, и они будут производить контейнер при запуске с выполнить. Изображения хранятся в реестре Docker, например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 engine берет изображение, добавляет файловую систему чтения и записи сверху и инициализирует различные параметры, включая сетевые порты, имя контейнера, идентификатор и ограничения ресурсов. Запущенный контейнер имеет текущий процесс выполнения, но контейнер также может быть остановлен (или выход в терминологии Докера). Выходящий контейнер не то же самое, что и изображение, так как оно может быть перезапущено и сохранит свои настройки и любые изменения файловой системы.


может, объясняя весь процесс может помочь.

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

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

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

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

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


в просто слова.

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

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

Тара -

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


другие важные термины, чтобы заметить:


Докер демон -

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

клиент Docker -

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

Docker Store -

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

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

Enter image description here

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

резюме:

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

процесс

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

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

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

docker image ls

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

docker ps

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

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

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

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

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

из ubuntu: 15.04

копировать . / app

запустить make / app

CMD python /app/app.py

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

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

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

понимание контейнеров cnd изображений из a размер-на-диске перспективы

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


Dockerfile > (сборка) > изображения > (Run)> контейнер.

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

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

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


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

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

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

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

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

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

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

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

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

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

IMO что отличает Докера из любой другой контейнерной технологии является ее репозиторий (Docker Hub) и их инструменты управления, что делает работу с контейнерами чрезвычайно простой.

посмотреть https://en.m.wikipedia.org/wiki/Docker_ (Linux_container_engine)


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


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

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

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


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

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


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

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

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

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


короче:

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

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


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

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


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

однако следующие шаги помогли мне лучше понять, что такое Docker image и container:

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

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


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

контейнеры Docker похожи на извлеченную версию tarball. Вы можете иметь столько копий, сколько вам нравится в разных папках (контейнерах)


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

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

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

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