Какие контейнеры писал?

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

Ответ

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

1. Бэкенд-сервисы (Go, Python, Java):

  • Для Go-сервисов использовал многоэтапную сборку, чтобы итоговый образ содержал только бинарный файл на scratch или alpine.
  • Для Python-приложений фиксировал зависимости через pip freeze и использовал отдельный слой для установки requirements.txt, чтобы ускорить пересборку.
    
    # Пример для Python-сервиса на FastAPI
    FROM python:3.11-slim as builder
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install --user -r requirements.txt

FROM python:3.11-slim WORKDIR /app COPY --from=builder /root/.local /root/.local COPY . . ENV PATH=/root/.local/bin:$PATH USER nobody CMD ["gunicorn", "main:app", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:8000"]



**2. Инфраструктурные образы:**
*   **Базы данных:** Кастомизировал официальные образы PostgreSQL и Redis, добавляя свои конфигурационные файлы, скрипты инициализации и настройки аутентификации.
*   **Nginx:** Создавал образы с предустановленными конфигами для реверс-прокси, SSL-терминации и статики, используя переменные окружения для настройки.

**3. Инструменты CI/CD и утилиты:**
*   Образы с установленными `kubectl`, `helm`, `terraform` и `aws-cli` для пайплайнов деплоя.
*   Образы для запуска тестов (`pytest`, `jest`) и линтеров в GitLab CI.

**Ключевые практики, которые я применяю:**
*   Использую `.dockerignore`, чтобы не копировать в образ ненужные файлы (`.git`, `__pycache__`).
*   Запускаю процессы от непривилегированного пользователя (не `root`).
*   Добавляю `HEALTHCHECK` для мониторинга состояния сервиса.
*   Всегда указываю точную версию базового тега (`python:3.11-slim`, а не `python:latest`).