50
DOCKER 1.9 Ваши приложения в удобной упаковке Золотов Дмитрий, ведущий инженер [email protected] Управление информатизации РГПУ им. А.И. Герцена Санкт-Петербург 2015

Docker 1.9

  • Upload
    -

  • View
    675

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Docker 1.9

DOCKER 1.9Ваши приложения в удобной упаковке

Золотов Дмитрий, ведущий инженер

[email protected]

Управление информатизации РГПУ им. А.И. ГерценаСанкт-Петербург

2015

Page 2: Docker 1.9

Своя уютная бухта для каждой программы (в одном океане)

“Cиний кит проявляет склонность к одиночеству в большей степени, чем все остальные китообразные”

[Wikipedia]

Page 3: Docker 1.9

Как использовать?

Тысячи готовых к работе программ (вместе со средой выполнения)

Возможность упаковки своих приложений и запуска на любом узле Linux (а также Windows и MacOS)

Создание кластеров из десятков-сотен-тысяч узлов с распределёнными приложениями (в т.ч. на микросервисах)

Page 4: Docker 1.9

Лучше один раз увидеть

docker run -d -p 10000:80 docker.hspu.local:80/2048http://10.0.16.201:10000

Page 5: Docker 1.9

Модель для сборки - Dockerfile

FROM nginx:latestMAINTAINER Dmitrii Zolotov <[email protected]>ENV DEBIAN_FRONTEND noninteractiveWORKDIR /usr/share/nginx/htmlRUN apt-get update && apt-get install -y git && rm -rf * && git clone https://github.com/gabrielecirulli/2048 .EXPOSE 80CMD ["nginx", "-g", "daemon off;"]

Page 6: Docker 1.9

Отличие от виртуальных машин

Page 7: Docker 1.9

Виртуальная машина (управление через 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", ] endend

Page 8: Docker 1.9

Виртуальная машина

Запускается долго…

Создаёт абстракцию уровня оборудования…

Большая по размеру (т.к. полностью содержит операционную систему)...

Требует много ресурсов для выполнения...

Page 9: Docker 1.9

Контейнеры

...запускаются за доли секунды

...маленькие по размеру (содержат только минимальный набор необходимых библиотек и само приложение)

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

Page 10: Docker 1.9

Революция?

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

lxc

cgroups

namespaces

apparmor

...

Page 11: Docker 1.9

Open Container Initiative

Контейнеры - не на один день.

Достаточно посмотреть на логотипы участниковOpen Container Initiative.

Page 12: Docker 1.9

Open Container Initiative

Единый формат контейнеров - OCF

Автономная, независимая от поставщика, реализация среды выполнения контейнеров - проект runC (создаётся также порт для Windows)

Page 13: Docker 1.9

Как использовать в домашних условиях / на рабочем месте?

Если Linux - всё просто - установить Docker Engine и Docker Client (единый пакет, есть под все основные дистрибутивы)

Если Windows и MacOS - рекомендуется использовать Docker Toolbox, включающий:

docker-machine

docker-engine

docker-compose

Kitematic, Docker GUI

Page 14: Docker 1.9

Kitematic

Интерфейс программы

Page 15: Docker 1.9

Что изолируется?

PID namespace (могут повторяться номера процессов, первый всегда имеет номер 1)

IPC namespace - именованные объекты межпроцессного взаимодействия

mnt namespace - файловая система

net namespace - сеть

uts namespace - версия и параметры ядра

user namespace - изоляция пользователей (в т.ч. администратора)

Page 16: Docker 1.9

Как видит контейнер внешний мир?

● своя файловая система● собственный сетевой

интерфейс (и localhost)● ядро представляется

собственным● межпроцессное

взаимодействие в своём адресном пространстве

● первый процесс в системе с идентификатором 1

Page 17: Docker 1.9

Какой он на самом деле?Внешний мир -> контейнер

Контейнер->внешний мир

Доступ в сеть Только EXPOSE Внешняя сеть доступна, контейнеры общаются внутри хоста

Файловая система Только VOLUME -

Управление процессами

Просмотр состояния, top

Изолированное PID namespace, хост-узел недоступен

Page 18: Docker 1.9

Управление ресурсамиПри запуске контейнера можно указать ограничения

--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 - ограничение по памяти (обычная и с подкачкой)

--cgroup-parent - группировка контейнеров с единым пулом ресурсов

--ulimit - ограничения Linux (количество файлов, размер стека и др.)

Page 19: Docker 1.9

Надёжность и безопасность

--restart - политика перезапуска контейнера (no / on-failure:<max> / always)

--rm=true - очищать изменения в контейнере и восстанавливать исходный образ после перезапуска

--security-opt - использует возможности ОС контейнера (security policy: user / role / type / level или apparmor) для применения ограничений на взаимодействие с внешним миром, запуск приложений и выполнение изменений

Page 20: Docker 1.9

Хитрости

--pid=”host” - позволяет использовать разделяемое пространство идентификаторов процессов для нескольких контейнеров (общее с хост-машиной)

--uts=”host” - единое пространство именования узлов с хост-машиной

--ipc=”container:id | host” - создание единого пространства именования объектов межпроцессного взаимодействия (с узлом или другим контейнером)

--net=”host” - использование сетевого стека хост-машины

--net=”none” - отключение сетевого стека в контейнере

Page 21: Docker 1.9

Связь с внешним миром--volume - связывание каталога хост-машины с каталогом контейнера

--volumes-from - связывание контейнеров через общее хранилище

--add-host - создание записи в /etc/hosts (связывание с узлом)

--dns - использование указанных DNS-серверов (вместо 8.8.8.8)

--link - связывание с другим контейнером через сеть (создаёт запись в /etc/hosts, общаются через подсеть внутри docker)

--publish - связывание tcp/udp-портов из приложения с портами хост-машины

Page 22: Docker 1.9

Docker environment

Переменные окружения могут быть переопределены

docker run --name my-wordpress -e VIRTUAL_HOST=domain.com -d spencercooley/wordpress

Page 23: Docker 1.9

Связывание контейнеров через сеть

Допустим, есть два контейнера с именами: 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

Page 24: Docker 1.9
Page 25: Docker 1.9

Дополнительные возможности

--device - связывание устройств хост-машины с контейнером (например, подключение USB-дисков)

--cap-add, --cap-drop - управление разрешениями Linux-ядра (например, SYS_ADMIN - для монтирования сетевых дисков)

--privileged=true - доступ ко всем функциям ядра (в т.ч. запуск docker внутри docker)

--lxc-conf - параметры в lxc (например, lxc.mount для монтирования сетевых устройств, lxc.utsname - изменения имени узла)

--exec-driver - заменить драйвер контейнера (по умолчанию - lxc)

Page 26: Docker 1.9

Требования к хост-машине

Ядро Linux не менее 3.15 с поддержкой слоевой файловой системы (например, AUFS или BTRFS) и cgroups.

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

Page 27: Docker 1.9

Новое в 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=<метка>)

Page 28: Docker 1.9

Новое в Docker 1.8 (и 1.9)

Плагины для сетевого взаимодействия - создают прозрачную сеть между контейнерами (с использованием libnetwork). Драйверы:

simplebridge - сеть внутри хоста

overlay - распределённая сеть между хостами (встроенная)

weave - распределённая сеть на L2 (Weave)

Page 29: Docker 1.9

Новые команды 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

Page 30: Docker 1.9

Плагины для доступа к системам хранения:

docker run --volume-driver=<название>

Например,

flocker, glusterfs - перемещаемые между узлами хранилища

nfs - хранилище доступно через nfs

rexray - хранение в облачных сервисах (Amazon S3, …)

Новое в Docker 1.8 (и 1.9)

Page 31: Docker 1.9

Взгляд разработчика. Упаковка приложений.

Инструкция по сборке среды выполнения - Dockerfile

Новый образ использует уже существующий, как основу для файловой системы.

Dockerfile:

FROM ubuntu:latest

...

Page 32: Docker 1.9

FROM ubuntu:latest

# Install vnc, xvfb in order to create a 'fake' display and firefoxRUN apt-get update && apt-get install -y x11vnc xvfb firefoxRUN mkdir ~/.vnc# Setup a passwordRUN 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 5900CMD ["x11vnc", "-forever", "-usepw", "-create"]

Dockerfile

Page 33: Docker 1.9

Графические приложения в docker-контейнерах (для тонких клиентов)

ubuntu + application + ssh-server

docker run -p 1000:22 -d …

ssh -X -p 1000 <ip>

графические приложения запускаются с сервера на рабочей станции

Page 34: Docker 1.9

Жизненный цикл контейнера

Без сохранения образов в хранилище:create | pull | build → <изменения> → [diff] → commitС сохранением образов:create | pull | build → tag → pushС переносом образа архивом:save → … → loadС переносом контейнера архивом:create | pull | build → export (создаёт tar) → import

Page 35: Docker 1.9

Просмотр состояния контейнеров

docker images - список загруженных (или собранных или отправленных) образов

docker ps - список активных контейнеров

docker logs <id> - просмотр консоли контейнера (только для log-driver=json)

docker top <id> - активные процессы в контейнере

docker port <id> - просмотр отображенных портов

docker inspect <id> - подробный технический отчёт

Page 36: Docker 1.9

Управление контейнерами

Создание из образа: 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>

Удаление контейнера / образа: docker rm <id> / docker rmi <id>

Page 37: Docker 1.9

FROM - базовый образ

MAINTAINER - контакты ответственного за образ

RUN - запуск команды в контейнере (при сборке)

ADD, COPY - копирование файлов в контейнер (ADD также может распаковывать .tar.gz)

ENV - определение значения переменной системного окружения по умолчанию

EXPOSE - анонс публикации портов (например, 25 или 53/udp)

Инструкции Dockerfile

Page 38: Docker 1.9

Инструкции Dockerfile

VOLUME - анонс возможного связывания с каталогом или файлом

ENTRYPOINT - приложение для запуска при входе в контейнер

WORKDIR - изменение текущего каталога в контейнере

CMD - параметры приложения (могут быть переопределены в RUN)

Page 39: Docker 1.9

Что, если надо запустить несколько связанных приложений?

Например, запустить фоновый php процесс и приложение, которое его использует, а также перехват вывода и отправка в syslog.

Можно использовать supervisord: конфигурация в одном файле, по семантике похожа на systemd.

Page 40: Docker 1.9

Взгляд администратора

Необходимо решить несколько проблем:

координированный запуск нескольких контейнеров

регистрация сервисов и возможность их обнаружения

мониторинг состояния контейнеров (как снаружи, так и внутри)

развертывание новых узлов по набору правил и включение в состав кластера

Page 41: Docker 1.9

Координированный запуск нескольких контейнеров

В случае отсутствия циклических зависимостей - регистрация контейнеров (в /etc/docker) и их запуск средствами docker daemon (для создания можно использовать, например, puppet)

Docker compose (декларация набора контейнеров вместе с параметрами и связями, также возможна сборка)

В случае циклических связей или необходимости запускать контейнеры на разных узлах - создать прокси и предварительно запускать его (ambassador pattern).

Page 42: Docker 1.9

Docker composeweb: build: web command: python app.py ports: - "5000:5000" volumes: - web:/code links: - redisredis: 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

Page 43: Docker 1.9

Мониторинг состояния контейнеров (как снаружи, так и внутри)

Снаружи: docker swarm агрегирует информацию о контейнерах, либо внешняя проверка. У нас: consul health check

Внутри: захват логов (fluentd или syslog), можно использовать collectd для сбора метрик по процессору и памяти.

Page 44: Docker 1.9

Регистрация сервисов и возможность их обнаружения

Можно использовать внешнее средство обнаружения сервисов - у нас используется Consul + DNSMasq

Можно использовать swarm и его механизмы обнаружения (тоже consul или etcd)

Можно посмотреть на DNS, встроенный в Libnetwork (впервые стабильная сборка появилась в Docker 1.9)

Page 45: Docker 1.9

Развертывание новых узлов по набору правил и включение в состав кластера

Либо установка любого Linux-дистрибутива (с ядром не менее 3.15), либо запуск на железе минималистичного Linux (CoreOS, Atomic) и запуск рабочей среды (docker compose или любой DevOps инструмент - Puppet, Ansible, Salt, Chef, ...)

Альтернатива - Docker Machine (особенно для разработчика с Windows или MacOS)

Page 46: Docker 1.9

Docker machine

Запуск образа операционной системы в виртуальной машине (драйвер может быть как локальным - например, Virtualbox, так и облачным - например, ec2).

Аналог vagrant, но интегрирован с swarm и входит в состав Docker Toolbox.

Page 47: Docker 1.9

Docker registry - хранение частных образов организации

Page 48: Docker 1.9

Продолжение следует...

Вторая часть семинара будет по распределённым приложениям в Docker, вопросам миграции контейнеров, использованию Swarm и управлению кластером через Shipyard.

Page 49: Docker 1.9

ВАШИ ВОПРОСЫ?

Page 50: Docker 1.9

Спасибо за внимание!

Приходите к нам и приглашайте друзей.Сообщество “ИТ. Герценовский университет”: http://goo.gl/FEieqK

Календарь семинаров: http://goo.gl/utyuU0

Дмитрий Золотов[email protected]