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

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

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

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

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