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


Answers

Из моей статьи « Автоматизация развертывания докеров» :

Docker Images против контейнеров

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

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

Изображение представляет собой инертный, неизменный файл, который по сути является снимком контейнера. Изображения создаются с помощью команды build , и они будут создавать контейнер при запуске с run . Изображения сохраняются в реестре 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. Идентификатор IMAGE - это первые 12 символов истинного идентификатора для изображения. Вы можете создать много тегов данного изображения, но их идентификаторы будут одинаковыми (как указано выше).
  2. ВИРТУАЛЬНЫЙ РАЗМЕР является виртуальным, потому что он объединяет размеры всех отдельных слоев. Это означает, что сумма всех значений в этом столбце, вероятно, намного больше, чем дисковое пространство, используемое всеми этими изображениями.
  3. Значение в столбце REPOSITORY исходит от флага -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 и REPOSITORY. Легко забыть о них.

Более подробную информацию о изображениях можно найти в документах и glossary 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, является истинным идентификатором контейнера. Он имеет ту же форму, но он идентифицирует другой тип объекта.
  2. docker ps выводит только запущенные контейнеры. Вы можете просмотреть все контейнеры ( запущенные или остановленные ) с помощью docker ps -a .
  3. NAMES могут использоваться для идентификации запущенного контейнера с --name флага --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] .
Question

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

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

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




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

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




Dockerfile > (Build)> Изображение > (Выполнить)> Контейнер .

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

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

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




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

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

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

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

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

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

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

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

См. https://en.m.wikipedia.org/wiki/Docker_(Linux_container_engine)




рабочий процесс

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

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

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

docker image ls

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

docker ps



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

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

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

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

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

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




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

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

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




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

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

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

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




Related