Ответ
В последнем проекте на основе микросервисной архитектуры 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) для предотвращения исчерпания ресурсов хоста.