Процесс разработки и
тестирования с
Docker + Gitlab CI
Сигачев А. (Inventos)
О чем доклад?
● Продолжаем изучать docker и учить других (https://goo.gl/pXlO6U)
● Делимся опытом
● проповедуем докеризацию всего :-)
Какие проблемы решаем?
быстрый вход нового разработчика в проект
стандартизация настроек разработчиков
переключение между проектами - разные версии ПО и библиотек (mysql
5.6/5.7, node 0.12/7.2)
приучаем разработчиков к сетевому взаимодействию компонентов
Microservice - масштабирование/разделения разработки
Инструменты:
1. docker - Dockerfile - как документация описания зависимостей
2. docker-compose - инструмент связывающий компоненты
3. gitlab - хранилище кода
4. gitlab-ci - Система интеграции
Часть I
Машина разработчика
Dockerfile
FROM ruby:2.3.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
RUN bundle install
ADD . /app
EXPOSE 3000
CMD ['puma', '-C', 'config/puma.rb']
docker-compose.yml
version: '2'
services:
db:
image: mysql:5.7.14
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app
ports:
- "3000:3000"
depends_on:
- db
База данных - mysql
Фиксируем версию базы в проекте
Единый hostname/login/password для всех разработчиков
начальная настройка конфигурации базы данных
Backend
Системная версия ruby/python/nodejs/etc.
Не нужно переключаться между версиями, pyenv/rbenv/etc
Появляется возможность версионирования изменений кода + зависимостей
Результат сборки везде одинаковый
frontend
Разработка react nodejs
Сборка webpack + nodejs
Отдача статики - nginx
Схема компонентов
API rest
RoR
DB
android
ios
Admin
rest-js
push task
rest
nodejs
DB
redis
android
ios
android
ios
push для устройства
browse
Делаем микросервисы - контейнеры
Переиспользование кода в новых проектах. Как интегрировать?
A. db-api - mysql 5.7
B. rest-api - Ruby 2.3 on Rails 5
C. nginx - static files
D. admin - rest-client - javascript nodejs v7
E.push-msg сервис по api
a. nodejs v4.2
b. db-push v5.7
Добавляем в проект docker
Добавляем в проект Dockerfile
в docker-compose.yml описываем зависимости и компоненты
добавляем папку docker где храним конфиги сервисов
docker
├── mysql
│ ├── entrypoint.sh
│ └── my.cnf
└── nginx
└── static.conf
Объединяем компоненты в development
Добавляем репозиторий отвечающий за совместный запуск компонентов
dockerized-app
./
├── admin
├── dockerized-app
├── informer_api
└── push-msg
Объединение компонентов - docker-compose
Краткая документация по работе
Конфигурация - development
Запускать ядра + компоненты
Изолированная сеть
./
├── docker
│ ├── mysql
│ │ ├──
create_db_informer_push.sh
│ │ ├── entrypoint.sh
│ │ └── my.cnf
│ └── nginx
│ └── base_proxy.conf
├── docker-compose-push.yaml
├── docker-compose.yml
└── README.md
Описание компонентов
version: '2'
services:
balancer:
image: jwilder/nginx-proxy
....
api.informer.dev:
build: ../informer_api
….
admin.informer.dev:
build: ../admin
….
dbrw:
image: mysql:5.7.17
….
Доступ к приложению
dns через /etc/hosts - api.informer.dev admin.informer.dev static.informer.dev
client
nginx-proxy
host-ip:80
nginx-js-admin
10.0.9.5:80
rails
10.0.9.4:3000
nginx-static
10.0.9.3:80
images-files
virtual-network
Пример докеризации - mysql
1. Официальная страница - https://hub.docker.com/_/mysql/
2. docker-entrypoint.sh - правим для своих нужд инициализации
3. Конфигурация через ENV variables (docker-compose.yml)
MYSQL_ALLOW_EMPTY_PASSWORD: 1
MYSQL_USER: api
MYSQL_PASSWORD: topsecret
MYSQL_DATABASE : api
Часть 2
gitlab-ci и Staging в облаках
Доклад по gitlab - https://goo.gl/uohKjI
simplecloud - https://goo.gl/KfytA8
gitlab-ci - просто добавь .gitlab-ci.yml
stages:
- test
- deploy
test:
stage: test
script:
- docker-compose -f docker-compose-staging.yml build api-test
- docker-compose -f docker-compose-staging.yml run api-test rake db:migrate test
deploy_staging:
stage: deploy
script:
- docker-compose -f docker-compose-staging.yml down
- docker-compose -f docker-compose-staging.yml up -d
- docker-compose -f docker-compose-staging.yml run api rake db:migrate
only:
- master
Gitlab Runner
GitLab Runner is written in Go and can be run as a single
Shell
Docker
Docker Machine and Docker Machine SSH (auto-scaling)
Parallels
VirtualBox
SSH
Kubernetes
Тесты пройдены новая версия доставлена
История сборок
Staging
Система состоит из компонентов - разрабатываемых не зависимо
Как организовать перезапуск части после коммита?
Как поделить 80 порт между 2, 3, … 5x приложениями?
Ответы:
Настраиваем 1 gitlab-runner на репозитарии проекта.
Создаем виртуальную сеть для использования в docker-compose.yml
Для каждого microservice описываем свой docker-compose.yml
Выносим nginx-proxy-balancer в отдельный docker-compose.yml
подключаем в него созданные виртуальные сети.
root в контейнере и non root user:
По умолчанию пользователь в контейнере root и созданные файлы получают права
root:root
Можно создать пользователя и выполнять приложение от его имени
sudo/gosu/setuid/Dockerfile USER
Если uid и gid в контейнере и пользователя разработчика не совпадут - проблема с
правами
Проблему решили:
RUN groupadd --gid 1000 app && useradd --uid 1000 --gid 1000 app --shell /bin/bash
Планы:
Перечитать документацию docs.docker.com
Освоить swarm cluster + deploy
Центральное логирование docker-cluster -> elasticsearch
Вопросы?
Вступаем https://vk.com/orelrb
orel-rb.ru
Сигачев Александр (Инвентос)