Расскажи про свой опыт работы с Docker

«Расскажи про свой опыт работы с Docker» — вопрос из категории DevOps, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я использовал Docker для создания воспроизводимых окружений сборки и тестирования для C++ проектов, что особенно важно при работе с разными версиями компиляторов и библиотек.

Основные задачи:

  1. Сборка: Создание Docker-образов с фиксированным набором инструментов (GCC, Clang, CMake, Conan) для гарантии идентичной сборки на любом хосте.
  2. Тестирование: Запуск юнит-тестов и интеграционных тестов в изолированных контейнерах.
  3. Развертывание: Упаковка готового приложения в минималистичный образ на базе alpine или distroless для деплоя.

Пример многоступенчатого (multi-stage) Dockerfile для C++:

# Стадия сборки
FROM gcc:12 as builder
WORKDIR /src
COPY . .
RUN mkdir build && cd build && 
    cmake -DCMAKE_BUILD_TYPE=Release .. && 
    cmake --build . --target my_app

# Финальная стадия с минимальным образом
FROM debian:11-slim
WORKDIR /app
# Копируем только нужные бинарники и библиотеки
COPY --from=builder /src/build/bin/my_app .
# Устанавливаем только необходимые runtime-зависимости
RUN apt-get update && apt-get install -y 
    libstdc++6 
    && rm -rf /var/lib/apt/lists/*

CMD ["./my_app"]

Интеграция с CI/CD: Настраивал запуск этих контейнеров в пайплайнах GitLab CI/CD, использовал Docker Compose для оркестрации сервисов в интеграционных тестах (например, приложение + база данных). Также работал с оптимизацией слоев образа и управлением Docker-реестрами (например, GitLab Container Registry).

Видео-ответы