> Для чего используется 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 сам обеспечивает отказоустойчивость и масштабирование.
> Похожие задачи по Go
Что такое DNS и для чего он нужен
Какую зарплату вы ожидаете
Какие принципы построения REST API существуют?
Что такое синхронное программирование?
> Похожие задачи по backend
Что такое DNS и для чего он нужен
Какую зарплату вы ожидаете
Какие принципы построения REST API существуют?
Что такое синхронное программирование?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью