По мере того, как все больше и больше приложений переходят на облачные вычисления, терминология иногда может сбивать с толку.
В этой статье поговорим о разнице между 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. Хотя все эти технологии связаны между собой, каждая из них относится к отдельным частям более крупной технологической экосистемы.
Понимание каждой из этих частей и ролей, которые они играют, поможет принимать более обоснованные решения при работе с платформами облачных вычислений.