Перейти к содержанию

Разница между Docker, Dockerfile и Docker Compose

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

В этой статье поговорим о разнице между Docker, Dockerfile и Docker Compose.

Docker

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

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

Есть несколько ключевых компонентов, из которых состоит Docker:

  • Daemon: демон Docker прослушивает запросы Docker API и управляет такими объектами, как изображения и контейнеры;
  • Client: клиент Docker – это основной интерфейс для выдачи команд демону.
  • Desktop: рабочий стол Docker – это специализированная версия Docker для Mac и Windows, которая упрощает взаимодействие с демоном.
  • Кроме того, есть несколько объектов Docker, с которыми нужно познакомиться:
  • Image: образ – это автономный файл, который включает в себя все файлы, необходимые для запуска приложения (включая операционную систему и код приложения). У образа есть слои, каждый слой содержит один или несколько наборов файлов и каталогов.
  • Container: контейнер – это исполняемый экземпляр образа. Контейнеры обычно изолированы друг от друга, хотя тома и сети могут позволять им взаимодействовать.
  • Registry: в реестре хранятся образы. Он может быть приватным или общедоступным и при необходимости требует аутентификации.
  • Volume: том – это файловая система, которая может быть доступна для одного или нескольких контейнеров. Тома могут быть постоянными или эфемерными (действующими только до тех пор, пока активен контейнер).
  • Networks. Сети позволяют контейнерам обмениваться данными с использованием стандартных сетевых протоколов (TCP/IP).

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

Dockerfile

Dockerfile – это обычный текстовый файл, содержащий инструкции по созданию образов Docker. Они следуют стандарту Dockerfile, и демон Docker в конечном итоге отвечает за выполнение Dockerfile и создание образа.

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

Оттуда Dockerfile может выполнять различные операции по созданию образа:

  • копировать файлы из хост-системы в контейнер (например, можно захотеть скопировать JAR-файл, содержащий код приложения);
  • запускать произвольные команды относительно образа (например, может понадобиться запустить типичные команды Unix для изменения прав доступа к файлам или установки новых пакетов с помощью диспетчера пакетов);
  • определять команду, которая должна выполняться при создании контейнера (например, java-команда, загружающая JAR-файл и запускающая нужный метод main).

Посмотрим на пример Dockerfile:

FROM openjdk:17-alpine
ARG JAR_FILE=target/my-app.jar
COPY ${JAR_FILE} my-app.jar
ENTRYPOINT ["java","-jar","/my-app.jar"]

В этом примере создается образ Docker на основе существующего образа OpenJDK 17 Alpine. Затем он копирует скомпилированный файл JAR в образ и определяет команду запуска как команду java с параметром -jar вместе с скомпилированным файлом JAR.

Стоит отметить, что Dockerfile – это всего лишь один из способов создания образов Docker. Другие инструменты, такие как Buildpacks, могут помочь автоматизировать процесс компиляции кода в образы Docker без использования Dockerfiles.

Docker Compose

Docker Compose – это инструмент для определения и запуска многоконтейнерных приложений Docker. Используя файл конфигурации YAML, Docker Compose позволяет настроить несколько контейнеров в одном месте. Затем можно запускать и останавливать все эти контейнеры одновременно с помощью одной команды.

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

Напишем простой файл Docker Compose:

version: "3.9"
services:
  database:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
  web:
    image: my-application:latest
    ports:
      - "80:5000"
volumes:
  db_data: {}

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

Dockerfiles и Docker Compose не исключают друг друга. На самом деле, они неплохо работают вместе. Docker Compose предоставляет директиву сборки, которую можно использовать для сборки файлов Dockerfile перед запуском контейнера.

Наконец, имейте в виду, что Docker Compose – это всего лишь один инструмент для организации нескольких контейнеров. Другие варианты включают Kubernetes, Openshift и Apache Mesos.

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

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

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

Оригинал