36
DOCKER - FTW! Taras Lyapun Km Code' n 'Coffee #5

Docker for the WIN!

Embed Size (px)

DESCRIPTION

Docker for the Win! Презентация с конференции Km Code'n'Coffee #5 Ляпун Тарас

Citation preview

DOCKER - FTW!Taras Lyapun

Km Code' n 'Coffee #5

ABOUT ME• Компьютер с рождения

• Программирование с ~10 лет

• Работал в

• 42coffeecups.com

• prom.ua

• qbeats.com

• getgoing.com

• Сейчас фрилансер на oDesk

SURVEY TIME

ПРОБЛЕМЫ• Соответствие development\staging\production среды (Vagrant?)

• Разворачивание новых серверов и новых сервисов (Ansible\Puppet\Chef ?)

• Deployment - обновление приложения (git? rsync? tar ball? deb package?).

• Изоляция сервисов друг от друга (Виртуализация? LXC?)

• Тестирование

VAGRANT

• Большой оверхед

• Длительное время запуска

• Как деплоить?

Создание и конфигурация легковесных, повторяемых и портируемых сред разработки.

ANSIBLE \ CHEF \ PUPPET

ПРОБЛЕМЫ

ПРОБЛЕМА ТРАНСПОРТИРОВКИ

РЕШЕНИЕ

В ИТОГЕ

• Ручная погрузка судна обходится в $5,86 за тонну до 1956.

• Используя контейнеры - $0.16 за тонну.

LXC• Lightweight Linux Container (Легковесный Linux контейнер).

• Первая версия в Linux 2.6.24

• Способ виртуализации на уровне операционной системы для запуска множества изолированных Linux систем

• Дает возможность запустить мини Linux внутри другого Linux’a

• Используется Heroku для их Dynos

LXC

• Основан на cgroups и namespace

• cgroups - фича линукса для ограничения, контроля и изолирования использования ресурсов (CPU, Memory, disk I/O, etc) без необходимости запуска виртуальной машины

• namespace - дает возможность полностью изолировать приложения от операционной системы, включая дерево процессов, сеть, пользователей, файловую систему и т.д.

CONTAINER VS VM

MEET DOCKER

«Docker - это open-source движок для легкого создания легковесных, портируеммых, независимых контейнеров для любых приложений. Один и тот же контейнер который разработчик создал и протестировал на своем ноутбуке, может быть запущен в продакшене, на виртуальной машине, выделенном сервере, OpenStack кластере, облаке и т.п.»

- docker.io

DOCKER• Проект был создан Solomon Hykes, как внутренний проект компании dotCloud в 2013 году.

• Делает Linux Containers легкими в использовании добавляя инструменты и подходы.

• Написан на Go

• Уже есть 1.1 версия (100% production ready!)

• 546 Contributors, 1030 watchers, 14k stars, 2k5 forks (30.07.2014)

• Интеграция с чем угодно, кучу проектов на основе Docker’а

• Используется в Ebay, Yandex, Spotify, Uber, Rackspace, CloudFlare, Trueship и т.д.

DOCKER• Легкий, минимум оверхеда

• Быстрый

• Open Source

• Простой

• Позволяет деплоить что угодно и куда угодно

• легко

• надежно

• масштабируемо

АРХИТЕКТУРА ДОКЕРА

DOCKER

• Docker состоит из демона сервера - который предоставляет REST API (не обязательно запущен локально)

• и из клиента, который работает с этим демоном и предоставляет CLI

• Docker registry - репозиторий

ОСНОВНЫЕ ПОНЯТИЯ• DOCKER IMAGE

• DOCKER CONTAINER

• DOCKER CLI

• DOCKERFILE

• DOCKER REGISTRY

DOCKER IMAGE

• Read-only шаблон ваших контейнеров

• Используется для создания Docker containers.

• Может состоять например из Ubuntu + ваше приложение + supervisor

• Вы можете создавать новые images, редактировать , скачивать существующие и делиться своими

DOCKER CONTAINER• Запущенный экземпляр image

• Может быть создан, запущен, остановлен и удален

• Полностью изолированный от других процессов вашей OS

• Содержит все тоже самое что Image + read\write слой для работы приложения.

IMAGE VS CONTAINER

• Image указывает Docker’у что контейнер содержит, какие процессы запустить когда запускается контейнер, и всю необходимую конфигурационную информацию

• Когда Docker запускает container с image, он добавляет read-write слой поверх image, в котором ваше приложение может быть запущенно

DOCKER CLI• docker run - запускаем новый контейнер

• docker stop - останавливаем контейнер

• docker start - запускаем остановленный ранее контейнер

• docker rm - удаляем контейнер

• docker rmi - удаляем image

• docker inspect - информация о контейнере

• docker commit - создаем новый image из контейнера

• docker logs - смотрим stdout контейнера

• docker build - создаем image с Dockerfile

• docker ps - список запущенных контейнеров (docker ps -a - список всех контейнеров)

• docker pull - загружаем image с репозитория

• docker push - загружаем image в репозиторий

DOCKERFILEFROM ubuntu # наследуемся от другого image

RUN apt-get update # RUN - любая команда

RUN apt-get install -y python-dev python-distribute python-pip # устанавливем системные завимости

ADD ./requirements.txt /www/requirements.txt # копируем файл с зависимости нашего приложения

RUN pip install -r /www/requirements.txt # устанавливаем зависимости приложения

ADD ./app.py /www/app.py # копируем наше приложение

EXPOSE 5000 # Делаем порт доступным из вне

CMD python /www/app.py # Команда при запуске контейнера по умолчанию

RUN OPTIONS• -d - запуск в фоне (в виде демона)

• -e - устанавливаем переменные окружения

• -p - прокидываем порты

• -v - маунтим папки с нашей машины в контейнер

• -link - соединяем контейнеры между собой

• -volumes-from - маунтим папки одного контейнера в другой

• -m - устанавливаем лимит памяти

• -c - устанавливаем коэффициент CPU

DOCKER REGISTRY

• https://registry.hub.docker.com/

• https://github.com/docker/docker-registry

DEMO

КАКИЕ ПРОБЛЕМЫ МЫ РЕШИЛИ?

• Соответствие development\staging\production среды

• Разворачивание новых серверов и новых сервисов

• Deployment - обновление приложения

• Изоляция сервисов друг от друга

• Тестирование

ПАТТЕРНЫ• Один процесс - один image

• init.d, upstart не работают. Запускаем не в демон режиме.

• Data only containers

• Создайте свой базовый image

• Используйте link

СОВЕТЫ• То что меняется чаще всего - ближе к концу Dockerfile (каждая строчка Dockerfile - это состояние которое кешируется)

• ENTRYPOINT VS CMD

• docker rm $(docker ps -a -q)

• docker rmi $(docker images -q)

• Легкие OS как основа вашего контейнера (например debian:jessie)

ПРОБЛЕМЫ• Нельзя указать определенный Dockerfile (решается симлинком или с помощью tarball)

• Нельзя применить шаблон (но можно делать вручную в ENTRYPOINT)

• Пока нет простого способа проапгрейдить работающий контейнер

• Все таки встречаются баги

ЧТО ДАЛЬШЕ?• Ansible (docker, docker_image modules).

• Maestro - Orchestration of Docker-based, multi-host environments.

• Shipyard - web UI for Docker.

• Deis - open source PAAS based on Docker. (like Heroku.com)

• Dokku - super small PAAS based on Docker. (like Heroku.com)

• Fig - Fast, isolated development environments using Docker.

• Flynn - PAAS from Dokku author.

• Orchard - PASS provider for Docker.

• CoreOS - OS заточенная под Docker.

СПАСИБО ЗА ВНИМАНИЕ!

• lyapun.com/docker.pdf

• Me:

• @tlyapun

• fb/taras.lyapun