Modern QA2026Основы Docker для QA
Join

Course19 Linux & Command Line

Foundations · Chapter 19

Основы Docker для QA

Updated Jul 2026

Почему Docker важен для QA

Тестовые окружения всё чаще контейнеризируются. Docker обеспечивает изолированные, воспроизводимые окружения, которые работают одинаково на вашем ноутбуке, в CI и на машине коллеги. Базовые навыки Docker обязательны для современной QA-работы.

Ключевые концепции

Концепция Что это Аналогия
Image Шаблон для контейнера (только чтение) Определение класса
Container Запущенный экземпляр образа Объект, созданный из класса
Dockerfile Инструкции для сборки образа Рецепт
Volume Постоянное хранилище, сохраняющееся после удаления контейнера Внешний жёсткий диск
Network Виртуальная сеть, соединяющая контейнеры Локальный сетевой коммутатор
Registry Репозиторий для образов (Docker Hub, ECR, GCR) npm registry для пакетов

Запуск контейнеров

Базовые команды

# Запустить контейнер (скачать образ, если его нет локально, запустить, присоединить)
docker run -d --name test-db \
  -e POSTGRES_PASSWORD=testpass \
  -e POSTGRES_DB=test_db \
  -p 5432:5432 \
  postgres:16

# Расшифровка флагов:
# -d              Запуск в фоне (отсоединённый)
# --name test-db  Присвоить осмысленное имя
# -e KEY=VALUE    Установить переменные окружения
# -p 5432:5432    Проброс порта хоста на порт контейнера (хост:контейнер)
# postgres:16     Имя и тег образа

Управление контейнерами

# Список запущенных контейнеров
docker ps

# Список всех контейнеров (включая остановленные)
docker ps -a

# Остановить контейнер
docker stop test-db

# Запустить остановленный контейнер
docker start test-db

# Перезапустить контейнер
docker restart test-db

# Удалить остановленный контейнер
docker rm test-db

# Остановить и удалить одной командой
docker stop test-db && docker rm test-db

# Удалить все остановленные контейнеры
docker container prune

Просмотр логов

# Просмотр всех логов контейнера
docker logs test-db

# Последние 50 строк
docker logs test-db --tail 50

# Отслеживание логов в реальном времени (как tail -f)
docker logs test-db --follow

# Логи с временными метками
docker logs test-db --timestamps

# Комбинация: последние 50 строк + отслеживание
docker logs test-db --tail 50 --follow

Выполнение команд в контейнерах

# Открыть интерактивную оболочку в запущенном контейнере
docker exec -it test-db bash

# Выполнить конкретную команду
docker exec test-db psql -U postgres -d test_db -c "SELECT count(*) FROM users;"

# Выполнить команду в запущенном контейнере (неинтерактивно)
docker exec test-db pg_isready

Типичные QA-контейнеры

Контейнеры баз данных

# PostgreSQL
docker run -d --name test-postgres \
  -e POSTGRES_PASSWORD=testpass \
  -e POSTGRES_DB=test_db \
  -p 5432:5432 \
  postgres:16

# MySQL
docker run -d --name test-mysql \
  -e MYSQL_ROOT_PASSWORD=testpass \
  -e MYSQL_DATABASE=test_db \
  -p 3306:3306 \
  mysql:8

# Redis
docker run -d --name test-redis \
  -p 6379:6379 \
  redis:7

# MongoDB
docker run -d --name test-mongo \
  -e MONGO_INITDB_ROOT_USERNAME=admin \
  -e MONGO_INITDB_ROOT_PASSWORD=testpass \
  -p 27017:27017 \
  mongo:7

Сервисные контейнеры

# Mailpit (тестирование email -- перехватывает все исходящие письма)
docker run -d --name test-mail \
  -p 1025:1025 \
  -p 8025:8025 \
  axllent/mailpit

# WireMock (мокирование API)
docker run -d --name test-wiremock \
  -p 8080:8080 \
  wiremock/wiremock:latest

# Selenium Grid (тестирование в браузерах)
docker run -d --name selenium-hub \
  -p 4442-4444:4442-4444 \
  selenium/hub:latest

Docker Compose для тестовых окружений

Docker Compose позволяет описывать многоконтейнерные окружения в YAML-файле. Это стандартный способ управления тестовыми окружениями, требующими нескольких сервисов.

Пример: docker-compose.test.yml

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: test
      DATABASE_URL: postgres://postgres:testpass@db:5432/test_db
      REDIS_URL: redis://cache:6379
      MAIL_HOST: mail
      MAIL_PORT: 1025
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started

  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: testpass
      POSTGRES_DB: test_db
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  cache:
    image: redis:7
    ports:
      - "6379:6379"

  mail:
    image: axllent/mailpit
    ports:
      - "1025:1025"
      - "8025:8025"

Команды Compose

# Запустить все сервисы
docker compose -f docker-compose.test.yml up -d

# Просмотр логов всех сервисов
docker compose -f docker-compose.test.yml logs -f

# Просмотр логов конкретного сервиса
docker compose -f docker-compose.test.yml logs -f app

# Запуск тестов против окружения
npm run test:integration

# Остановить и удалить всё (включая тома)
docker compose -f docker-compose.test.yml down -v

# Пересобрать после изменений кода
docker compose -f docker-compose.test.yml up -d --build

Полный тестовый цикл с Compose

# Тестовый цикл одной командой
docker compose -f docker-compose.test.yml up -d && \
  npm run test:integration ; \
  docker compose -f docker-compose.test.yml down -v

Точка с запятой (;) перед down гарантирует, что очистка произойдёт даже при сбое тестов.

Решение проблем Docker для QA

Типичные проблемы

Проблема Диагностика Решение
Контейнер не запускается docker logs <container> Проверьте сообщения об ошибках в логах
Порт уже занят lsof -i :<port> Остановите конфликтующий процесс или используйте другой порт
Контейнер работает, но приложение не подключается docker network inspect Убедитесь, что контейнеры в одной сети
"No space left on device" docker system df Выполните docker system prune для очистки
Тесты падают с connection refused Проверьте depends_on и healthchecks Добавьте healthcheck; дождитесь готовности сервиса

Команды очистки

# Показать использование диска Docker
docker system df

# Удалить все неиспользуемые данные (остановленные контейнеры, висячие образы, неиспользуемые сети)
docker system prune

# Удалить все неиспользуемые данные, включая неиспользуемые образы (более агрессивно)
docker system prune -a

# Удалить конкретные типы
docker container prune    # Остановленные контейнеры
docker image prune       # Висячие образы
docker volume prune      # Неиспользуемые тома
docker network prune     # Неиспользуемые сети

Docker в CI/CD

Большинство CI-платформ поддерживают Docker нативно. GitHub Actions использует ключевое слово services для запуска Docker-контейнеров рядом с вашими тестами:

services:
  postgres:
    image: postgres:16
    env:
      POSTGRES_PASSWORD: testpass
    ports:
      - 5432:5432
    options: >-
      --health-cmd pg_isready
      --health-interval 10s
      --health-timeout 5s
      --health-retries 5

Это эквивалентно запуску docker run с теми же параметрами, но управляется CI-платформой.

Практическое упражнение

  1. Запустите контейнер PostgreSQL и подключитесь к нему с помощью psql (через docker exec)
  2. Создайте docker-compose.test.yml с приложением, базой данных и Redis
  3. Запустите окружение, выполните тесты и остановите его
  4. Намеренно сломайте один сервис и используйте docker logs для диагностики проблемы
  5. Проверьте использование дискового пространства Docker на вашей машине и очистите неиспользуемые ресурсы
  6. Добавьте healthcheck к сервису базы данных и проверьте его работу с помощью docker compose ps