- Что такое Docker
- Чем отличается от VM
- Контейнер в Docker
- Преимущества и недостатки
- Чем полезен джуну
- Польза Docker в QA
- Решение проблемы тестовой инфраструктуры
- Команды
- Как Docker упрощает процессы
Что такое Docker?
Docker — технология виртуализации, переносящая приложение в легкое и быстрое окружение (контейнер). Docker — более современная технология, чем виртуальные машины (VM). Контейнеризация в Docker применяется в связке с Selenium, WebDriver и другими QA-инструментами.
Внедрение мультиконтейнерного тестирования в Docker изменило сам уклад современного QA, что касается его интеграции в CI/CD-пайплайн — все зависимости приложения «упаковываются» в изолированное окружение.

Чем отличается от VM

Технологии Docker и виртуальных машин (VM) имеют общее предназначение, но работают с операционной системой по другому. Главное отличие в том, что Docker-контейнер работает непосредственно в операционной системе, а виртуальная машина «поверх» операционной системы, что влияет на производительность.
Docker | Virtual Machine | |
---|---|---|
Операционная система | Та же ОС | Новая ОС для каждой VM |
Безопасность | Менее безопасно, поскольку операционная система та же | Более безопасно — другая операционная система |
Производительность | Быстрее работает, даже если одновременно несколько контейнеров | Возможны проблемы с производительностью |
Время загрузки | Очень быстро (несколько секунд) | Медленно (минута) |
Сколько памяти требуется | Мало | Много |
Сколько места на диске | Мегабайты | Гигабайты |
Переносимость на другую систему | Легко разворачивать в разных окружениях | Трудно перенести на другую систему |
Как видим, безопасность — единственный минус.
Docker и Kubernetes
Docker это система контейнеризации; Kubernetes — система управления контейнерами («оркестрации»); они выполняют разные задачи. При этом Docker обладает собственной системой оркестрации под названием Docker Swarm. Ее и будем сравнивать с Kubernetes:
Kubernetes | Docker Swarm | |
---|---|---|
Установка | Сложная и длительная | Быстрая и простая |
Масштабируемость | Автоматическая | Недоступна |
Создание кластеров | Простое | Сложное |
Балансировка нагрузки | Вручную | Автоматическая |
Мониторинг | Встроенными средствами | Только внешними средствами |
Jenkins и Docker
Опять же, это продукты с разным предназначением: Jenkins является системой автоматизации CI/CD-пайплайнов, в которые разработчики периодически отправляют свой код; а Docker имеет иную задачу — контейнеризацию. Связка Docker+Jenkins широко применяется в современной разработке: Jenkins «непрерывно интегрирует», а Docker изолирует рабочие окружения в контейнерах.
Контейнеры Docker
Экономят время разработчиков (и тестировщиков), устраняя проблемы с программными зависимостями.
Что такое Docker-контейнер?
Программа, инкапсулирующая программные зависимости, нужные для запуска приложения. Все конфигурации и инструкции для запуска/остановки контейнера передаются из Docker-образа. При запуске образа создается новый контейнер.
Контейнеры управляются через Docker API или из командной строки. Если созданы несколько контейнеров, ими управляют инструментом Docker Compose.

Как работает Docker
Docker состоит из 4 компонентов:
- Клиент. Главный компонент, создающий/управляющий/запускающий контейнеризованные приложения. Управляет Сервером через CLI (командную строку) в Windows и из терминала в MacOS и Linux.
- Сервер. Также называемый демоном. Ожидает запросов через REST API от Клиента и управляет Образами и Контейнерами.
- Образ. Дает указания Серверу, как создавать Контейнер. Образы загружаются из сайта (Docker Hub). Также возможно создание кастомных образов, для этого нужно создать Dockerfile и передать его на Сервер. (При этом следует учесть, что Docker не очищает неиспользованные образы, поэтому их нужно удалять самостоятельно).
- Реестр. Серверное приложение для размещения/распределения Docker-образов. Полезен для локального хранения образов и полного контроля над ними. Возможен другой способ, через Docker Hub — крупнейший репозиторий Docker-образов.

Преимущества и недостатки Docker
Преимущества
- Легкая переносимость — основное преимущество. Дает возможность создавать (и тестировать) сложные приложения на локальной машине, не беспокоясь о программных зависимостях — Docker-контейнеры вмещают в себя все что нужно приложению для функционирования
- Автоматизация работы с контейнерами при помощи cron jobs. Автоматизируются рутинные повторяемые задачи.
- Комьюнити — есть Slack-канал, форумы и тысячи контрибьюторов на StackOverflow. Кстати, на DockerHub уже более 9 миллионов образов.
Недостатки
- Скорость — хотя Docker работает явно быстрее, чем стандартная виртуальная машина, но все же медленнее, чем обычный запуск приложения на физическом сервере.
- Некоторая сложность использования — изначально Docker не создавался для приложений с графическим интерфейсом. Поэтому Docker требует освоения командной строки и работы в ней. Также крутая кривая обучения, сложности с операционными системами и частые обновления. В дальнейшем возможны сложности с оркестрацией контейнеров.
- Безопасность — так как Docker работает непосредственно в операционной системе, возможно внедрение зловредного кода в контейнеры и далее проникновение в ОС.
Чем полезен джуну
Оценка нового софта
Docker дает возможность ознакомиться с новой программой без ее установки вручную.
Научиться работать в командной строке и в Linux
Хотя Docker работает во всех ОС, он изначально создавался для Linux; и желательно далее работать в Linux, что будет весьма полезно — изучить основы администрирования системы, CLI-интерфейс, скрипты.
Снизить риски при поломке компьютера
В случае поломки компьютера его владелец может быстро существенно снизить риски потерь, если раньше сохранил Docker-образ. Надо просто импортировать бекап образа на другой компьютер, и Docker сделает все остальное. Также Docker помогает откатиться к предыдущей версии софта, если новая переполнена багами или конфликтует с чем-то.
Польза от Docker в QA на простом примере
Официальный сайт гласит, что это «платформа контейнеризации для разработчиков, на которых они могут разрабатывать, билдить, расшаривать, и запускать приложения».
А раньше такого не было?
Раньше такое было — но хуже. Чтобы наглядно убедиться в этом, нужно сделать следующее (или представить):
- Поставить Java 8 и Chrome какой-то версии, например v65, на локальный компьютер
- Написать нужные тестовые сценарии
- Скопировать сценарий и вставить для выполнения на удаленной машине
- Попробовать запустить сценарий через Jenkins
Обязательно будут какие-то ошибки. Если загуглить эту ситуацию, чаще всего это “version mismatch”.
А сейчас лучше
А сейчас можно скачать Docker и создать контейнер, в котором изолировать зависимости — создается виртуальная машина и расшаривается для других участников команды.
Как Docker решает проблему тестовой инфраструктуры в QA

Например, есть удаленная машина, на которой установлена Java 8, туда скопирован тестовый сценарий, есть jar Selenium’а, и jar TestNG. Сценарий может запрашивать на другой машине (через Grid/Selenium Hub) многочисленные версии браузеров (Chrome, Firefox), как на рисунке выше. В таких окружениях неизбежны ошибки-эксепшены из-за сложности инфраструктуры (нехватка памяти и так далее).
Что делает Docker с этой проблемой

Дает всю инфраструктуру для запуска тестов через Grid в Chrome/Firefox и т.п.
Команды Docker
- docker pull image — Загрузить образ из DockerHub
- docker images — Посмотреть все образы на своей машине
- docker ps — Посмотреть все активные контейнеры
- docker ps -a — Посмотреть все контейнеры
- docker run image — Сформировать контейнер из образа
Как видим, контейнеры дают возможность упаковать нужные элементы для приложения, не создавая отдельную виртуальную операционную систему. Это дает скорость и экономию места в тестовом окружении.
Создание контейнера в Docker

Наш grid будет состоять из 3 компонентов:
- Docker-машины с запущенным Docker Engine
- Hub
- Node-контейнеры с браузерами, подключенными к Hub
«Стандартные» контейнеры запускаются только на одинаковой с ними ОС, а Docker создает и управляет контейнерами на виртуальной машине Linux, даже если работает на Windows.
Вместо Virtual Box или Hyper-V применяется нативный Windows-гипервизор (оболочка) для управления виртуальной машиной Linux. При запуске Hyper-V-менеджера будет видна работающая виртуальная машина Linux. Эта виртуальная машина запускает демон Docker, который управляет контейнерами.
Появится надпись “Mobi Linux” при запуске Docker Linux-демона, если установить Docker для Windows и запустить его. И наоборот, Windows-контейнер может быть запущен в виртуальной машине Windows в операционных системах Linux/macOS.
Как Docker упрощает жизнь тестировщику
Не нужно писать специальные скрипты, вручную деплоить билд, настраивать окружение и инструменты на нескольких виртуальных машинах
Если не использовать Docker, придется писать скрипты или вручную настраивать несколько виртуальных машин. Например придется ставить и настраивать Java, Ruby, Python, RSpec, Maven, Selenium, и браузеры, и + еще инструменты автоматизации. Зависимости от платформ, сложности со скриптами, проблемы с настройкой — в целом все долго и ненадежно.
Лучше создать Docker-образ со всеми зависимостями, чтобы упаковать все инструменты и зависимости в контейнер и без проблем запускать любой код. Нет необходимости выделять какое-то количество памяти для контейнера — Docker дает прозрачное и экономное тестовое окружение.
Надежное окружение делает доставку практичнее
Можно сливать код новых функций, как только разработчики передали его в feature-ветку, и успешно выполнены автотесты. Состояние билда оценивается повторным запуском автотестов. Код готов к передаче в продакшен-окружение. Не очень удобно полагаться на CI-инструменты и продолжать не имея достаточного тестового покрытия, после релиза проявятся дефекты. На всем протяжении цикла разработки контейнеры Docker обеспечивают надежное окружения для деплоя.
Контейнеры сокращают количество внешних переменных окружения
Так как многие зависимости и конфигурационные данные можно упаковать в контейнер, снижается количество переменных окружения. Непрерывная интеграция (и непрерывное тестирование) становятся еще более непрерывными, что гарантирует — приложение будет одинаково себя вести и в тестовом окружении, и в проде.
Docker позволяет запускать тесты в разных контейнерах и изолированных окружениях параллельно на Windows- и Linux-машинах. Можно повторно использовать старый контейнер при обновлении кода приложения; всегда можно создать новый контейнер.
Приложение работает одинаково на проде и в тестовом окружении, потому что окружение стабильное.
Гибкость и простота обслуживания
Поскольку все контейнеры работают изолированно, проще обслуживать тесты и окружение. Даже если и случится ошибка в контейнерах, другие контейнеры она не затронет.
Всегда можно создать контейнер при выполнении тестов. Запуск нового приложения или тест-сьюта в новом контейнере очень простой.
Лучшее эффективность, быстрее доставка, экономия ресурсов
Контейнеризация в Docker совершенствует SDLC-цикл, делает его эффективнее и быстрее, что выгодно всем. Автоматизация сейчас — основная вещь в QA, и Docker, устраняющий зависимость от инфраструктуры, очень удобен и применяется уже повсюду. Поэтому скилл «Docker» обязателен для тестировщика-автоматизатора.
***