> Для чего используется Docker (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Моторика

Стек: Go

> Пример ответа

Короткий ответ

Docker используется для упаковки приложения и его зависимостей в изолированный образ, который одинаково запускается на любой машине с Docker. В backend на Go это даёт воспроизводимые сборки, изоляцию процессов, удобное развёртывание и масштабирование. Docker не заменяет виртуальные машины полностью, а решает задачу доставки и запуска артефактов.

Подробное объяснение

Docker - это платформа контейнеризации, основанная на возможностях ядра Linux: namespaces для изоляции процессов, сетей и файловых систем, cgroups для ограничения ресурсов. Образ собирается по Dockerfile и состоит из слоёв, что ускоряет повторные сборки за счёт кеша. Контейнер - это запущенный экземпляр образа с собственным filesystem, network namespace и лимитами.

Для backend на Go ключевое преимущество в том, что Go компилируется в статический бинарник. Это позволяет делать минимальные образы на базе scratch или distroless, без полноценной ОС внутри. Такой образ весит десятки мегабайт, быстрее стартует и имеет меньшую поверхность атаки.

Docker решает несколько задач одновременно: воспроизводимость окружения, изоляция зависимостей между сервисами, единый артефакт для dev, staging и prod, а также основа для оркестрации в Kubernetes. При этом Docker не является системой оркестрации и не управляет отказоустойчивостью кластера - это задача Kubernetes, Nomad или ECS.

На практике

В типичном Go-проекте используют multi-stage build. На первом этапе берут golang-образ, собирают бинарник с флагами CGO_ENABLED=0 и -ldflags для уменьшения размера. На втором этапе копируют бинарник в scratch или distroless и задают ENTRYPOINT. Это даёт образ размером 10-20 МБ.

Для локальной разработки часто применяют docker compose, чтобы поднять приложение вместе с Postgres, Redis и другими зависимостями. В production образ публикуют в registry и запускают в Kubernetes, где Docker-образ становится единицей деплоя. Важно правильно настроить healthcheck, non-root пользователя и передачу конфигурации через переменные окружения.

Пример кода

FROM golang:1.22-alpine AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/server ./cmd/server

FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /app/server /server
USER nonroot:nonroot
EXPOSE 8080
ENTRYPOINT ["/server"]

Как отвечать на собеседовании

Стоит начать с одной фразы про упаковку и воспроизводимость, затем коротко объяснить механику namespaces и cgroups. Далее показать, что понимаешь специфику Go: статический бинарник, multi-stage build, минимальные образы. В конце упомянуть trade-off: Docker не оркестратор, а runtime-уровень, и в production его обычно дополняют Kubernetes.

Что проверяет интервьюер

Понимание разницы между образом и контейнером, между Docker и виртуальной машиной. Умение собирать эффективные образы для Go, знание multi-stage build и distroless. Понимание места Docker в цепочке CI/CD и оркестрации. Способность объяснить trade-off между удобством и накладными расходами.

Типичные ошибки

Путать Docker с виртуальной машиной и говорить, что внутри контейнера полноценная ОС. Собирать Go-приложение в одном stage и тащить в production весь toolchain. Запускать контейнер от root без необходимости. Хранить секреты в образе вместо переменных окружения или secret-менеджера. Считать, что Docker сам обеспечивает отказоустойчивость и масштабирование.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью