Что делал с Docker в последнем проекте?

«Что делал с Docker в последнем проекте?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В последнем проекте на основе микросервисной архитектуры Docker был ключевым инструментом. Мои основные задачи:

1. Разработка и оптимизация Dockerfile:

  • Создавал многоступенчатые сборки (multi-stage builds) для радикального уменьшения итогового образа (с ~1.2 ГБ до ~150 МБ для Python-сервиса).
  • Практиковал лучшие подходы: объединение команд RUN, использование .dockerignore, выбор минимальных базовых образов (alpine, -slim).
  • Добавлял HEALTHCHECK инструкции для интеграции с оркестраторами.

Пример оптимизированного Dockerfile для Go-сервиса:

# Stage 1: Build
FROM golang:1.20-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 main ./cmd/api

# Stage 2: Run
FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /root/
COPY --from=builder /app/main .
COPY --from=builder /app/configs ./configs
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 
  CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
CMD ["./main"]

2. Оркестрация для локальной разработки:

  • Составлял docker-compose.yml файлы, которые поднимали весь стек приложения (5-7 сервисов, PostgreSQL, Redis, RabbitMQ) одной командой.
  • Настраивал volumes для hot-reload кода и сетевые алиасы для межсервисного взаимодействия.

3. Интеграция в CI/CD:

  • Настраивал пайплайн в GitLab CI, который для каждого merge request в основную ветку:
    • Собирал Docker-образ.
    • Запускал внутри контейнера юнит- и интеграционные тесты.
    • Проходил сканирование уязвимостей (Trivy).
    • При успехе — пушил образ с тегом, соответствующим хешу коммита, в приватный Container Registry (Harbor).

4. Управление образами и безопасность:

  • Внедрил политику тегирования (latest, v1.2.3, commit-sha).
  • Настраивал сканирование образов на наличие уязвимостей (CVE) на этапе CI и в registry.
  • Устанавливал лимиты на использование CPU и памяти (--cpus, --memory) для предотвращения исчерпания ресурсов хоста.