
> Часть 1: основы
> Часть 2: термины и концепции
> Часть 3: файлы Dockerfile
Термины экосистемы Docker
Я разбил термины, с которыми вы можете столкнуться в ходе работы с Docker, на две части. Думаю, это облегчит их запоминание. Первый блок терминов будет относиться к механизмам Docker. Второй — к средствам масштабирования решений, основанных на контейнерах.
Механизмы Docker
?Платформа Docker

Docker
Платформа Docker (Docker Platform) — это программа, которая даёт нам возможность упаковывать приложения в контейнеры и запускать их на серверах. Платформа Docker позволяет помещать в контейнеры код и его зависимости. Как результат, системы, основанные на контейнерах, легко масштабировать, так как контейнеры можно переносить и воспроизводить.
?Движок Docker

Движок
Движок Docker (Docker Engine) — это клиент-серверное приложение. Компания Docker разделила движок Docker на два продукта. Docker Community Edition (CE) — это бесплатное ПО, во многом основанное на опенсорсных инструментах.
Вероятно, вы будете пользоваться именно этой версией Docker. Docker Enterprise — это платная версия системы, дающая пользователям дополнительные возможности в области поддержки систем, управления ими и безопасности. Платная версия Docker даёт компании средства, необходимые для её существования.
?Клиент Docker

Клиент Docker и другие механизмы экосистемы (взято из документации)
Клиент Docker (Docker Client) — это основное средство, которое используют для взаимодействия с Docker. Так, при работе с интерфейсом командной строки Docker (Docker Command Line Interface, CLI), в терминал вводят команды, начинающиеся с ключевого слова
docker
, обращаясь к клиенту. Затем клиент использует API Docker для отправки команд демону Docker.?Демон Docker
Демон Docker (Docker Daemon) — это сервер Docker, который ожидает запросов к API Docker. Демон Docker управляет образами, контейнерами, сетями и томами.
?Тома Docker

Тома
Тома Docker (Docker Volumes) представляют собой наиболее предпочтительный механизм постоянного хранения данных, потребляемых или производимых приложениями.
?Реестр Docker
Реестр Docker (Docker Registry) представляет собой удалённую платформу, используемую для хранения образов Docker. В ходе работы с Docker образы отправляют в реестр и загружают из него. Подобный реестр может быть организован тем, кто пользуется Docker. Кроме того, поставщики облачных услуг могут поддерживать и собственные реестры. Например, это касается AWS и Google Cloud.
?Хаб Docker
Хаб Docker (Docker Hub) — это самый крупный реестр образов Docker. Кроме того, именно этот реестр используется при работе с Docker по умолчанию. Пользоваться хабом Docker можно бесплатно.
?Репозиторий Docker
Репозиторием Docker (Docker Repository) называют набор образов Docker, обладающих одинаковыми именами и разными тегами. Теги — это идентификаторы образов.
Обычно в репозиториях хранятся разные версии одних и тех же образов. Например, Python — это имя популярнейшего официального репозитория Docker на хабе Docker. А вот Python:3.7-slim — это версия образа с тегом 3.7-slim в репозитории Python. В реестр можно отправить как целый репозиторий, так и отдельный образ.
Теперь поговорим о терминах экосистемы Docker, имеющих отношение к масштабированию.
Масштабирование решений, основанных на контейнерах
Следующие четыре термина имеют отношение к одновременному использованию нескольких контейнеров.
?Сеть Docker

Сеть Docker (взято из документации)
Сетевые механизмы Docker (Docker Networking) позволяют организовывать связь между контейнерами Docker. Соединённые с помощью сети контейнеры могут выполняться на одном и том же хосте или на разных хостах. Подробности о сетевой подсистеме Docker можно почитать здесь.
?Docker Compose
Docker Compose — это инструмент, который упрощает развёртывание приложений, для работы которых требуется несколько контейнеров Docker. Docker Compose позволяет выполнять команды, описываемые в файле
docker-compose.yml
. Эти команды можно выполнять столько раз, сколько потребуется. Интерфейс командной строки Docker Compose упрощает взаимодействие с многоконтейнерными приложениями. Этот инструмент устанавливается при установке Docker.?Docker Swarm

Рой пчёл
Docker Swarm — это решение, предназначенное для управления контейнерными развёртываниями (то есть, как говорят, для оркестрации контейнеров). В этом материале из официального учебного курса по Docker можно найти сведения о Docker Swarm. Мне хотелось бы порекомендовать вам не тратить время на изучение Docker Swarm в том случае, если у вас нет на то веской причины.
?Сервисы Docker
Сервисы Docker (Docker Services) — это различные части распределённого приложения. Вот что о них говорится в документации:
Сервисы — это всего лишь «контейнеры в продакшне». В пределах сервиса выполняется лишь один образ, но сервис определяет то, как именно выполняется образ. В частности, речь идёт о том, какие порты должны использоваться, сколько реплик контейнера должно выполняться для того, чтобы сервис обеспечивал бы необходимую вычислительную мощность, и так далее. Масштабирование сервисов предусматривает изменение количества экземпляров контейнера, в которых работает некая программа, благодаря чему сервису выделяется столько системных ресурсов, сколько ему требуется для решения некоей задачи.
Сервисы Docker позволяют масштабировать контейнеры в пределах нескольких демонов Docker, благодаря им существует и технология Docker Swarm.
Краткий перечень терминов
Давайте, буквально в двух словах, повторим только что представленные вам термины:
Механизмы Docker:
- Платформа Docker — ПО, благодаря которому можно работать с контейнерами.
- Движок Docker — клиент-серверное приложение (CE или Enterprise).
- Клиент Docker — программа, которая позволяет взаимодействовать с демоном Docker посредством CLI.
- Демон Docker — сервер Docker, отвечающий за управление ключевыми механизмами системы.
- Тома Docker — хранилище информации, используемое в контейнерах.
- Реестр Docker — удалённое хранилище образов.
- Хаб Docker — самый крупный реестр Docker, используемый по умолчанию.
- Репозиторий — коллекция образов Docker с одним и тем же именем.
Масштабирование:
- Сетевая подсистема Docker — среда, которая позволяет организовывать взаимодействие контейнеров.
- Docker Compose — технология, упрощающая работу с многоконтейнерными приложениями.
- Docker Swarm — средство для управления развёртыванием контейнеров.
- Сервисы Docker — контейнеры в продакшне.
Выше мы говорили о том, что рассмотрим дюжину терминов экосистемы Docker, сравнивая их с дюжиной пончиков. Мы рассмотрели уже 12 терминов, и, казалось бы, на этом можно и остановиться. Но мы, на всякий случай, добавим в наш список ещё один термин.

Вот, на всякий случай, ещё один пончик
Этот термин относится не к самой платформе Docker, а к технологии, которая очень часто используется совместно с Docker.
Kubernetes

Kubernetes
Kubernetes — это технология, которая позволяет автоматизировать развёртывание и масштабирование контейнеризированных приложений, а также управление ими. Это — бесспорный лидер рынка средств для оркестрации контейнеров. Если вам нужен инструмент для работы с группами контейнеров, для масштабирования решений, основанных на них, используйте не Docker Swarm, а Kubernetes. Kubernetes не является частью Docker. Они с Docker, скорее, похожи на лучших друзей.
Теперь, когда вы ознакомились с общими понятиями Docker и с терминологией, вы можете приступить к практическим экспериментам.
Итоги: печём пончики с Docker
Помните, как в прошлый раз мы сравнивали платформу Docker с духовкой, которую устанавливают в кухне? Сейчас самое время установить Docker на вашей «кухне» и что-нибудь приготовить.
Docker можно запускать локально на Linux, Mac и Windows. Если вы пользуетесь Mac или Windows, вы можете установить свежую версию Docker Desktop отсюда. Вместе с этой программой, кстати, устанавливается и Kubernetes. Если вы устанавливаете Docker на другой платформе, то загляните сюда для того, чтобы найти подходящую версию.
После установки Docker взгляните на первые две части официального руководства.
В следующий раз мы продолжим разговор о Docker. В частности, поговорим о файлах Dockerfile.
Уважаемые читатели! Если, читая материалы этой серии, вы открываете для себя Docker, просим рассказать о том, как вы планируете использовать технологии контейнеризации приложений.

Комментарии (24)
rjhdby
14.02.2019 15:00Вопрос возможно дурацкий, но все же.
Docker можно запускать локально на Linux, Mac и Windows.
Насколько оно кроссплатформено в итоге?
Вот под windows, например, заведется линуксовый контейнер?barsuksergey
14.02.2019 15:22+1Не дурацкий, нормальный вопрос.
У нас бэки, которые на юниксах, всё готовят в докерах для фронтов, которые на Widnows. Неустранимых проблем не было.
Вообще, на windows поднимается любой *nix: Ubuntu, alpine, FreeBSD.
И там вы творите всё, что душе угодно.DieSlogan
14.02.2019 15:38Ой, вот купился я на то, что под Windows можно легко и просто запускать Linux Docker контейнеры.
Сначала выяснили, что если это Windows сервер под VMWare, то во-первых важна версия. Ниже определенной не работает Hyper-V. Linux хостов это ограничение не касается, кстати.
Затем, когда проапгрейдили версию, все равно не заработало. Выделили физическую железку. Под ней тоже пляски с бубном: то оно сходу не поднимается, надо убить процесс, потом стартовать приложение под правами админа и тому подобное.
В GitHub issues for Windows уже пару лет не закрытые проблемы на винду.
Ну и самое обидное, что на рабочем виндовом компе всё работает.eggstream
14.02.2019 16:22Учитывая, что если включить VMWare/Hyper-V, то, фактически, перестают работать другие виртуалки, то у нас многие не заморачиваются с «нативным» докером под виндой, а ставят в Virtualbox любой серверный линукс и ставят докер уже на него. С одной стороны, добавляется немного головной боли на пробрасывание ресурсов туда-сюда, с другой — нет проблем с несовместимостью VMWare/Hyper-V, всё отлично работает хоть из-под XP
barsuksergey
14.02.2019 19:49Ну что ж делать, пляски с бубном никто не отменял. За это и платят DevOps-ам хорошие зарплаты на уровне сисадминов и программистов.
Если говорить о моих личных предпочтениях, отчего я не пожалею времени на развёртывание докеров:
docker system prune -a
Потому что мне кажется это в разы проще, чем сперва понаставить mysql, postgres, rabbit и прочих спутников жизни, а потом мучительно удалять их. Не говоря уже о каких-нибудь OpenSSL, которые я вообще уже не представляю, как в Windows втыкать и можно ли в принципе это делать.
UltraMax
14.02.2019 16:36Подскажите пожалуйста прав ли я. Использование Докера оправдано в том случае, если потом это же приложение будет работать в другом месте под Докером — тогда не надо будет ничего перенастраивать.
Если же я локально делаю что-то под докером, а потом переношу это (условно) на хостинг, где докерами и не пахнет, я имею точно такие же шансы заиметь проблемы с разными настройками, несовместимостями и т.п. как и если бы я разрабатывал приложение под обычной ОС?
FoterIS
15.02.2019 22:37Подскажите, а где хранить docker compose если две части приложения находятся в разных репозиториях, но должны взаимодействовать на продакшине?
kost
16.02.2019 03:28У меня примерно так:
|-- docker-compose
|-- service-1
|-- service-2
`-- service-3
service-1, service-2, service-3 хранятся в разных репозиториях.
WebMonet
Объясните мне кто-нибудь, а для чего мне все это нужно? Усть у меня сервер, на нем нормально крутится nginx + php + mysql и всякое такое.
Что мне дает запихивание этих сервисов в контейнеры? (стабильность, производительность etc...)
Где (dev / prod) это делать уместно, а где нет?
Как все это администрировать? Если обычно у меня есть "$service --status-all" [start|stop|resrtart|reload], что делать при перемещении сервисов в контейнеры?
В общем пока для меня докер создал больше вопросов, чем ответов.
Единственный действительно ощутимый плюс — кросплатформенность. В докере (на Deb 8) у меня отлично заработало приложение предназначенное исключительно для CentOS.
WebMonet
Вот здесь есть удобная площадка для тренировки labs.play-with-docker.com
eggstream
Bonio
Не понимаю, внутри докера ОС ведь будет та же, что и на хосте? Или это похоже на OpenVZ контейнер, где можно поставить любую ОС?
buffalobill571
Докер использует лишь ядро. ОС, а точнее, дистрибутив Линукса, по сути набор программ и утилит поверх ядра. Вот Докер так и делает
Bonio
OpenVZ делает так же. Чем docker от OpenVZ отличается?
Lugark
Да, в контейнере может быть любая система
eggstream
Докер использует от хостового линукса только ядро (это если говорить упрощенно). Поэтому внутри контейнера можно поднять абсолютно любой дистрибутив. Часто там используются специально заточенные под использование внутри контейнера минимальные версии дистрибутивов. OpenVZ использует очень похожий подход, но сложнее в использовании и не имеет столь широкой базы готовых контейнеров
Bonio
У меня есть web приложение, работающее на nginx + php + mysql + несколько консольных утилит, сейчас работает на отдельной физической машине. Docker подходит для запуска всего этого в контейнере? Хотелось бы избавиться от отдельной физической машины.
Я просто вчера почитал про docker и я так понял, что основной подход, который он проповедует, это одно приложение в одном контейнере. Может я не прав, но по моему это перебор. Например есть образы с одним только phpmyadmin или вообще только с одним composer, это же дикий overhead.
eggstream
Для вас оптимально будет использовать docker-compose с тремя контейнерами — отдельно nginx, отдельно mysql (можно брать прямо официальные образы), отдельно php-fpm+утилиты (скорее всего придется сбилдить свой образ на основе официального, но это несложно, в него же можно прикрутить composer с phpmyadmin), возможно еще +контейнер под хранение файлов если связку предполагается таскать с машины на машину. Можно заводить отдельный контейнер на phpmyadmin, а можно и нет. Но работать с кучей небольших официальных образов контейнеров часто проще, чем городить один свой, в котором запихнуто всё. И вся эта конструкция будет элементарно запускаться/глушиться одной командой.
Bonio
Спасибо.
А почему nginx и mysql не поставить в тот же контейнер, где и php-fpm с утилитами? Может mysql вообще на хост машине оставить с отдельной учетной записью?
Я, наверное, чего-то до конца не понимаю, но мне пока не очень понятна вот эта концепция с кучей контейнеров.
Да, еще nginx и утилиты у меня из исходников собранные, в docker не будет проблем со сборкой из исходников?
eggstream
Потому что гораздо быстрее взять готовые образы и подключить их к связке, чем устанавливать их внутрь контейнера основного приложения. И бонусом получить горизонтальное масштабирование на проде
Bonio
У меня nginx с модулями собран, готовый мне не подойдет.
То есть в принципе это как кому удобнее и ничто не мешает все в один контейнер поставить?
eggstream
Абсолютно. Вы не получите некоторой части плюшек, связанных с модульностью, например горизонтальное масштабирование, но это будет вполне работоспособное решение — преимущества стандартного и изолированного окружения, а также возможность разворачивания через службы CI/CD никуда не деваются
kayan
Возможность поднять ещё десяток таких же серверов одной строкой.
docker logs, docker start, docker inspect...
Докер позволяет сформировать и сохранить стабильную и воспроизводимую в любом месте и количестве среду для работы приложений.
Соответственно, правильно собирая докерные кубики — можно быстро экспериментировать с композициями приложений, не отвлекаясь на артефакты установок-переустановок, общие зависимости и взаимные побочные эффекты.
DieSlogan
Простой ответ — docker ps.
Но учитывая, что у вас простое приложение и вы не задумываетесь о репликации, то вам не нужен докер.
Потому что, когда вам понадобится докер, вам понадобится:
1. Билд-сервер (Jenkins/TeamCity/etc), потому как не удобно готовить контейнеры ручками. А тут сервер, который берет из git-а и автоматизирует
2. Либо DockerHub, либо локальный репозитарий. Если репозитарий локальный, то вам понадобится сертификат (действительный, либо самоподписанный но который принимают сервера)
3. Watchdog на хост-сервере, чтобы следит за обновлениями в репозитарии.
В итоге, у вас будет инфраструктура, в которой по пушу будет собираться приложение, выкладываться в репозитарий и ставится в прод или в тест.