Основы 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-платформой.
Практическое упражнение
- Запустите контейнер PostgreSQL и подключитесь к нему с помощью
psql(черезdocker exec) - Создайте
docker-compose.test.ymlс приложением, базой данных и Redis - Запустите окружение, выполните тесты и остановите его
- Намеренно сломайте один сервис и используйте
docker logsдля диагностики проблемы - Проверьте использование дискового пространства Docker на вашей машине и очистите неиспользуемые ресурсы
- Добавьте healthcheck к сервису базы данных и проверьте его работу с помощью
docker compose ps