1. Введение
По мере того, как все больше и больше приложений переходят на облачные вычисления, терминология иногда может сбивать с толку.
В этой статье мы поговорим о разнице между Docker, Dockerfile и Docker Compose .
2. Докер
Начнем с Docker, одного из основных компонентов любой платформы облачных вычислений. Docker — это механизм контейнеров, который позволяет нам эффективно и безопасно отделять наши приложения от инфраструктуры, в которой они работают.
Что это означает? Docker позволяет нам запускать любое приложение в виртуализированной среде , используя практически любое оборудование или операционную систему, которую мы захотим. Это означает, что мы можем использовать одну и ту же среду для наших приложений при разработке, тестировании и производстве.
Есть несколько ключевых компонентов, из которых состоит Docker:
- Демон: демон Docker прослушивает запросы Docker API и управляет такими объектами, как изображения и контейнеры.
- Клиент: клиент Docker — это основной интерфейс для выдачи команд демону.
- Рабочий стол: рабочий стол Docker — это специализированная версия Docker для Mac и Windows, которая упрощает взаимодействие с демоном.
Кроме того, есть несколько объектов Docker, с которыми мы должны быть знакомы:
- Образ: образ — это автономный файл, который включает в себя все файлы, необходимые для запуска приложения (включая операционную систему и код приложения). У изображений есть слои, и каждый слой содержит один или несколько наборов файлов и каталогов.
- Контейнер: Контейнер — это исполняемый экземпляр образа. Контейнеры обычно изолированы друг от друга, хотя тома и сети могут позволять им взаимодействовать.
- Реестр: в реестре хранятся изображения. Он может быть частным или общедоступным и при необходимости требует аутентификации.
- Том: Том — это файловая система, которая может быть доступна для одного или нескольких контейнеров. Тома могут быть постоянными или эфемерными (действующими только до тех пор, пока активен контейнер).
- Сети. Сети позволяют контейнерам обмениваться данными с использованием стандартных сетевых протоколов (TCP/IP).
Теперь, когда мы понимаем основные концепции самого Docker, мы можем взглянуть на две другие технологии, которые напрямую связаны с ним.
3. Докерфайл
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.
4. Докер-композитор
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. Хотя все эти технологии связаны между собой, каждая из них относится к отдельным частям более крупной технологической экосистемы .
Понимание каждой из этих частей и ролей, которые они играют, может помочь нам принимать более обоснованные решения при работе с платформами облачных вычислений.