SlideShare a Scribd company logo
1 of 50
DOCKER 1.9
Ваши приложения в удобной упаковке
Золотов Дмитрий,
ведущий инженер
dzolotov@herzen.spb.ru
Управление информатизации РГПУ им. А.И. Герцена
Санкт-Петербург
2015
Своя уютная бухта для каждой
программы (в одном океане)
“Cиний кит проявляет
склонность к одиночеству
в большей степени,
чем все остальные
китообразные”
[Wikipedia]
Как использовать?
Тысячи готовых к работе программ (вместе со средой выполнения)
Возможность упаковки своих приложений и запуска на любом узле
Linux (а также Windows и MacOS)
Создание кластеров из десятков-сотен-тысяч узлов с
распределёнными приложениями (в т.ч. на микросервисах)
Лучше один раз увидеть
docker run -d -p 10000:80
docker.hspu.local:80/2048
http://10.0.16.201:10000
Модель для сборки - Dockerfile
FROM nginx:latest
MAINTAINER Dmitrii Zolotov <dzolotov@herzen.spb.ru>
ENV DEBIAN_FRONTEND noninteractive
WORKDIR /usr/share/nginx/html
RUN apt-get update && apt-get install -y git && rm -rf * && git clone https://github.com/gabrielecirulli/2048
.
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Отличие от виртуальных машин
Виртуальная машина (управление через
vagrant)
Vagrant.configure("machine") do |config|
config.vm.box = "trusty64"
config.vm.hostname = "machine.test"
config.vm.network :private_network, ip: "192.168.0.42"
config.vm.provider :virtualbox do |vb|
vb.customize [
"modifyvm", :id,
"--cpuexecutioncap", "50",
"--memory", "256",
]
end
end
Виртуальная машина
Запускается долго…
Создаёт абстракцию уровня оборудования…
Большая по размеру (т.к. полностью содержит операционную систему)...
Требует много ресурсов для выполнения...
Контейнеры
...запускаются за доли секунды
...маленькие по размеру (содержат только минимальный набор
необходимых библиотек и само приложение)
...почти нет потерь в ресурсах (работают на реальном оборудовании и на
одном ядре, но хорошо изолированы один от другого)
Революция?
Нет, успешный симбиоз нескольких технологий Linux-ядра:
lxc
cgroups
namespaces
apparmor
...
Open Container Initiative
Контейнеры - не на один день.
Достаточно посмотреть
на логотипы участников
Open Container Initiative.
Open Container Initiative
Единый формат контейнеров - OCF
Автономная, независимая от поставщика, реализация среды выполнения
контейнеров - проект runC (создаётся также порт для Windows)
Как использовать в домашних условиях
/ на рабочем месте?
Если Linux - всё просто - установить Docker Engine и Docker Client (единый пакет,
есть под все основные дистрибутивы)
Если Windows и MacOS - рекомендуется использовать Docker Toolbox,
включающий:
docker-machine
docker-engine
docker-compose
Kitematic, Docker GUI
Kitematic
Интерфейс программы
Что изолируется?
PID namespace (могут повторяться номера процессов, первый всегда имеет
номер 1)
IPC namespace - именованные объекты межпроцессного взаимодействия
mnt namespace - файловая система
net namespace - сеть
uts namespace - версия и параметры ядра
user namespace - изоляция пользователей (в т.ч. администратора)
Как видит контейнер внешний мир?
● своя файловая система
● собственный сетевой
интерфейс (и localhost)
● ядро представляется
собственным
● межпроцессное
взаимодействие в своём
адресном пространстве
● первый процесс в системе
с идентификатором 1
Какой он на самом деле?
Внешний мир ->
контейнер
Контейнер->внешний
мир
Доступ в сеть Только EXPOSE Внешняя сеть
доступна,
контейнеры
общаются внутри
хоста
Файловая система Только VOLUME -
Управление
процессами
Просмотр состояния,
top
Изолированное PID
namespace, хост-узел
недоступен
Управление ресурсами
При запуске контейнера можно указать ограничения
--cpu-shares - доля процессорного времени (1024 - max)
--oom-kill-disable = true - запрет out-of-memory-killer
--cpu-period, --cpu-quota - управление CFS-квотами
--cpuset-cpus - ядра процессора для использования
--blkio-weight - ограничение (от 10 до 1000) на использование ввода/вывода, по
умолчанию 500
--memory, --memory-swap - ограничение по памяти (обычная и с подкачкой)
Надёжность и безопасность
--restart - политика перезапуска контейнера (no / on-failure:<max> / always)
--rm=true - очищать изменения в контейнере и восстанавливать исходный
образ после перезапуска
--security-opt - использует возможности ОС контейнера (security policy: user
/ role / type / level или apparmor) для применения ограничений на
взаимодействие с внешним миром, запуск приложений и выполнение
изменений
Хитрости
--pid=”host” - позволяет использовать разделяемое пространство
идентификаторов процессов для нескольких контейнеров (общее с хост-
машиной)
--uts=”host” - единое пространство именования узлов с хост-машиной
--ipc=”container:id | host” - создание единого пространства именования
объектов межпроцессного взаимодействия (с узлом или другим
контейнером)
--net=”host” - использование сетевого стека хост-машины
Связь с внешним миром
--volume - связывание каталога хост-машины с каталогом контейнера
--volumes-from - связывание контейнеров через общее хранилище
--add-host - создание записи в /etc/hosts (связывание с узлом)
--dns - использование указанных DNS-серверов (вместо 8.8.8.8)
--link - связывание с другим контейнером через сеть (создаёт запись в
/etc/hosts, общаются через подсеть внутри docker)
--publish - связывание tcp/udp-портов из приложения с портами хост-машины
Docker environment
Переменные окружения могут быть переопределены
docker run --name my-wordpress -e
VIRTUAL_HOST=domain.com -d
spencercooley/wordpress
Связывание контейнеров через сеть
Допустим, есть два контейнера с именами: web2 и db. Чтобы создать связь,
нужно удалить контейнер web и пересоздать его с использованием команды:
docker run --rm --name web2 --link db:db training/webapp env
DB_NAME=/web2/db
DB_PORT=tcp://172.17.0.5
DB_PORT_5432_TCP=tcp://172.17.0.5:5432
DB_PORT_5432_TCP_PROTO=tcp
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_ADDR=172.17.0.5
Дополнительные возможности
--device - связывание устройств хост-машины с контейнером (например,
подключение USB-дисков)
--cap-add, --cap-drop - управление разрешениями Linux-ядра (например,
SYS_ADMIN - для монтирования сетевых дисков)
--privileged=true - доступ ко всем функциям ядра (в т.ч. запуск docker внутри
docker)
--lxc-conf - параметры в lxc (например, lxc.mount для монтирования сетевых
устройств, lxc.utsname - изменения имени узла)
Требования к хост-машине
Ядро Linux не менее 3.15 с поддержкой слоевой файловой системы
(например, AUFS или BTRFS) и cgroups.
Поддержка аппаратной виртуализации не требуется, поскольку
контейнер работает в основном ядре.
Новое в Docker 1.8 (и 1.9)
Переадресация и ротация журналов
--log-driver=json - по умолчанию (новое: --log-opt [maxsize=#] [maxfile=#]
для ротации)
--log-driver=syslog - отправка журналов в syslog-накопитель (--log-opt
syslog-address=udp://ip:514 syslog-tag=<метка> syslog-
facility=<уровень>)
--log-driver=fluentd - отправка в fluentd-агрегатор (--log-opt fluentd-
address=ip:24224 fluentd-tag=<метка>)
Новое в Docker 1.8 (и 1.9)
Плагины для сетевого взаимодействия - создают прозрачную сеть
между контейнерами (с использованием libnetwork). Драйверы:
simplebridge - сеть внутри хоста
overlay - распределённая сеть между хостами (встроенная)
weave - распределённая сеть на L2 (Weave)
Новые команды Docker 1.9
docker network create --driver=... net1 - создать сеть
docker run [--publish-service=service1.net1] [--net=net1] … - зарегистрировать
контейнер, как сервис в сети
docker network plug net1 <container> - подключить контейнер к сети
Для драйвера overlay необходимо внешнее key-value хранилище (например, consul)
и конфигурация запуска docker, например
docker -d --kv-store=consul:10.0.16.204:8500 --label=com.docker.network.driver.overlay.bind_interface=eth0
Плагины для доступа к системам хранения:
docker run --volume-driver=<название>
Например,
flocker, glusterfs - перемещаемые между узлами хранилища
nfs - хранилище доступно через nfs
rexray - хранение в облачных сервисах (Amazon S3, …)
Новое в Docker 1.8 (и 1.9)
Взгляд разработчика. Упаковка
приложений.
Инструкция по сборке среды выполнения - Dockerfile
Новый образ использует уже существующий, как основу для файловой системы.
Dockerfile:
FROM ubuntu:latest
...
FROM ubuntu:latest
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]
Dockerfile
Графические приложения в docker-
контейнерах (для тонких клиентов)
ubuntu + application + ssh-server
docker run -p 1000:22 -d …
ssh -X -p 1000 <ip>
графические приложения запускаются с сервера на рабочей станции
Жизненный цикл контейнера
Без сохранения образов в хранилище:
create | pull | build → <изменения> → [diff] → commit
С сохранением образов:
create | pull | build → tag → push
С переносом образа архивом:
save → … → load
С переносом контейнера архивом:
create | pull | build → export (создаёт tar) → import
Просмотр состояния контейнеров
docker images - список загруженных (или собранных или
отправленных) образов
docker ps - список активных контейнеров
docker logs <id> - просмотр консоли контейнера (только для log-
driver=json)
docker top <id> - активные процессы в контейнере
docker port <id> - просмотр отображенных портов
Управление контейнерами
Создание из образа: docker create [--name название] <образ>
Сборка по Dockerfile: docker build [-t <образ>] <путь>
Запуск: docker run [--publish …] [--volume …] [--env …] <образ>
Приостановка/возобновление: docker pause <id> / docker unpause <id>
Остановка/запуск/перезапуск: docker stop <id> / docker start <id> /
docker restart <id>
FROM - базовый образ
MAINTAINER - контакты ответственного за образ
RUN - запуск команды в контейнере (при сборке)
ADD, COPY - копирование файлов в контейнер (ADD также может
распаковывать .tar.gz)
ENV - определение значения переменной системного окружения по
умолчанию
Инструкции Dockerfile
Инструкции Dockerfile
VOLUME - анонс возможного связывания с каталогом или
файлом
ENTRYPOINT - приложение для запуска при входе в контейнер
WORKDIR - изменение текущего каталога в контейнере
CMD - параметры приложения (могут быть переопределены в
RUN)
Что, если надо запустить несколько
связанных приложений?
Например, запустить фоновый php процесс и приложение, которое его
использует, а также перехват вывода и отправка в syslog.
Можно использовать supervisord: конфигурация в одном файле, по
семантике похожа на systemd.
Взгляд администратора
Необходимо решить несколько проблем:
координированный запуск нескольких контейнеров
регистрация сервисов и возможность их обнаружения
мониторинг состояния контейнеров (как снаружи, так и внутри)
развертывание новых узлов по набору правил и включение в состав
кластера
Координированный запуск нескольких
контейнеров
В случае отсутствия циклических зависимостей - регистрация
контейнеров (в /etc/docker) и их запуск средствами docker daemon
(для создания можно использовать, например, puppet)
Docker compose (декларация набора контейнеров вместе с
параметрами и связями, также возможна сборка)
В случае циклических связей или необходимости запускать
контейнеры на разных узлах - создать прокси и предварительно
запускать его (ambassador pattern).
Docker compose
web:
build: web
command: python app.py
ports:
- "5000:5000"
volumes:
- web:/code
links:
- redis
redis:
image: redis
datadog:
build: datadog
links:
- redis
environment:
- API_KEY=123
volumes:
-
/var/run/docker.sock:/var/run/docker.sock
- /proc/mounts:/host/proc/mounts:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro
Мониторинг состояния контейнеров (как
снаружи, так и внутри)
Снаружи: docker swarm агрегирует информацию о контейнерах, либо
внешняя проверка. У нас: consul health check
Внутри: захват логов (fluentd или syslog), можно использовать collectd
для сбора метрик по процессору и памяти.
Регистрация сервисов и возможность их
обнаружения
Можно использовать внешнее средство обнаружения сервисов - у нас
используется Consul + DNSMasq
Можно использовать swarm и его механизмы обнаружения (тоже consul
или etcd)
Можно посмотреть на DNS, встроенный в Libnetwork (впервые
стабильная сборка появилась в Docker 1.9)
Развертывание новых узлов по набору
правил и включение в состав кластера
Либо установка любого Linux-дистрибутива (с ядром не менее 3.15), либо
запуск на железе минималистичного Linux (CoreOS, Atomic) и запуск
рабочей среды (docker compose или любой DevOps инструмент - Puppet,
Ansible, Salt, Chef, ...)
Альтернатива - Docker Machine (особенно для разработчика с Windows
или MacOS)
Docker machine
Запуск образа операционной системы в виртуальной машине (драйвер
может быть как локальным - например, Virtualbox, так и облачным -
например, ec2).
Аналог vagrant, но интегрирован с swarm и входит в состав Docker
Toolbox.
Docker registry - хранение частных
образов организации
Продолжение следует...
Вторая часть семинара будет по распределённым приложениям в Docker,
вопросам миграции контейнеров, использованию Swarm и управлению кластером
через Shipyard.
ВАШИ ВОПРОСЫ?
Спасибо за внимание!
Приходите к нам и приглашайте друзей.
Сообщество “ИТ. Герценовский университет”: http://goo.gl/FEieqK
Календарь семинаров: http://goo.gl/utyuU0
Дмитрий Золотов
dzolotov@herzen.spb.ru

More Related Content

What's hot

Депрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчасДепрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчас
Ruslan Sharipov
 

What's hot (20)

Docker. Основы
Docker. ОсновыDocker. Основы
Docker. Основы
 
Депрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчасДепрокрастинируем Docker: контейнеры здесь и сейчас
Депрокрастинируем Docker: контейнеры здесь и сейчас
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
OpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельностиOpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельности
 
Docker с чем едят и для чего используют
Docker с чем едят и для чего используютDocker с чем едят и для чего используют
Docker с чем едят и для чего используют
 
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupДоклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control Groups
 
TК°Conf. Микросервисы и Docker. Глеб Паньшин.
TК°Conf. Микросервисы и Docker. Глеб Паньшин.TК°Conf. Микросервисы и Docker. Глеб Паньшин.
TК°Conf. Микросервисы и Docker. Глеб Паньшин.
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25
 
Как не стать рабом облака. PaaS 2.0 с Docker
Как не стать рабом облака. PaaS 2.0 с DockerКак не стать рабом облака. PaaS 2.0 с Docker
Как не стать рабом облака. PaaS 2.0 с Docker
 
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
 
Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)Пространства имен Linux (linux namespaces)
Пространства имен Linux (linux namespaces)
 
RHEL 7. Контейнеры и Docker
RHEL 7. Контейнеры и DockerRHEL 7. Контейнеры и Docker
RHEL 7. Контейнеры и Docker
 
Тестовый стенд для большого числа проектов на Docker
Тестовый стенд для большого числа проектов на DockerТестовый стенд для большого числа проектов на Docker
Тестовый стенд для большого числа проектов на Docker
 
Непрерывная интеграция Python-проектов в Яндексе
Непрерывная интеграция Python-проектов в ЯндексеНепрерывная интеграция Python-проектов в Яндексе
Непрерывная интеграция Python-проектов в Яндексе
 
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
 
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
 
Docker: from understanding to production
Docker: from understanding to productionDocker: from understanding to production
Docker: from understanding to production
 
Teach your dockers to use CRanes
Teach your dockers to use CRanesTeach your dockers to use CRanes
Teach your dockers to use CRanes
 

Viewers also liked

Noncommercial Use Study Interim Report
Noncommercial Use Study Interim ReportNoncommercial Use Study Interim Report
Noncommercial Use Study Interim Report
Creative Commons
 
Introduction to the open policy network and institute for open leadership
Introduction to the open policy network and institute for open leadershipIntroduction to the open policy network and institute for open leadership
Introduction to the open policy network and institute for open leadership
Creative Commons
 
Amy Gallacher Candidate Number: 3079 - Evaluation
Amy Gallacher Candidate Number: 3079  -  EvaluationAmy Gallacher Candidate Number: 3079  -  Evaluation
Amy Gallacher Candidate Number: 3079 - Evaluation
amygallacher
 
Cathy Casserly OER panel at Apple UEF (4-4-11)
Cathy Casserly OER panel at Apple UEF (4-4-11)Cathy Casserly OER panel at Apple UEF (4-4-11)
Cathy Casserly OER panel at Apple UEF (4-4-11)
Creative Commons
 
Open licensing workshop at OGP Civil Society Day
Open licensing workshop at OGP Civil Society DayOpen licensing workshop at OGP Civil Society Day
Open licensing workshop at OGP Civil Society Day
Creative Commons
 
Окружение разработчика - от виртуализации к контейнеризации
Окружение разработчика - от виртуализации к контейнеризацииОкружение разработчика - от виртуализации к контейнеризации
Окружение разработчика - от виртуализации к контейнеризации
Alexander Kirillov
 

Viewers also liked (20)

Symfony 3
Symfony 3Symfony 3
Symfony 3
 
6 Months Sailing with Docker in Production
6 Months Sailing with Docker in Production 6 Months Sailing with Docker in Production
6 Months Sailing with Docker in Production
 
Amy Gallacher Media Evaluation
Amy Gallacher Media EvaluationAmy Gallacher Media Evaluation
Amy Gallacher Media Evaluation
 
Noncommercial Use Study Interim Report
Noncommercial Use Study Interim ReportNoncommercial Use Study Interim Report
Noncommercial Use Study Interim Report
 
Stanford Open Access Week 2014 presentation
Stanford Open Access Week 2014 presentationStanford Open Access Week 2014 presentation
Stanford Open Access Week 2014 presentation
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
Introduction to the open policy network and institute for open leadership
Introduction to the open policy network and institute for open leadershipIntroduction to the open policy network and institute for open leadership
Introduction to the open policy network and institute for open leadership
 
2012 Taiwan UX Summit 專題演講(二)簡報
2012 Taiwan UX Summit 專題演講(二)簡報2012 Taiwan UX Summit 專題演講(二)簡報
2012 Taiwan UX Summit 專題演講(二)簡報
 
Amy Gallacher Candidate Number: 3079 - Evaluation
Amy Gallacher Candidate Number: 3079  -  EvaluationAmy Gallacher Candidate Number: 3079  -  Evaluation
Amy Gallacher Candidate Number: 3079 - Evaluation
 
Cathy Casserly OER panel at Apple UEF (4-4-11)
Cathy Casserly OER panel at Apple UEF (4-4-11)Cathy Casserly OER panel at Apple UEF (4-4-11)
Cathy Casserly OER panel at Apple UEF (4-4-11)
 
Casserly OER presentation at OCWC on May 5, 2011
Casserly OER presentation at OCWC on May 5, 2011Casserly OER presentation at OCWC on May 5, 2011
Casserly OER presentation at OCWC on May 5, 2011
 
2011 Taiwan UX Summit_Workshop F
2011 Taiwan UX Summit_Workshop F2011 Taiwan UX Summit_Workshop F
2011 Taiwan UX Summit_Workshop F
 
Creative Commons Law and the GeoWeb presentation
Creative Commons Law and the GeoWeb presentationCreative Commons Law and the GeoWeb presentation
Creative Commons Law and the GeoWeb presentation
 
2012 Taiwan UX Summit 工作坊D 簡報
2012 Taiwan UX Summit 工作坊D 簡報2012 Taiwan UX Summit 工作坊D 簡報
2012 Taiwan UX Summit 工作坊D 簡報
 
2011 Taiwan UX Summit_Workshop D
2011 Taiwan UX Summit_Workshop D2011 Taiwan UX Summit_Workshop D
2011 Taiwan UX Summit_Workshop D
 
Open licensing workshop at OGP Civil Society Day
Open licensing workshop at OGP Civil Society DayOpen licensing workshop at OGP Civil Society Day
Open licensing workshop at OGP Civil Society Day
 
0515 UiGathering Talk - Mobile App by Angel Wu
0515 UiGathering Talk - Mobile App by Angel Wu0515 UiGathering Talk - Mobile App by Angel Wu
0515 UiGathering Talk - Mobile App by Angel Wu
 
2012 Taiwan UX Summit 工作坊B 簡報
2012 Taiwan UX Summit 工作坊B 簡報2012 Taiwan UX Summit 工作坊B 簡報
2012 Taiwan UX Summit 工作坊B 簡報
 
Docker в виртуальной среде VMware
Docker в виртуальной среде VMwareDocker в виртуальной среде VMware
Docker в виртуальной среде VMware
 
Окружение разработчика - от виртуализации к контейнеризации
Окружение разработчика - от виртуализации к контейнеризацииОкружение разработчика - от виртуализации к контейнеризации
Окружение разработчика - от виртуализации к контейнеризации
 

Similar to Docker 1.9

Управление большим количеством физических серверов, Александр Берсенев, Инст...
 Управление большим количеством физических серверов, Александр Берсенев, Инст... Управление большим количеством физических серверов, Александр Берсенев, Инст...
Управление большим количеством физических серверов, Александр Берсенев, Инст...
it-people
 
Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктурой
dddpaul
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Ontico
 

Similar to Docker 1.9 (20)

Instalarea DSpace
Instalarea DSpaceInstalarea DSpace
Instalarea DSpace
 
Введение в Docker
Введение в DockerВведение в Docker
Введение в Docker
 
OpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельностиOpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельности
 
Docker
DockerDocker
Docker
 
Docker. Зачем он нам?
Docker. Зачем он нам?Docker. Зачем он нам?
Docker. Зачем он нам?
 
Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...Jenkins в docker in mesos in ...
Jenkins в docker in mesos in ...
 
От Make к Ansible
От Make к AnsibleОт Make к Ansible
От Make к Ansible
 
Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015
 
Управление большим количеством физических серверов, Александр Берсенев, Инст...
 Управление большим количеством физических серверов, Александр Берсенев, Инст... Управление большим количеством физических серверов, Александр Берсенев, Инст...
Управление большим количеством физических серверов, Александр Берсенев, Инст...
 
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Управление облачной инфраструктурой
Управление облачной инфраструктуройУправление облачной инфраструктурой
Управление облачной инфраструктурой
 
Работа высоконагруженного DNS-сервера
Работа высоконагруженного DNS-сервераРабота высоконагруженного DNS-сервера
Работа высоконагруженного DNS-сервера
 
Drupal Do
Drupal DoDrupal Do
Drupal Do
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Локальное окружение на Docker
Локальное окружение на DockerЛокальное окружение на Docker
Локальное окружение на Docker
 
DDOS mitigation software solutions
DDOS mitigation software solutionsDDOS mitigation software solutions
DDOS mitigation software solutions
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

Docker 1.9

  • 1. DOCKER 1.9 Ваши приложения в удобной упаковке Золотов Дмитрий, ведущий инженер dzolotov@herzen.spb.ru Управление информатизации РГПУ им. А.И. Герцена Санкт-Петербург 2015
  • 2. Своя уютная бухта для каждой программы (в одном океане) “Cиний кит проявляет склонность к одиночеству в большей степени, чем все остальные китообразные” [Wikipedia]
  • 3. Как использовать? Тысячи готовых к работе программ (вместе со средой выполнения) Возможность упаковки своих приложений и запуска на любом узле Linux (а также Windows и MacOS) Создание кластеров из десятков-сотен-тысяч узлов с распределёнными приложениями (в т.ч. на микросервисах)
  • 4. Лучше один раз увидеть docker run -d -p 10000:80 docker.hspu.local:80/2048 http://10.0.16.201:10000
  • 5. Модель для сборки - Dockerfile FROM nginx:latest MAINTAINER Dmitrii Zolotov <dzolotov@herzen.spb.ru> ENV DEBIAN_FRONTEND noninteractive WORKDIR /usr/share/nginx/html RUN apt-get update && apt-get install -y git && rm -rf * && git clone https://github.com/gabrielecirulli/2048 . EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
  • 7. Виртуальная машина (управление через vagrant) Vagrant.configure("machine") do |config| config.vm.box = "trusty64" config.vm.hostname = "machine.test" config.vm.network :private_network, ip: "192.168.0.42" config.vm.provider :virtualbox do |vb| vb.customize [ "modifyvm", :id, "--cpuexecutioncap", "50", "--memory", "256", ] end end
  • 8. Виртуальная машина Запускается долго… Создаёт абстракцию уровня оборудования… Большая по размеру (т.к. полностью содержит операционную систему)... Требует много ресурсов для выполнения...
  • 9. Контейнеры ...запускаются за доли секунды ...маленькие по размеру (содержат только минимальный набор необходимых библиотек и само приложение) ...почти нет потерь в ресурсах (работают на реальном оборудовании и на одном ядре, но хорошо изолированы один от другого)
  • 10. Революция? Нет, успешный симбиоз нескольких технологий Linux-ядра: lxc cgroups namespaces apparmor ...
  • 11. Open Container Initiative Контейнеры - не на один день. Достаточно посмотреть на логотипы участников Open Container Initiative.
  • 12. Open Container Initiative Единый формат контейнеров - OCF Автономная, независимая от поставщика, реализация среды выполнения контейнеров - проект runC (создаётся также порт для Windows)
  • 13. Как использовать в домашних условиях / на рабочем месте? Если Linux - всё просто - установить Docker Engine и Docker Client (единый пакет, есть под все основные дистрибутивы) Если Windows и MacOS - рекомендуется использовать Docker Toolbox, включающий: docker-machine docker-engine docker-compose Kitematic, Docker GUI
  • 15. Что изолируется? PID namespace (могут повторяться номера процессов, первый всегда имеет номер 1) IPC namespace - именованные объекты межпроцессного взаимодействия mnt namespace - файловая система net namespace - сеть uts namespace - версия и параметры ядра user namespace - изоляция пользователей (в т.ч. администратора)
  • 16. Как видит контейнер внешний мир? ● своя файловая система ● собственный сетевой интерфейс (и localhost) ● ядро представляется собственным ● межпроцессное взаимодействие в своём адресном пространстве ● первый процесс в системе с идентификатором 1
  • 17. Какой он на самом деле? Внешний мир -> контейнер Контейнер->внешний мир Доступ в сеть Только EXPOSE Внешняя сеть доступна, контейнеры общаются внутри хоста Файловая система Только VOLUME - Управление процессами Просмотр состояния, top Изолированное PID namespace, хост-узел недоступен
  • 18. Управление ресурсами При запуске контейнера можно указать ограничения --cpu-shares - доля процессорного времени (1024 - max) --oom-kill-disable = true - запрет out-of-memory-killer --cpu-period, --cpu-quota - управление CFS-квотами --cpuset-cpus - ядра процессора для использования --blkio-weight - ограничение (от 10 до 1000) на использование ввода/вывода, по умолчанию 500 --memory, --memory-swap - ограничение по памяти (обычная и с подкачкой)
  • 19. Надёжность и безопасность --restart - политика перезапуска контейнера (no / on-failure:<max> / always) --rm=true - очищать изменения в контейнере и восстанавливать исходный образ после перезапуска --security-opt - использует возможности ОС контейнера (security policy: user / role / type / level или apparmor) для применения ограничений на взаимодействие с внешним миром, запуск приложений и выполнение изменений
  • 20. Хитрости --pid=”host” - позволяет использовать разделяемое пространство идентификаторов процессов для нескольких контейнеров (общее с хост- машиной) --uts=”host” - единое пространство именования узлов с хост-машиной --ipc=”container:id | host” - создание единого пространства именования объектов межпроцессного взаимодействия (с узлом или другим контейнером) --net=”host” - использование сетевого стека хост-машины
  • 21. Связь с внешним миром --volume - связывание каталога хост-машины с каталогом контейнера --volumes-from - связывание контейнеров через общее хранилище --add-host - создание записи в /etc/hosts (связывание с узлом) --dns - использование указанных DNS-серверов (вместо 8.8.8.8) --link - связывание с другим контейнером через сеть (создаёт запись в /etc/hosts, общаются через подсеть внутри docker) --publish - связывание tcp/udp-портов из приложения с портами хост-машины
  • 22. Docker environment Переменные окружения могут быть переопределены docker run --name my-wordpress -e VIRTUAL_HOST=domain.com -d spencercooley/wordpress
  • 23. Связывание контейнеров через сеть Допустим, есть два контейнера с именами: web2 и db. Чтобы создать связь, нужно удалить контейнер web и пересоздать его с использованием команды: docker run --rm --name web2 --link db:db training/webapp env DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5 DB_PORT_5432_TCP=tcp://172.17.0.5:5432 DB_PORT_5432_TCP_PROTO=tcp DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_ADDR=172.17.0.5
  • 24.
  • 25. Дополнительные возможности --device - связывание устройств хост-машины с контейнером (например, подключение USB-дисков) --cap-add, --cap-drop - управление разрешениями Linux-ядра (например, SYS_ADMIN - для монтирования сетевых дисков) --privileged=true - доступ ко всем функциям ядра (в т.ч. запуск docker внутри docker) --lxc-conf - параметры в lxc (например, lxc.mount для монтирования сетевых устройств, lxc.utsname - изменения имени узла)
  • 26. Требования к хост-машине Ядро Linux не менее 3.15 с поддержкой слоевой файловой системы (например, AUFS или BTRFS) и cgroups. Поддержка аппаратной виртуализации не требуется, поскольку контейнер работает в основном ядре.
  • 27. Новое в Docker 1.8 (и 1.9) Переадресация и ротация журналов --log-driver=json - по умолчанию (новое: --log-opt [maxsize=#] [maxfile=#] для ротации) --log-driver=syslog - отправка журналов в syslog-накопитель (--log-opt syslog-address=udp://ip:514 syslog-tag=<метка> syslog- facility=<уровень>) --log-driver=fluentd - отправка в fluentd-агрегатор (--log-opt fluentd- address=ip:24224 fluentd-tag=<метка>)
  • 28. Новое в Docker 1.8 (и 1.9) Плагины для сетевого взаимодействия - создают прозрачную сеть между контейнерами (с использованием libnetwork). Драйверы: simplebridge - сеть внутри хоста overlay - распределённая сеть между хостами (встроенная) weave - распределённая сеть на L2 (Weave)
  • 29. Новые команды Docker 1.9 docker network create --driver=... net1 - создать сеть docker run [--publish-service=service1.net1] [--net=net1] … - зарегистрировать контейнер, как сервис в сети docker network plug net1 <container> - подключить контейнер к сети Для драйвера overlay необходимо внешнее key-value хранилище (например, consul) и конфигурация запуска docker, например docker -d --kv-store=consul:10.0.16.204:8500 --label=com.docker.network.driver.overlay.bind_interface=eth0
  • 30. Плагины для доступа к системам хранения: docker run --volume-driver=<название> Например, flocker, glusterfs - перемещаемые между узлами хранилища nfs - хранилище доступно через nfs rexray - хранение в облачных сервисах (Amazon S3, …) Новое в Docker 1.8 (и 1.9)
  • 31. Взгляд разработчика. Упаковка приложений. Инструкция по сборке среды выполнения - Dockerfile Новый образ использует уже существующий, как основу для файловой системы. Dockerfile: FROM ubuntu:latest ...
  • 32. FROM ubuntu:latest # Install vnc, xvfb in order to create a 'fake' display and firefox RUN apt-get update && apt-get install -y x11vnc xvfb firefox RUN mkdir ~/.vnc # Setup a password RUN x11vnc -storepasswd 1234 ~/.vnc/passwd # Autostart firefox (might not be the best way, but it does the trick) RUN bash -c 'echo "firefox" >> /.bashrc' EXPOSE 5900 CMD ["x11vnc", "-forever", "-usepw", "-create"] Dockerfile
  • 33. Графические приложения в docker- контейнерах (для тонких клиентов) ubuntu + application + ssh-server docker run -p 1000:22 -d … ssh -X -p 1000 <ip> графические приложения запускаются с сервера на рабочей станции
  • 34. Жизненный цикл контейнера Без сохранения образов в хранилище: create | pull | build → <изменения> → [diff] → commit С сохранением образов: create | pull | build → tag → push С переносом образа архивом: save → … → load С переносом контейнера архивом: create | pull | build → export (создаёт tar) → import
  • 35. Просмотр состояния контейнеров docker images - список загруженных (или собранных или отправленных) образов docker ps - список активных контейнеров docker logs <id> - просмотр консоли контейнера (только для log- driver=json) docker top <id> - активные процессы в контейнере docker port <id> - просмотр отображенных портов
  • 36. Управление контейнерами Создание из образа: docker create [--name название] <образ> Сборка по Dockerfile: docker build [-t <образ>] <путь> Запуск: docker run [--publish …] [--volume …] [--env …] <образ> Приостановка/возобновление: docker pause <id> / docker unpause <id> Остановка/запуск/перезапуск: docker stop <id> / docker start <id> / docker restart <id>
  • 37. FROM - базовый образ MAINTAINER - контакты ответственного за образ RUN - запуск команды в контейнере (при сборке) ADD, COPY - копирование файлов в контейнер (ADD также может распаковывать .tar.gz) ENV - определение значения переменной системного окружения по умолчанию Инструкции Dockerfile
  • 38. Инструкции Dockerfile VOLUME - анонс возможного связывания с каталогом или файлом ENTRYPOINT - приложение для запуска при входе в контейнер WORKDIR - изменение текущего каталога в контейнере CMD - параметры приложения (могут быть переопределены в RUN)
  • 39. Что, если надо запустить несколько связанных приложений? Например, запустить фоновый php процесс и приложение, которое его использует, а также перехват вывода и отправка в syslog. Можно использовать supervisord: конфигурация в одном файле, по семантике похожа на systemd.
  • 40. Взгляд администратора Необходимо решить несколько проблем: координированный запуск нескольких контейнеров регистрация сервисов и возможность их обнаружения мониторинг состояния контейнеров (как снаружи, так и внутри) развертывание новых узлов по набору правил и включение в состав кластера
  • 41. Координированный запуск нескольких контейнеров В случае отсутствия циклических зависимостей - регистрация контейнеров (в /etc/docker) и их запуск средствами docker daemon (для создания можно использовать, например, puppet) Docker compose (декларация набора контейнеров вместе с параметрами и связями, также возможна сборка) В случае циклических связей или необходимости запускать контейнеры на разных узлах - создать прокси и предварительно запускать его (ambassador pattern).
  • 42. Docker compose web: build: web command: python app.py ports: - "5000:5000" volumes: - web:/code links: - redis redis: image: redis datadog: build: datadog links: - redis environment: - API_KEY=123 volumes: - /var/run/docker.sock:/var/run/docker.sock - /proc/mounts:/host/proc/mounts:ro - /sys/fs/cgroup:/host/sys/fs/cgroup:ro
  • 43. Мониторинг состояния контейнеров (как снаружи, так и внутри) Снаружи: docker swarm агрегирует информацию о контейнерах, либо внешняя проверка. У нас: consul health check Внутри: захват логов (fluentd или syslog), можно использовать collectd для сбора метрик по процессору и памяти.
  • 44. Регистрация сервисов и возможность их обнаружения Можно использовать внешнее средство обнаружения сервисов - у нас используется Consul + DNSMasq Можно использовать swarm и его механизмы обнаружения (тоже consul или etcd) Можно посмотреть на DNS, встроенный в Libnetwork (впервые стабильная сборка появилась в Docker 1.9)
  • 45. Развертывание новых узлов по набору правил и включение в состав кластера Либо установка любого Linux-дистрибутива (с ядром не менее 3.15), либо запуск на железе минималистичного Linux (CoreOS, Atomic) и запуск рабочей среды (docker compose или любой DevOps инструмент - Puppet, Ansible, Salt, Chef, ...) Альтернатива - Docker Machine (особенно для разработчика с Windows или MacOS)
  • 46. Docker machine Запуск образа операционной системы в виртуальной машине (драйвер может быть как локальным - например, Virtualbox, так и облачным - например, ec2). Аналог vagrant, но интегрирован с swarm и входит в состав Docker Toolbox.
  • 47. Docker registry - хранение частных образов организации
  • 48. Продолжение следует... Вторая часть семинара будет по распределённым приложениям в Docker, вопросам миграции контейнеров, использованию Swarm и управлению кластером через Shipyard.
  • 50. Спасибо за внимание! Приходите к нам и приглашайте друзей. Сообщество “ИТ. Герценовский университет”: http://goo.gl/FEieqK Календарь семинаров: http://goo.gl/utyuU0 Дмитрий Золотов dzolotov@herzen.spb.ru