Вы находитесь на странице: 1из 17

Про себя:

Работаю в Electric Cloud. Большую часть времени занимаюсь


тестированием и автоматизацией тестирования новых, а так
же хорошо известных технологий с которыми наша компания
интегрируется.

Будут вопросы, пишите - ​https://www.linkedin.com/in/arthur-pilyuk-1ab24a55/


Перед началом работы
1. можно поднять виртуалку с Ubuntu 14.04 в VirtualBox.
2. пока буду рассказывать теорию, можно найти раздел “Установка” и
начать пошагово ставить необходимый софт.
CI
Какую проблему решает Docker?

1. быстрое разворачивание окружения


2. ресурсы хост машины используются по минимуму
3. абстрагирование хост-системы от контейнеризованных приложений
Что такое Docker?

Docker представляет собой систему управления контейнерами. Он позволяет «упаковать»


приложение или веб-сайт со всем его окружением и зависимостями в контейнер, которым
в дальнейшем можно легко и просто управлять: переносить на другой сервер,
масштабировать, обновлять.

Выполните эти две команды что бы в два счета поднять CMS Wordpress:

docker run --name wp-mysql -e MYSQL_ROOT_PASSWORD=wpmsqlpsswd -d mysql:5.7

docker run --name my-wordpress --link wp-mysql:mysql -d -p 80:80 wordpress

Использованные опции:

1. --name ​wp-mysql - имя контейнера, которое он получит вместо идентификатора;


2. -e ​MYSQL_ROOT_PASSWORD=wpmsqlpsswd - проброс переменной окружения;
3. -d​- “демонизирует” контейнер, то еcть просто отключает Docker от STDOUT
виртуального окружения и позволяет ему работать в фоне;
4. -p ​80:80 - проброс порта что бы мы могли видеть работу wordpress в нашем
браузере.
5. --link​- эта опция настраивает сетевое взаимодействие между контейнерами.
Подробнее ​тут​. Для тех, кому очень любопытно, выполните команду ниже и вы
увидете, что так же благодаря ‘link’ были переданы переменные окружения,
которые софт(wordpress) использует при запуске что бы подключиться к БД и
прочие дейтвия.

docker run --name my-wordpress2 --link wp-mysql:mysql -p 80:80 wordpress env

Хороший источник​- ​https://github.com/wsargent/docker-cheat-sheet

После этого откройте в браузере страницу ​http://localhost​приступите к настройке CMS!

Docker - молодой продукт (2013 год). Изначально он работал только с Linux-системами,


однако на данный момент его можно использовать также в Windows и macOS. Несмотря
на то, что проект является относительно новым, он уже широко используется многими
специалистами и продолжает завоевывать популярность.
Важной частью экосистемы Docker является ​Docker Hub - открытый репозиторий образов
контейнеров. В нём можно найти десятки готовых приложений от официальных
разработчиков. Среди них - nginx, MySQL, Apache, Gitlab, Redmine, Elasticsearch, Jenkins
и другие.

Основные части Docker

● образ (image) – шаблон, который используется для создания контейнеров.


Представляет собой слепок файловой системы, в котором расположен код
приложения и его окружение;
● реестр (registry) – репозиторий образов. Docker Hub, о котором шла речь выше, -
это публичный репозиторий, где хранится огромное количество образов;
● контейнер (container) – запущенное приложение, т.е. совокупность процессов и
образа.

Больше информации можно получить на официальном сайте ​Docker​.


Установка программ
1) Docker -

curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -

apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

sudo add-apt-repository
\ "deb https://apt.dockerproject.org/repo/
\ ubuntu-$(lsb_release -cs)
\ main"

sudo apt-get update

sudo apt-get -y install docker-engine

источник - ​https://docs.docker.com/engine/installation/linux/ubuntu/

2) Jenkins

wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key


add -

sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ >


/etc/apt/sources.list.d/jenkins.list'

sudo apt-get update

sudo apt-get install jenkins

Источник - ​https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu

3) Maven 2

sudo apt-get install maven2

4) Git

sudo apt-get install git


Облегчаем свою работу используя
готовые образы.

Мы уже убедились, что поднять тестовое окружение из готового образа очень


просто. Осталось убедиться, что и для наших повседневных нужд есть готовые
образы, а так же каким образом они конфигурируются (Dockerfile).

Попробуем решить популярную задачу - запустить пару селениум тестов


1. ище образ на ​Docker Hub
2. выбираем контейнер с ​selenium hub
3. запускаем контейнер с Selenium hub

sudo docker run -d -P --name selenium-hub -e GRID_TIMEOUT=10000


selenium/hub

4. запускаем кнтейнер с firefox

sudo docker run -d --link selenium-hub:hub selenium/node-firefox

5. качаем тесты с github

https://github.com/archick12/simple_selenium_for_docker_webinar.git

6. открываем проект в Idea и запускаем AppTestRemoteDriver.java


Готовим свой образ

Прежде чем приготовить свой образ, нам будет полезно понять жизненный цикл
контейнера и как устроено хранение данных.

Схема того, как готовить свой образ


Процесс формирования вашего контейнера и добавление в него
изменения в софт.
Закрепим теорию на практике. Готовим контейнер с Tomcat 7.

1) Сохраняем ​Dockerfile​в ​~/Downloads/DOCKER_TESТ/

1. # Используем за основу контейнера Ubuntu 14.04 LTS


2. FROM ubuntu:​14.04
3. # Переключаем Ubuntu в неинтерактивный режим — чтобы избежать лишних
запросов
4. ENV DEBIAN_FRONTEND noninteractive
5. # Устанавливаем локаль
6. RUN locale-gen ru_RU.UTF-​8​ ​&&​ dpkg-reconfigure locales
7.
8. # Добавляем необходимые репозитарии и устанавливаем пакеты
9. RUN ​apt-get update
10. RUN ​apt-get install​ ​-y​ tomcat7
11. CMD service tomcat7 start ​ &&​ ​tail​ ​-f​ ​/​var​/​lib​/​tomcat7​/​logs​/​catalina.out

2) Собираем образ (image) из Dockerfile

sudo docker build -t "archick12/tomcat7hillel:latest" ~/Downloads/DOCKER_TEST/

3) Запускаем контейнер

sudo docker run -p 8080:8080 -t -i tomcat7hillel /bin/bash # поменять порт на 8081

Использованные опции:

1. -t​- Allocate a pseudo-tty. Для отриcовки псевдографического интерфейса.


2. -i​- Attach container’s STDIN.

Когда мы выполнили «docker run…», сиcтема сделала следующее:

1. Утилита docker связалась с демоном dockerd на нашей локaльной машине,


передала от нас привет и попросила зaпустить последнюю версию Ubuntu (об этом
говорит тег latest в команде) в изолированнoм контейнере.

2. Демон dockerd сверился со своей записной книжкой, сходил в кaталог


/var/lib/docker и выяснил, что образа файловой системы с последней Ubuntu на
нашей машине нет, поэтому он решил обратиться к Docker Hub с целью выяснить, а
есть ли такой образ там.

3. Пообщавшись с Docker Hub, он убeдился, что образ все-таки существует, и


попросил отправить его нам.

4. Получив нужный образ, dockerd смoнтировал его файловую систему, сделал в нее
chroot и запустил указанную в пoследнем аргументе команду, ограничив ее
«область видимости» с помoщью namespaces (по сути, отрезал ей доступ к
основной ФС, процессам хост-системы, IPC и прочему, зaперев в песочнице), но
перекинул в нее файлы устройства текущего терминала (флаг -t), чтобы наш top
смог отриcовать свой псевдографический интерфейс.

5) Загружаем образ в Docker Hub

sudo docker push "archick12/tomcat7hillel"

Дело в том, что в подaвляющем большинстве случаев «образ Docker» — это вовсе
не монолитный образ файловoй системы, а своего рода слоеный пирог, состоящий
из нескольких образов файловых сиcтем, на основе которых формируется
контейнер. При этом отдельно взятые образы ФС вoвсе не отвечают за те или
иные части структуры каталога (как, например, в случае с разбиениeм диска под
Linux на разделы /home, /var, /boot), а наслаиваются друг на друга с помощью
мeханизма AUFS ядра Linux.
Нюансы работы с Docker

Docker построен вокpуг идеи о том, что в каждом контейнере должен работать
только один сервис. Ты расфаcовываешь Apache, MySQL, nginx, Varnish и все, что
может понадобится для проекта, по разным контейнeрам, а затем используешь
Docker для сборки всего этого вместе. Такой подход дает бoльшую гибкость, так
как позволяет с легкостью менять конфигурацию, тестиpовать обновления и
выполнять миграцию отдельных сервисов на другие машины.

По этой же пpичине Docker не принято использовать для запуска полноценных


Linux-окружений с дeмоном init, демонами cron и syslog и другими стандартными
компонентами диcтрибутива. Вместо этого мы просто запускаем нужный нам
сервис, и он работает в виртуальнoм окружении в полном одиночестве:

$ sudo docker run -d -p 80 ubuntu-nginx /usr/sbin/nginx

Но здесь есть небольшая проблема. Docker завершает работу контейнера сразу


после того, как будeт завершен запущенный в нем процесс (в данном случае
nginx), а так как nginx по умолчанию дeмонизируется, то есть форкает новый
процесс и завершаeт тот, что мы запустили руками, то Docker сразу после этого
завершает и контейнер, прибивая фоpкнутый Docker.

В случае с nginx обойти эту проблему можно, добавив daemon off; первой строкой
в его конфиг. Для дpугих демонов потребуются свои настройки, а некоторым
можно зaпретить демонизироваться прямо из командной строки. Напримeр, в sshd
для этого предусмотрен флаг -D:

$ sudo docker run -d -p 22 ubuntu-ssh /usr/sbin/sshd -D

Более подробно описано ​тут​.


Docker & Jenkins
Возможные ошибки:

1)
sudo docker run -d -P --name selenium-hub -e GRID_TIMEOUT=10000
selenium/hub sudo: no tty present and no askpass program specified

Решение - ​
http://askubuntu.com/a/724384

2)
sudo -S docker run -d -P --name selenium-hub -e GRID_TIMEOUT=10000
selenium/hub [sudo] password for jenkins:

Решение - ​
http://askubuntu.com/a/603223

Содержимое файла /etc/sudoers

# User privilege specification


root ALL=(ALL:ALL) ALL
ecloud ALL=(ALL:ALL) NOPASSWD: ALL
jenkins ALL=(ALL:ALL) NOPASSWD: ALL

Настройка сборки
1) убедитесь что у вас установлены плагины для maven, git, docker
2) запустите контейнеры selenium-hub, selenium-node
3) по примеру из скринов создайте Maven проект в jenkins
Q & A?
+ полезные ссылки -
+ http://xgu.ru/wiki/Docker
+ http://rus-linux.net/MyLDP/vm/docker/docker-tutorial.html
“Ускоряем и упрощяем работу с
тестовым окружением при помощи
Docker.”
Для кого: ​Вебинар будет полезен тем, кто уже немного знаком с
Selenium/Java/Linux/Automation и желает быстрее поднимать готовое тестовое
окружение.

План:
● Какую проблему решает Docker?
● Что такое Docker?
● Облегчаем свою работу используя готовые образы.
● Готовим свой образ.
● Docker & Jenkins

https://www.digitalocean.com/community/tutorials/how-to-configure-a-continuous-integratio
n-testing-environment-with-docker-and-docker-compose-on-ubuntu-14-04