Ответ
Docker — это открытая платформа для разработки, доставки и запуска приложений в изолированных окружениях, называемых контейнерами.
Контейнеры легковесны, так как они используют ядро хостовой операционной системы, но при этом изолируют приложение, его зависимости и конфигурацию от основной системы и других контейнеров.
Ключевые компоненты экосистемы Docker:
- Dockerfile: Текстовый файл с инструкциями по сборке образа (например, какую базовую систему использовать, какие файлы копировать, какие команды выполнять).
- Image (Образ): Шаблон только для чтения, из которого создаются контейнеры. Содержит приложение и все необходимое для его работы.
- Container (Контейнер): Запущенный экземпляр образа. Это изолированный процесс в системе.
- Registry (Реестр): Хранилище образов, например, Docker Hub. Позволяет делиться образами и использовать их.
Пример Dockerfile для Go-приложения (Multi-stage build):
Многоэтапная сборка — это лучшая практика для Go, позволяющая создавать минималистичные и безопасные конечные образы.
# --- Этап 1: Сборка ---
# Используем полный образ Go для компиляции приложения
FROM golang:1.21-alpine AS builder
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем файлы для управления зависимостями и загружаем их
COPY go.mod go.sum ./
RUN go mod download
# Копируем исходный код
COPY . .
# Собираем статически скомпилированный бинарный файл
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o myapp .
# --- Этап 2: Финальный образ ---
# Используем минимальный базовый образ без лишних зависимостей
FROM alpine:latest
WORKDIR /root/
# Копируем только скомпилированный бинарник из этапа сборки
COPY --from=builder /app/myapp .
# Указываем команду для запуска приложения
CMD ["./myapp"]
Преимущества такого подхода:
- Малый размер: Финальный образ содержит только бинарник и минимальные системные библиотеки (в данном случае, из
alpine
), а не весь Go toolchain. - Безопасность: Меньше компонентов в образе — меньше потенциальных уязвимостей.
Docker упрощает развертывание, обеспечивает идентичность окружений (dev, test, prod) и является основой для современных CI/CD и систем оркестрации, таких как Kubernetes.