Перейти к основному содержимому

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

· 5 мин. чтения

1. Обзор

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

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

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

2. Докер-образы

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

Изображения строятся в виде серии слоев . Слои собираются один над другим. Итак, что такое слой? Проще говоря, слой — это изображение.

Допустим, мы хотим создать Docker-образ Java-приложения Hello World. Первое, о чем нам нужно подумать, это то, что нужно нашему приложению.

Для начала это Java-приложение, поэтому нам понадобится JVM. Хорошо, это кажется простым, но что нужно для запуска JVM? Ему нужна операционная система. Поэтому наш образ Docker будет иметь слой операционной системы, JVM и наше приложение Hello World .

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

Допустим, мы хотим создать базу данных, используя базу данных PostgreSQL . Нам не нужно создавать новый образ PostgreSQL с нуля. Мы просто идем в Docker Hub, ищем postgres , которое является официальным именем образа Docker для PostgresSQL, выбираем нужную нам версию и запускаем ее.

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

Используя команду docker images , мы можем просмотреть список образов, доступных в нашей файловой системе:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 11.6 d3d96b1e5d48 4 weeks ago 332MB
mongo latest 9979235fc504 6 weeks ago 364MB
rabbitmq 3-management 44c4867e4a8b 8 weeks ago 180MB
mysql 8.0.18 d435eee2caa5 2 months ago 456MB
jboss/wildfly 18.0.1.Final bfc71fe5d7d1 2 months ago 757MB
flyway/flyway 6.0.8 0c11020ffd69 3 months ago 247MB
java 8-jre e44d62cf8862 3 years ago 311MB

3. Запуск образов Docker

Образ запускается с помощью команды docker run с именем и тегом образа. Допустим, мы хотим запустить образ postgres 11.6:

docker run -d postgres:11.6

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

Используя команду docker ps , мы можем проверить, работает ли наш образ, мы должны использовать эту команду:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3376143f0991 postgres:11.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp tender_heyrovsky

Обратите внимание на ИДЕНТИФИКАТОР КОНТЕЙНЕРА в приведенном выше выводе. Давайте посмотрим, что такое контейнер и как он связан с изображением.

4. Докер-контейнеры

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

Docker определяет для контейнера семь состояний: создано , перезапущено , запущено , удалено , приостановлено , завершено и мертво . Это важно знать. Поскольку контейнер — это всего лишь экземпляр образа, его не нужно запускать.

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

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

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

5. Жизненный цикл контейнеров

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

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

docker container create <image_name>:<tag>
docker container start <container_id>

Или мы можем легко сделать это с помощью команды запуска :

docker run <image_name>:<tag>

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

docker pause <container_id>
docker unpause <container_id>

Приостановленный контейнер будет показывать статус «Приостановлено», когда мы проверяем процессы:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bef2edcad7b postgres:11.6 "docker-entrypoint.s…" 5 minutes ago Up 4 minutes (Paused) 5432/tcp tender_heyrovsky

Мы также можем остановить запущенный контейнер, а затем перезапустить его:

docker stop <container_id>
docker start <container_id>

И, наконец, мы можем удалить контейнер:

docker container rm <container_id>

Удалять можно только контейнеры в остановленном или созданном состоянии.

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

6. Заключение

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

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

Теперь, когда мы знаем основы, пришло время узнать больше об увлекательном мире Docker и начать расширять наши знания!