неділя, 14 лютого 2016 р.

Власне тестове середовище на docker


Для чого тестеру може знадобитися свій інвайронмент, якщо можна просто почекати, доки код виллють на тестовий сервер?

Мені це питання задають постійно. І відповідь, як завжди, залежить від контексту.

Щось ризиковане треба перевірити у середовищі, яке не шкода; для чогось потрібні особливі налаштування, недоступні на тестовому сервері; а хтось, як я, хоче тестити ще у девелоперській гілці, бо не може дочекатися, доки новий код нарешті дорев’ювлять і замерджать в develop.




В епоху віртуальних машин існує кілька загальних інструментів, що дозволяють запустити собі власне тестове середовище, та заразом вижерти зайву оперативку та довантажити процесор вашого комп’ютера до "прийнятних" 104%.

Як розгорнути два зв’язаних docker-контейнера: веб-сервер із Вашим проектом та базу, подивимось на прикладі PHP та MySQL.


Локально у мене Ubuntu 15.04. За інструкціями із встановлення docker на інших системах звертайтеся до http://docs.docker.com/engine/installation/

Для початку, треба поставити docker-engine. Він є у стандартних репах, але якщо щось не виходить - уважно читайте інструкції.
$ sudo apt-get install docker-engine

Для ще більшої гнучкості (бо у 21 столітті ніколи не буває забагато гнучкості), ставимо docker-compose - додаток для документованого керування кількома віртуалками. Він ставиться через менеджер пакетів для Python'а - pip:
$ sudo pip install docker-compose

Структура 

 

Готові файли на гітхабі https://github.com/oburdin/docker4webtesting/tree/myproject
 
Уся структура тек та файлів для прикладу:
.
├── docker-compose.yml
├── drupal8
│ └── Dockerfile
├── myproject
│ └── index.html
└── mysql
└── Dockerfile 


Зміст docker-compose.yml (усі налаштування обох контейнерів перенесено у цей єдиний файл):
web:
build: ./drupal8
hostname: drupal8ready
environment:
- TERM=xterm  # to enable nano editor
ports:
- "8000:80"  # host port : container's port
links:
- db
volumes:
- ./myproject:/var/www/html  # host folder : container's folder
   
db:
build: ./mysql
environment:
- MYSQL_ROOT_PASSWORD=mysqlrootverysecretpassword
- MYSQL_USER=mruser
- MYSQL_PASSWORD=mruserpass
- MYSQL_DATABASE=drupal


Зміст Dockerfile'у з Drupal8 взято із побудови оригінального образу тут, видаливши лише останній крок із завантаженням самого друпалу, бо ми будемо використовувати свій власний проект:
# Dockerfile from https://github.com/docker-library/drupal/blob/58c575506a269f099b5578b76249101763e31ae7/8/Dockerfile
# Drupal-8-Ready!
# from https://www.drupal.org/requirements/php#drupalversions
FROM php:5.6-apache
RUN a2enmod rewrite
# install the PHP extensions we need
RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev libpq-dev \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
&& docker-php-ext-install gd mbstring opcache pdo pdo_mysql pdo_pgsql zip
# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN { \
echo 'opcache.memory_consumption=128'; \
echo 'opcache.interned_strings_buffer=8'; \
echo 'opcache.max_accelerated_files=4000'; \
echo 'opcache.revalidate_freq=60'; \
echo 'opcache.fast_shutdown=1'; \
echo 'opcache.enable_cli=1'; \
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
WORKDIR /var/www/html

Для контейнера із mysql зміст елеґантно мізерний адже усі налаштування робитиме docker-compose (оригінальний образ із поясненнями):
FROM mysql:5

 

 Запускаємо


Переконайтеся, що демон докера працює, чи запустіть його самі:
$ sudo docker daemon

Тепер у теці із docker-compose.yml збираємо наш образ:
$ sudo docker-compose build

Тут усе має завантажуватись-виконуватись, виглядає магічно і приголомшливо.
Дуже говірка команда, пише в консоль усе, що треба, і що не треба. Якщо щось потім іде не так, шукати помилку важкенько у тому потоці непотребу.
Повторний запуск не буде усе завантажувати, якщо ви не змінюєте docker-файли. Якщо не було змін, безпосередньо рядок при збірці не виконується, а його результат береться із кеша.

Запуск:
$ sudo docker-compose up

 

Робота 

 

Відповідно до наших налаштувань у docker-compose.yml , наш веб-контейнер має бути доступним у браузері за адресою: http://localhost:8000
 
За цим URL'ом веб-сервер web контейнера має видає зміст файлу myproject/index.html 



Якщо ви покладете в цю теку свій проект, або замаунтете іншу локальну теку через docker-compose.yml - він має відкритись!

(Перевірено на Drupal 8 та Magento 1.12)

Happy dockerizing! 

 

Наступним кроком має бути зручне керування базами даних. Але що таке "зручне", я ще не вигадав :-)

Немає коментарів: