Docke r: Фасадные панели для наружной отделки дома — купить облицовочные панели для фасада от «Дёке»

Содержание

Siding from manufacturer | Docke high standard

г. Сочи

г. Краснодар

г. Новороссийск

Ст. Динская

г. Апшеронск

г. Хадыженск

г. Усть-Лабинск

г. Белореченск

г. Майкоп

п. Мостовской

г. Курганинск

с. Тбилисская

ст. Северская

п. Яблоновский

ст. Холмская

г. Туапсе

х. Трудобеликовский

г. Тихорецк

г. Тимашевск

г. Темрюк

ст. Тбилисская

ст. Тамань

ст. Старотитаровская

ст. Старомышастовская

ст. Стародеревянковская

ст. Старовеличковская

г. Славянск-на-Кубани

ст. Рязанская

г. Приморско-Ахтарск

ст. Полтавская

ст. Петровская

ст. Отрадная

ст. Новотитаровская

с. Гайдук

пгт Новомихайловский

г. Новокубанск

пгт Мостовской

ст. Михайловская

ст. Ленинградская

ст. Ладожская

г. Лабинск

г. Крымск

г. Кропоткин

г. Кореновск

ст. Каневская

ст. Казанская

пгт Ильский

ст. Ивановская

ст. Динская

пгт Джубга

г. Гулькевичи

ст. Гостагаевская

г. Горячий Ключ

ст. Гиагинская

г. Геленджик

ст. Выселки

ст. Воронежская

ст. Варениковская

с. Брюховецкая

с. Белая Глина

п. Ахтырский

пгт Афипский

п. Архипо-Осиповка

г. Армавир

г. Анапа

г. Адыгейск

г. Абинск

пгт. Мостовской

Фасадные панели Döcke-R серии STEIN (Штайн) — Новый Квартал Саранск

Получить скидку
Описание товара
Габаритная длина: 1 196 мм
Габаритная ширина: 426 мм
Количество в коробке: 10 шт.
Вес коробки (брутто): 20,6 кг

Фасадные панели Döcke-R серии STEIN (Штайн) — прекрасный выбор оформления фасада Вашего дома. Данная серия объединяет в себе красивейшую фактуру натурального камня и эстетичность цветовых решений. Вы по достоинству оцените итоговый внешний вид Вашего здания облицованного фасадными панелями серии «Штайн»
_______________________________________________________________________
Преимущества фасадных панелей Döcke-R:
— надежность и безупречное качество панелей
— стопроцентное 3D воспроизведение фактур натуральных материалов
— срок службы до 50-ти лет ! (официальная гарантия производителя)
— не подвержен коррозии
— отличное шумопоглощение (в отличии от металлического сайдинга)
— высокая устойчивость к деформации и вмятинам (в отличии от металлического сайдинга)

— малый вес и легкость монтажа
___________________________________________________________________________
Полное описание фасадных панелей Döcke-R:
Воспроизводя текстуры панелей линеек Döcke-R технологами и дизайнерами компании Дёке использовались трехмерные 3D-модели натурального камня, применявшегося в строительстве средневековых замков Германии.
Фасадные панели «Дёке» — это высокотехнологичный современный фасадный материал, обладающий полным набором характеристик отвечающих мировым требованиям и стандартам качества.
Фасадные панели применяются не только для облицовки всего фасада здания, но и в том числе для облицовки отдельно фундамента (цоколя) дома. Именно поэтому данный вид панелей еще называется «Цокольным сайдингом».

Фасадные панели Дёке не просто украшение Вашего дома и придание ему респектабельного вида, но это ещё и защита фасада здания от неблагоприятных воздействий окружающей среды (ветра, дождя, снега, града и тд).
Обратите внимание, что вся линейка фасадных панелей «Дёке-Р», в том числе и серия «Штайн», отлично сочетается с любой из серий винилового сайдинга Дёке (будь то «БлокХаус, или «Корабельный брус» ….).

Данный вид сайдинга Дёке не подвержен деформации и растрескиванию, устойчив к выцветанию, отлично поглощает шумы от дождя и мелкого града, неприхотлив в уходе и очень прост в монтаже. Так же он позволяет «дышать» фасаду, что зачастую имеет очень важное значение для утеплителей и подсистемы.
При производстве «цокольного сайдинга» Дёке используются только высококачественные материалы европейских производителей. Всё оборудование так же европейского производства (Германия, Австрия). На заводе осуществляется высочайший контроль качества изготавливаемой продукции. Всё это подтверждается теми серьёзными гарантийными обязательствами (до 50-ти лет), которые берёт на себя производитель Döcke («Дёке Экстружн»).

  • Выбор цвета
  • Фасады домов

DÖCKE-R

ЦОКОЛЬНЫЙ САЙДИНГ DOCKE

Холдинг группа Дёке — один из лидирующих производителей высококачественных отделочных материалов для загородного домостроения. Наличие собственных производственных мощностей дает существенное преимущество перед конкурентами позволяя создавать большой ассортиментный ряд продукции для массового потребления.

Фасадные панели Docke – прочный, долговечный и ,несомненно, красивый облицовочный материал, который легко освежит облик любого здания. Уникальные разработки позволяют с удивительной точностью воссоздать текстуру и цвет дорогих облицовочных материалов: камня, песчаника, кирпича и т.п.

Панели Деке — настоящая инновация на рынке стройматериалов России. Они не просто подарят вашему дому аккуратный и оригинальный вид, но и сохранят стены от вредного воздействия погодных условий на долгие годы. Срок службы, установленный производителем на свою продукцию, составляет до 50 лет.

Высокое качество фасадной продукции Docke — гордость сотрудников компании. Для производства используется исключительно отборное сырье и компоненты (модификаторы, красители, наполнители и пр.) мировых брендов DuPont, Arcema, Kronos, Master Tec. Все ПВХ изделия Дёке соответствуют европейским стандартам качества и проходят жесточайший контроль на каждом этапе производства.

Интересный факт

Торговая марка Дёке, которая является частью немецкого концерна D.o.C.K.E. Systemlosungen Gmbh, появилась в России сравнительно недавно — в 2005 году. За короткий период компания смогла возвести два крупных производственных комплекса (в г. Дмитрове Московская обл. и г. Киржач Владимировская обл.), которые оснащены новейшим европейским оборудованием для производства экструзионных материалов. На заводах холдинг группы Деке успешно изготавливаются не только полимерные фасадные панели, но и виниловый сайдинг и водосточные системы из ПВХ.


ФАСАДНЫЕ ПАНЕЛИ DOCKE R: БЕЗУПРЕЧНОЕ КАЧЕСТВО ТОВАРА В ЦИФРАХ

Сегодня ТМ Дёке в России имеет в своей копилке немало достижений, главное из которых — создание качественной фасадной продукции по конкурентоспособной цене.

Высокая популярность достигается за счет:

  • 1000 специалистов, прошедших обучения в собственном учебном центре, и обладающих самыми глубокими знаниями о продукции Docke R.
  • Постоянного обновления ассортимента, расширения модельного ряда сайдинга и облицовочных материалов;
  • Более 10 представительств во всех крупнейших регионах России, странах СНГ и Дальнего Востока;
  • Собственного производства, что позволяет достичь годового объема выпуска винилового сайдинга в 10 млн.м2, фасадных панелей — в 1,5 млн.м2.
  • Широкой сети оптовых и розничных продаж на территории РФ и СНГ;
  • Миллионов довольных клиентов, сделавших выбор в пользу сайдинга Деке для отделки своих домов.

Остерегайтесь подделки и покупайте только сертифицированную продукцию. Рекомендуем обратиться к проверенному дилеру Декке — компании Строительный бутик, чтобы купить виниловые фасадные панели DÖCKE-R в Азове и Ростове-на-Дону.


7 ПОВОДОВ, ЧТОБЫ КУПИТЬ ФАСАДНЫЕ ПАНЕЛИ ДЕККЕ
  1. Ассортимент представлен 6-ю коллекциями и 38 различными оттенками, правдоподобно имитирующими натуральный камень разных пород;
  2. Панели обладают повышенной прочностью, устойчивы к ветровым и механическим нагрузкам за счет наличия дополнительных ребер жесткости;
  3. Компактный размер и небольшой вес делает работу с панелями комфортной, а также снижает нагрузку на фундамент;
  4. При монтаже не требуется клей или цемент, что сокращает время установки и делает процесс более аккуратным;
  5. Панели не выгорают на солнце, сохраняя оригинальный цвет.
  6. Материал не требует специального ухода, т.к. ПВХ прекрасно самоочищается под дождем или моется обычной водой;
  7. Невысокая стоимость, делающая фасадные панели Деке доступными для широкого круга потребителей.

Отличия панелей Docke-R от других фасадных материалов ⋆ Стройка Маркет

Главная ► Новости ► Отличия панелей Docke-R от других фасадных материалов

Компания «Дёке Экстружн» — один из крупнейших производителей винилового сайдинга, водосточных систем PVC и стеновых фасадных панелей на территории России. Вся продукция выпускается по лицензии и под контролем немецкой компании «D.Ö.C.K.E. Systemlosungen Gmbh», Берлин, Германия.
На российском рынке продукция компании представлена с апреля 2005 года, за эти годы мы накопили большой опыт в производстве самых передовых отделочных материалов, удовлетворяющих высочайшим стандартам европейского качества.
Производство фасадных панелей Docke-R размещается в подмосковном Дмитрове и оборудовано по последнему слову техники.Панели производятся методом горячего литья под давлением, с последующим окрашиванием по специальной технологии. Материал, из которого изготавливаются фасадные панели Docke-R, – современный, прочный, термостойкий, не подверженный коррозии и гниению полимер – полипропилен. В его состав дополнительно включены специальные добавки, обеспечивающие морозостойкость, пластичность, устойчивость к UF-излучению.
Отличия панелей Docke-R от других фасадных материалов:

  • Долговечность и реальная гарантия от производителя. Срок службы фасадных панелей Docke-R при условии правильного монтажа и соблюдения правил по уходу – 50 лет. Каждый покупатель получает от нас гарантийный сертификат, подтверждающий заявленные сроки. Согласитесь, 50 лет – отличный срок службы для любого приобретения. И это не просто годы – это полвека радости, удовольствия и удобства, которые дарят вам фасадные панели Docke-R.
  • Привлекательная цена. Роскошный внешний вид дома и участка гораздо доступнее, чем кажется! Сравните цены на панели Docke-R и на натуральные материалы, необходимые для отделки. При сравнимом внешнем виде, расходы на натуральные материалы будут на порядок выше. Зачем же платить больше, если в этом мире есть столько замечательных вещей, на которые можно потратить сэкономленные деньги?
  • Универсальность применения. Фасадные панели Docke-R  гарантируют сочетание казалось бы несовместимых достоинств: индивидуальность и долговечность. Оформите фасад целиком, облицуйте фундамент, выделите отдельные архитектурные элементы. Решение с чего начать – за вами. Но будьте готовы к тому, что вам это понравится! А еще Döcke-R отлично сочетается с другими продуктами из ассортимента Docke.
  • Натуральный внешний вид. Know how Docke-R– сложные цветовые схемы каждой из коллекций выпускаются в 3-х видах тонирования, что исключает эффект визуальной повторяемости панелей и способствует приданию фасаду максимально натурального вида. Естественные текстуры и широкая цветовая палитра предоставляют возможности неограниченного творчества при создании дизайна фасада.
  • Уникальность и прочность конструкции. Усиленные ребра жесткости (Intensiv +) обеспечивают дополнительную жесткость, ветро- и удароустойчивость, стойкость к деформациям, а значит – долговечность!
  • Надежная система замков (Dockershloss +). В сочетании с мощными ребрами жесткости позволяет добиться особо надежного соединения панелей между собой, не усложняя при этом процесс монтажа. Вашему новому замку не будут страшны ветра и ураганы!
  • Специальные упоры (Geometry +). Делают возможным сохранение правильных тепловых зазоров для обеспечения неизменной геометрии во время всего периода эксплуатации. Июльская жара или февральская стужа – Döcke-R все нипочем. Будьте уверены в нас в любую погоду!
  • Стойкость цвета. Уникальная трехступенчатая система окраски (Standfest+) делает панели невосприимчивыми к солнечным UF-лучам и природным осадкам. Ноу хау Döcke-R является применение сплошной окраски панели, включая швы. При этом способе окраски швы также защищены слоем краски, как и основная панель.
  • Практичность. Стеновые панели Docke-R подарят не только замечательный внешний вид вашему дому, но и минимум две недели дополнительного летнего отдыха! Ведь теперь вместо ремонта и подкраски ваших деревянных домов и заборов, можно просто отдыхать с друзьями, наслаждаясь солнцем и вкусным шашлыком. А если вдруг очень захочется поработать – просто помойте панели за 10 минут из садового шланга!
  • Удобство монтажа. Только в панелях Docke-R предусмотрены утопленные отверстия для крепежных саморезов. Благодаря этому исключены помехи соединению панелей от выступающих головок крепежа.
  • Простота монтажа. Фасадные панели Docke-R не требуют специальных навыков при установке. Вы умеете пользоваться шуруповертом? Отлично! Прочитайте инструкцию по монтажу, приготовьте простые инструменты и материалы, и – за дело. Будьте уверены – супруга будет довольна. Ведь вы можете все! Даже замок построить!
  • Практичность. Стеновые панели Docke-R подарят не только замечательный внешний вид вашему дому, но и минимум две недели дополнительного летнего отдыха! Ведь теперь вместо ремонта и подкраски ваших деревянных домов и заборов, можно просто отдыхать с друзьями, наслаждаясь солнцем и вкусным шашлыком. А если вдруг очень захочется поработать – просто помойте панели за 10 минут из садового шланга!

Отделка дома панелями Docke-R

с нуля до кластера на AWS / Хабр

Содержание



Вопросы и ответы


Что такое Докер?

Определение Докера в Википедии звучит так:


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


Ого! Как много информации. Простыми словами, Докер это инструмент, который позволяет разработчикам, системными администраторам и другим специалистам деплоить их приложения в песочнице (которые называются контейнерами), для запуска на целевой операционной системе, например, Linux. Ключевое преимущество Докера в том, что он позволяет пользователям упаковать приложение со всеми его зависимостями в стандартизированный модуль для разработки. В отличие от виртуальных машин, контейнеры не создают такой дополнительной нагрузки, поэтому с ними можно использовать систему и ресурсы более эффективно.


Что такое контейнер?

Стандарт в индустрии на сегодняшний день — это использовать виртуальные машины для запуска приложений. Виртуальные машины запускают приложения внутри гостевой операционной системы, которая работает на виртуальном железе основной операционной системы сервера.

Виртуальные машины отлично подходят для полной изоляции процесса для приложения: почти никакие проблемы основной операционной системы не могут повлиять на софт гостевой ОС, и наоборот. Но за такую изоляцию приходится платить. Существует значительная вычислительная нагрузка, необходимая для виртуализации железа гостевой ОС.

Контейнеры используют другой подход: они предоставляют схожий с виртуальными машинами уровень изоляции, но благодаря правильному задействованию низкоуровневых механизмов основной операционной системы делают это с в разы меньшей нагрузкой.


Почему я должен использовать их?

Взлет Докера был по-настоящему эпичным. Не смотря на то, что контейнеры сами по себе — не новая технология, до Докера они не были так распространены и популярны. Докер изменил ситуацию, предоставив стандартный API, который сильно упростил создание и использование контейнеров, и позволил сообществу вместе работать над библиотеками по работе с контейнерами. В статье, опубликованной в  The Register в середине 2014 говорится, что Гугл поддерживает больше двух миллиардов контейнеров в неделю.

Google Trends для слова ‘Docker’

В дополнение к продолжительному росту Докера, компания-разработчик Docker Inc. была оценена в два с лишним миллиарда долларов! Благодаря преимуществам в эффективности и портативности, Докер начал получать все больше поддержки, и сейчас стоит во главе движения по контейнеризации (containerization). Как современные разработчики, мы должны понять этот тренд и выяснить, какую пользу мы можем получить из него.


Чему меня научит это пособие?

Это единое и полное пособие по всем аспектам работы с Докером. Кроме разъяснения мифов о Докере и его экосистеме, оно позволит вам получит небольшой опыт по сборке и деплою собственных веб-приложений в облаке. Мы будем использовать Amazon Web Services для деплоя статичных сайтов, и два динамических веб-приложения задеплоим на EC2 с использованием Elastic Beanstalk и Elastic Container Service. Даже если вы никогда ничего не деплоили, это пособие даст вам все необходимое.


Как использовать этот документ

Этот документ содержит несколько разделов, каждый из которых посвящен определенному аспекту Докера. В каждом разделе мы будем вводить команды или писать код. Весь код доступен в репозитории на Гитхабе.


Введение


Внимание: В этом пособии используется версия Докера 1.12.0-rc2. Если вы столкнулись с несовместимостью, пожалуйста, отправьте issue. Спасибо!



Пре-реквизиты

Все, что нужно для прохождения этого пособия — это базовые навыки с командной строкой и текстовым редактором. Опыт разработки веб-приложений будет полезен, но не обязателен. В течение работы мы столкнемся с несколькими облачными сервисами. Вам понадобится создать аккаунт на этих сайтах:



Настройка компьютера

Установка и настройка всех необходимых инструментов может быть тяжелой задачей, но, к счастью, Докер стал довольно стабильным, и установка и запуск его на любой ОС стало очень простой задачей. Итак, установим Докер.


Докер

Еще несколько релизов назад запуск Докера на OS X и Windows был был проблемным. Но команда разработчиков проделала огромную работу, и сегодня весь процесс — проще некуда. Этот туториал getting started включает в себя подробные инструкции по установке на Мак, Linux и Windows.

Проверим, все ли установлено корректно:

$ docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.
...


Python

Python обычно предустановлен на OS X и на большинстве дистрибутивов Linux. Если вам нужно установить Питон, то скачайте установщик здесь.

Проверьте версию:

$ python --version
Python 2.7.11

Мы будем использовать pip для установки пакетов для нашего приложения. Если pip не установлен, то скачайте версию для своей системы.

Для проверки запустите такую команду:

$ pip --version
pip 7.1.2 from /Library/Python/2.7/site-packages/pip-7.1.2-py2.7.egg (python 2.7)


Java (не обязательно)

Разрабатываемое нами приложение будет использовать Elasticsearch для хранения и поиска. Для локального запуска Elasticsearch вам понадобится Java. В этом пособии все будет запускаться внутри контейнера, так что локально не обязательно иметь Java. Если Java установлена, то команда java -version должна сгенерировать подобный вывод:

$ java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)




1.0 Играем с Busybox

Теперь, когда все необходимое установлено, пора взяться за работу. В этом разделе мы запустим контейнер Busybox на нашей системе и попробуем запустить docker run.

Для начала, запустите следующую команду:

$ docker pull busybox


Внимание: в зависимости от того, как вы устанавливали Докер на свою систему, возможно появление сообщения permission denied. Если вы на Маке, то удостоверьтесь, что движок Докер запущен. Если вы на Линуксе, то запустите эту команду с sudo. Или можете создать группу docker чтобы избавиться от этой проблемы.


Команда pull скачивает образ busybox из регистра Докера и сохраняет его локально. Можно использовать команду docker images, чтобы посмотреть список образов в системе.

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
busybox                 latest              c51f86c28340        4 weeks ago         1.109 MB


1.1 Docker Run

Отлично! Теперь давайте запустим Докер-контейнер с этим образом. Для этого используем волшебную команду docker run:

$ docker run busybox
$

Подождите, ничего не произошло! Это баг? Ну, нет. Под капотом произошло много всего. Докер-клиент нашел образ (в нашем случае, busybox), загрузил контейнер и запустил команду внутри этого контейнера. Мы сделали docker run busybox, но не указали никаких команд, так что контейнер загрузился, запустилась пустая команда и программа завершилась. Ну, да, как-то обидно, так что давайте сделаем что-то поинтереснее.

$ docker run busybox echo "hello from busybox"
hello from busybox

Ура, наконец-то какой-то вывод. В нашем случае клиент Докера послушно запустил команду echo внутри контейнера, а потом вышел из него. Вы, наверное, заметили, что все произошло очень быстро. А теперь представьте себе, как нужно загружать виртуальную машину, запускать в ней команду и выключать ее. Теперь ясно, почему говорят, что контейнеры быстрые!

Теперь давайте взглянем на команду docker ps. Она выводит на экран список всех запущенных контейнеров.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Контейнеров сейчас нет, поэтому выводится пустая строка. Не очень полезно, поэтому давайте запустим более полезный вариант: docker ps -a

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
305297d7a235        busybox             "uptime"            11 minutes ago      Exited (0) 11 minutes ago                       distracted_goldstine
ff0a5c3750b9        busybox             "sh"                12 minutes ago      Exited (0) 12 minutes ago                       elated_ramanujan

Теперь виден список всех контейнеров, которые мы запускали. В колонке STATUS можно заметить, что контейнеры завершили свою работу несколько минут назад.

Вам, наверное, интересно, как запустить больше одной команды в контейнере. Давайте попробуем:

$ docker run -it busybox sh
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # uptime
 05:45:21 up  5:58,  0 users,  load average: 0.00, 0.01, 0.04

 

Команда run с флагом -it подключает интерактивный tty в контейнер. Теперь можно запускать сколько угодно много команд внутри. Попробуйте.


Опасно!: Если хочется острых ощущений, то можете попробовать rm -rf bin в контейнере. Но удостоверьтесь, что запускаете ее внутри контейнера, а не снаружи. Если сделаете это снаружи, на своем компьютере, то будет очень плохо, и команды вроде lsecho перестанут работать. Когда внутри контейнера все перестанет работать, просто выйдете и запустите его заново командой docker run -it busybox sh. Докер создает новый контейнер при запуске, поэтому все заработает снова.


На этом захватывающий тур по возможностям команды docker run закончен. Скорее всего, вы будете использовать эту команду довольно часто. Так что важно, чтобы мы поняли как с ней обращаться. Чтобы узнать больше о run, используйте docker run --help, и увидите полный список поддерживаемых флагов. Скоро мы увидим еще несколько способов использования docker run.

Перед тем, как продолжать, давайте вкратце рассмотрим удаление контейнеров. Мы видели выше, что с помощью команды docker ps -a все еще можно увидеть остатки завершенных контейнеров. На протяжении этого пособия, вы будете запускать docker run несколько раз, и оставшиеся, бездомные контейнеры будут съедать дисковое пространство. Так что я взял за правило удалять контейнеры после завершения работы с ними. Для этого используется команда docker rm. Просто скопируйте ID (можно несколько) из вывода выше и передайте параметрами в команду.

$ docker rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9

При удалении идентификаторы будут снова выведены на экран. Если нужно удалить много контейнеров, то вместо ручного копирования и вставления можно сделать так:

$ docker rm $(docker ps -a -q -f status=exited)

Эта команда удаляет все контейнеры, у которых статус exited. Флаг -q возвращает только численные ID, а флаг -f фильтрует вывод на основе предоставленных условий. Последняя полезная деталь — команде docker run можно передать флаг --rm, тогда контейнер будет автоматически удаляться при завершении. Это очень полезно для разовых запусков и экспериментов с Докером.

Также можно удалять ненужные образы командой docker rmi.


1.2 Терминология

В предыдущем разделе мы использовали много специфичного для Докера жаргона, и многих это может запутать. Перед тем, как продолжать, давайте разберем некоторые термины, которые часто используются в экосистеме Докера.


  • Images (образы) – Схемы нашего приложения, которые являются основой контейнеров. В примере выше мы использовали команду docker pull чтобы скачать образ busybox.
  • Containers (контейнеры) – Создаются на основе образа и запускают само приложение. Мы создали контейнер командой docker run, и использовали образ busybox, скачанный ранее. Список запущенных контейнеров можно увидеть с помощью команды docker ps.
  • Docker Daemon (демон Докера) – Фоновый сервис, запущенный на хост-машине, который отвечает за создание, запуск и уничтожение Докер-контейнеров. Демон — это процесс, который запущен на операционной системе, с которой взаимодействует клиент.
  • Docker Client (клиент Докера) – Утилита командной строки, которая позволяет пользователю взаимодействовать с демоном. Существуют другие формы клиента, например, Kitematic, с графическим интерфейсом.
  • Docker Hub – Регистр Докер-образов. Грубо говоря, архив всех доступных образов. Если нужно, то можно содержать собственный регистр и использовать его для получения образов.

2.0 Веб-приложения и Докер

Супер! Теперь мы научились работать с  docker run, поиграли с несколькими контейнерами и разобрались в терминологии. Вооруженные этими знаниями, мы готовы переходить к реальным штукам: деплою веб-приложений с Докером!


2.1 Статические сайты

Давайте начнем с малого. Вначале рассмотрим самый простой статический веб-сайт. Скачаем образ из Docker Hub, запустим контейнер и посмотрим, насколько легко будет запустить веб-сервер.

Поехали. Для одностраничного сайта нам понадобится образ, который я заранее создал для этого пособия и разместил в регистре – prakhar1989/static-site. Можно скачать образ напрямую командой docker run.

$ docker run prakhar1989/static-site

Так как образа не существует локально, клиент сначала скачает образ из регистра, а потом запустит его. Если все без проблем, то вы увидите сообщение Nginx is running... в терминале. Теперь сервер запущен. Как увидеть сайт в действии? На каком порту работает сервер? И, что самое важное, как напрямую достучаться до контейнера из хост-контейнера?

В нашем случае клиент не открывает никакие порты, так что нужно будет перезапустить команду  docker run чтобы сделать порты публичными. Заодно давайте сделаем так, чтобы терминал не был прикреплен к запущенному контейнеру. В таком случае можно будет спокойно закрыть терминал, а контейнер продолжит работу. Это называется detached mode.

$ docker run -d -P --name static-site prakhar1989/static-site
e61d12292d69556eabe2a44c16cbd54486b2527e2ce4f95438e504afb7b02810

Флаг -d открепит (detach) терминал, флаг -P сделает все открытые порты публичными и случайными, и, наконец, флаг --name это имя, которое мы хотим дать контейнеру. Теперь можно увидеть порты с помощью команды docker port [CONTAINER].

$ docker port static-site
80/tcp -> 0.0.0.0:32769
443/tcp -> 0.0.0.0:32768

Откройте http://localhost:32769 в своем браузере.


Замечание: Если вы используете docker-toolbox, то, возможно, нужно будет использовать docker-machine ip default чтобы получить IP-адрес.


Также можете обозначить свой порт. Клиент будет перенаправлять соединения на него.

$ docker run -p 8888:80 prakhar1989/static-site
Nginx is running...

Чтобы остановить контейнер запустите docker stop и укажите идентификатор (ID) контейнера.

Согласитесь, все было очень просто. Чтобы задеплоить это на реальный сервер, нужно просто установить Докер и запустить команду выше. Теперь, когда вы увидели, как запускать веб-сервер внутри образа, вам, наверное, интересно — а как создать свой Докер-образ? Мы будем изучать эту тему в следующем разделе.


2.2 Образы

Мы касались образов ранее, но в этом разделе мы заглянем глубже: что такое Докер-образы и как создавать собственные образы. Наконец, мы используем собственный образ чтобы запустить приложение локально, а потом задеплоим его на AWS, чтобы показать друзьям. Круто? Круто! Давайте начнем.

Образы это основы для контейнеров. В прошлом примере мы скачали (pull) образ под названием Busybox из регистра, и попросили клиент Докера запустить контейнер, основанный на этом образе. Чтобы увидеть список доступных локально образов, используйте команду docker images.

$ docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
prakhar1989/catnip              latest              c7ffb5626a50        2 hours ago         697.9 MB
prakhar1989/static-site         latest              b270625a1631        21 hours ago        133.9 MB
python                          3-onbuild           cf4002b2c383        5 days ago          688.8 MB
martin/docker-cleanup-volumes   latest              b42990daaca2        7 weeks ago         22.14 MB
ubuntu                          latest              e9ae3c220b23        7 weeks ago         187.9 MB
busybox                         latest              c51f86c28340        9 weeks ago         1.109 MB
hello-world                     latest              0a6ba66e537a        11 weeks ago        960 B

Это список образов, которые я скачал из регистра, а также тех, что я сделал сам (скоро увидим, как это делать). TAG — это конкретный снимок или снэпшот (snapshot) образа, а IMAGE ID — это соответствующий уникальный идентификатор образа.

Для простоты, можно относиться к образу как к git-репозиторию. Образы можно коммитить с изменениями, и можно иметь несколько версий. Если не указывать конкретную версию, то клиент по умолчанию использует latest. Например, можно скачать определенную версию образа ubuntu:

$ docker pull ubuntu:12.04

Чтобы получить новый Докер-образ, можно скачать его из регистра (такого, как Docker Hub) или создать собственный. На Docker Hub есть десятки тысяч образов. Можно искать напрямую из командной строки с помощью docker search.

Важно понимать разницу между базовыми и дочерними образами:


  • Base images (базовые образы) — это образы, которые не имеют родительского образа. Обычно это образы с операционной системой, такие как ubuntu, busybox или debian.
  • Child images (дочерние образы) — это образы, построенные на базовых образах и обладающие дополнительной функциональностью.

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


  • Официальные образы — это образы, которые официально поддерживаются командой Docker. Обычно в их названии одно слово. В списке выше pythonubuntubusybox и hello-world — базовые образы.
  • Пользовательские образы — образы, созданные простыми пользователями вроде меня и вас. Они построены на базовых образах. Обычно, они называются по формату user/image-name.

2.3 Наш первый образ

Теперь, когда мы лучше понимаем, что такое образы и какие они бывают, самое время создать собственный образ. Цель этого раздела — создать образ с простым приложением на Flask. Для этого пособия я сделал маленькое приложение, которое выводит случайную гифку с кошкой. Ну, потому что, кто не любит кошек? Склонируйте этот репозиторий к себе на локальную машину.

Вначале давайте проверим, что приложение работает локально. Войдите в директорию flask-app командой cd и установите зависимости.

$ cd flask-app
$ pip install -r requirements.txt
$ python app.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

 

Если все хорошо, то вы увидите вывод как в примере выше. Зайдите на http://localhost:5000 чтобы увидеть приложение в действии.


Замечание: Если команда pip install падает с ошибками “permission denied”, то попробуйте запустить ее с sudo. Если не хотите устанавливать пользовательские пакеты на уровне системы, то используйте команду pip install --user -r requirements.txt.


Выглядит отлично, правда? Теперь нужно создать образ с приложением. Как говорилось выше, все пользовательские образы основаны на базовом образе. Так как наше приложение написано на Питоне, нам нужен базовый образ Python 3. В частности, нам нужна версия python:3-onbuild базового образа с Питоном.

Что за версия onbuild, спросите вы?


Эти образы включают несколько триггеров ONBUILD, которых обычно достаточно чтобы быстро развернуть приложение. При сборке будет скопирован файл requirements.txt, будет запущен pip install с этим файлом, а потом текущая директория будет скопирована в /usr/src/app.


Другими словами, версия onbuild включает хелперы, которые автоматизируют скучные процессы запуска приложения. Вместо того, чтобы вручную выполнять эти задачи (или писать скрипты), образы делают все за вас. Теперь у нас есть все ингредиенты для создания своего образа: работающее веб-приложение и базовый образ. Как это сделать? Ответ: использовать Dockerfile.


2.4 Dockerfile

Dockerfile — это простой текстовый файл, в котором содержится список команд Докер-клиента. Это простой способ автоматизировать процесс создания образа. Самое классное, что команды в Dockerfile почти идентичны своим аналогам в Linux. Это значит, что в принципе не нужно изучать никакой новый синтаксис чтобы начать работать с докерфайлами.

В директории с приложением есть Dockerfile, но так как мы делаем все впервые, нам нужно создать его с нуля. Создайте новый пустой файл в любимом текстовом редакторе, и сохраните его в той же директории, где находится flask-приложение. Назовите файл Dockerfile.

Для начала укажем базовый образ. Для этого нужно использовать ключевое слово FROM.

FROM python:3-onbuild

Дальше обычно указывают команды для копирования файлов и установки зависимостей. Но к счастью, onbuild-версия базового образа берет эти задачи на себя. Дальше нам нужно указать порт, который следует открыть. Наше приложение работает на порту 5000, поэтому укажем его:

EXPOSE 5000

Последний шаг — указать команду для запуска приложения. Это просто python ./app.py. Для этого используем команду CMD:

CMD ["python", "./app.py"]

Главное предназначение CMD — это сообщить контейнеру какие команды нужно выполнить при старте. Теперь наш Dockerfile готов. Вот как он выглядит:

# our base image
FROM python:3-onbuild

# specify the port number the container should expose
EXPOSE 5000

# run the application
CMD ["python", "./app.py"]

Теперь можно создать образ. Команда docker build занимается сложной задачей создания образа на основе Dockerfile.

Листинг ниже демонстрирует процесс. Перед тем, как запустите команду сами (не забудьте точку в конце), проверьте, чтобы там был ваш username вместо моего. Username должен соответствовать тому, что использовался при регистрации на Docker hub. Если вы еще не регистрировались, то сделайте это до выполнения команды. Команда docker build довольно проста: она принимает опциональный тег с флагом -t и путь до директории, в которой лежит Dockerfile.

$ docker build -t prakhar1989/catnip .
Sending build context to Docker daemon 8.704 kB
Step 1 : FROM python:3-onbuild
# Executing 3 build triggers...
Step 1 : COPY requirements.txt /usr/src/app/
 ---> Using cache
Step 1 : RUN pip install --no-cache-dir -r requirements.txt
 ---> Using cache
Step 1 : COPY . /usr/src/app
 ---> 1d61f639ef9e
Removing intermediate container 4de6ddf5528c
Step 2 : EXPOSE 5000
 ---> Running in 12cfcf6d67ee
 ---> f423c2f179d1
Removing intermediate container 12cfcf6d67ee
Step 3 : CMD python ./app.py
 ---> Running in f01401a5ace9
 ---> 13e87ed1fbc2
Removing intermediate container f01401a5ace9
Successfully built 13e87ed1fbc2

Если у вас нет образа python:3-onbuild, то клиент сначала скачает его, а потом возьмется за создание вашего образа. Так что, вывод на экран может отличаться от моего. Посмотрите внимательно, и найдете триггеры onbuild. Если все прошло хорошо, то образ готов! Запустите docker images и увидите свой образ в списке.

Последний шаг — запустить образ и проверить его работоспособность (замените username на свой):

$ docker run -p 8888:5000 prakhar1989/catnip
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

 

Зайдите на указанный URL и увидите приложение в работе.

Поздравляю! Вы успешно создали свой первый образ Докера!


2.5 Docker на AWS

Что хорошего в приложении, которое нельзя показать друзьям, правда? Так что в этом разделе мы научимся деплоить наше офигенное приложение в облако. Будем использовать AWS Elastic Beanstalk чтобы решить эту задачу за пару кликов. Мы увидим, как с помощью Beanstalk легко управлять и масштабировать наше приложение.


Docker push

Первое, что нужно сделать перед деплоем на AWS это опубликовать наш образ в регистре, чтобы можно было скачивать его из AWS. Есть несколько Docker-регистров (или можно создать собственный). Для начала, давайте используем Docker Hub. Просто выполните:

$ docker push prakhar1989/catnip

Если это ваша первая публикация, то клиент попросит вас залогиниться. Введите те же данные, что используете для входа в Docker Hub.

$ docker login
Username: prakhar1989
WARNING: login credentials saved in /Users/prakhar/.docker/config.json
Login Succeeded

Не забудьте заменить название образа на свое. Очень важно сохранить формат username/image_name, чтобы клиент понимал, куда публиковать образ.

После этого можете посмотреть на свой образ на Docker Hub. Например, вот страница моего образа.


Замечание: один важный момент, который стоит прояснить перед тем, как продолжить — не обязательно хранить образ в публичном регистре (или в любом другом регистре вообще) чтобы деплоить на AWS. Если вы пишете код для следующего многомиллионного стартапа-единорога, то можно пропустить этот шаг. Мы публикуем свой образ чтобы упростить деплой, пропустив несколько конфигурационных шагов.


Теперь наш образ онлайн, и любой докер-клиент может поиграться с ним с помощью простой команды:

$ docker run -p 8888:5000 prakhar1989/catnip

Если в прошлом вы мучались с установкой локального рабочего окружения и попытками поделиться своей конфигурацией с коллегами, то понимаете, как круто это звучит. Вот почему Докер — это сила!


Beanstalk

AWS Elastic Beanstalk (EB) это PaaS (Platform as a Service — платформа как сервис) от Amazon Web Services. Если вы использовали Heroku, Google App Engine и т.д., то все будет привычно. Как разработчик, вы сообщаете EB как запускать ваше приложение, а EB занимается всем остальным, в том числе масштабированием, мониторингом и даже апдейтами. В апреле 2014 в EB добавили возможность запускать Докер-контейнеры, и мы будем использовать именно эту возможность для деплоя. У EB очень понятный интерфейс командной строки, но он требует небольшой конфигурации, поэтому для простоты давайте используем веб-интерфейс для запуска нашего приложения.

Чтобы продолжать, вам потребуется работающий аккаунт на AWS. Если у вас его нет, то создайте его. Для этого потребуется ввести данные кредитной карты. Но не волнуйтесь, эта услуга бесплатна, и все, что будет происходить в рамках этого пособия тоже бесплатно.

Давайте начнем:


  • Войдите в свою консоль AWS.
  • Нажмите на Elastic Beanstalk. Ссылка находится в секции compute, в левом верхнем углу. Или просто перейдите сюда.


  • Нажмите на “Create New Application” в верхнем правом углу.
  • Дайте своему приложению запоминающееся (но уникальное) имя и, если хотите, добавьте описание.
  • на экране New Environment выберите Web Server Environment.
  • Следующий экран показан ниже. Выберите Docker из готовых вариантов конфигурации. Можно оставить Environment type как есть. Нажмите Next.


  • Тут мы будем сообщать системе EB о нашем образе. Откройте файл Dockerrun.aws.json в директории flask-app и измените Name образа, чтобы оно соответствовало названию вашего образа. Не волнуйтесь, я опишу содержание файла попозже. Потом выберите вариант “upload your own” и выберите файл.
  • Далее, выберите название окружения и URL. Этот URL как раз можно будет давать друзьям, так что постарайтесь придумать что-нибудь попроще.
  • Пока не будем вносить никаких правок в секцию Additional Resources. Нажмите Next и переходите к Configuration Details.
  • В этой секции вам нужно выбрать тип инстанса t1.micro. Это очень важно, потому что это бесплатный тип от AWS. Если хотите, можно выбрать пару ключей для входа. Если вы не знаете, что это значит, то не волнуйтесь и просто пропустите эту часть. Все остальное можно оставить по умолчанию и продолжать.
  • Также не нужно указывать никакие Environment Tags and Permissions, так что просто жмите Next два раза подряд. В конце будет экран Review. Если все выглядит нормально, то нажимайте кнопку Launch.
  • На последнем экране будет несколько спиннеров. Это поднимается и настраивается ваше окружение. Обычно, нужно около пяти минут для первой настройки.

Пока ждем, давайте быстренько взглянем на файл Dockerrun.aws.json. Это файл для AWS, в котором находится информация о приложении конфигурации Докера. EB получает информацию из этого файла.

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "prakhar1989/catnip",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "5000"
    }
  ],
  "Logging": "/var/log/nginx"
}

Файл довольно понятный, но всегда можно обратиться к официальной документации. Мы указываем название образа, и EB будет использовать его заодно с портом.

К этому моменту инстанс уже должен быть готов. Зайдите на страницу EB и увидите зеленый индикатор успешного запуска приложения.

Зайдите на указанный URL в браузере и увидите приложение во все красе. Пошлите адрес своим друзьям, чтобы все могли насладиться гифками с кошками.

Поздравляю! Вы задеплоили свое первое Докер-приложение! Может показаться, что было очень много шагов, но с командной утилитой EB можно имитировать функциональность Хероку несколькими нажатиями клавиш. Надеюсь, вы согласитесь, что Докер сильно упрощает процесс и минимизирует болезненные моменты деплоя в облако. Я советую вам почитать документацию AWS про single-container Docker environment чтобы понимать, какие существуют возможности в EB.

В следующей, последней части пособия, мы пойдем немного дальше и задеплоим приложение, приближенное к реальному миру. В нем будет постоянное бэкэнд-хранилище. Поехали!


3.0 Многоконтейнерные окружения

В прошлом разделе мы увидели, как легко и просто запускать приложения с помощью Докера. Мы начали с простого статического сайта, а потом запустили Flask-приложение. Оба варианта можно было запускать локально или в облаке, несколькими командами. Общая черта этих приложений: каждое из них работало в одном контейнере.

Если у вас есть опыт управления сервисами в продакшене, то вы знаете, что современные приложения обычно не такие простые. Почти всегда есть база данных (или другой тип постоянного хранилища). Системы вроде Redis и Memcached стали практически обязательной частью архитектуры веб-приложений. Поэтому, в этом разделе мы научимся “докеризировать” приложения, которым требуется несколько запущенных сервисов.

В частности, мы увидим, как запускать и управлять многоконтейнерными Докер-окружениями. Почему нужно несколько контейнеров, спросите вы? Ну, одна из главных идей Докера в том, что он предоставляет изоляцию. Идея совмещения процесса и его зависимостей в одной песочнице (называемой контейнером) и делает Докер мощным инструментом.

Аналогично тому, как приложение разбивают на части, стоит содержать отдельные сервисы в отдельных контейнерах. Разным частям скорее всего требуются разные ресурсы, и требования могут расти с разной скоростью. Если мы разделим эти части и поместим в разные контейнеры, то каждую часть приложения можно строить, используя наиболее подходящий тип ресурсов. Это также хорошо совмещается с идеей микро сервисов. Это одна из причин, по которой Докер (и любая другая технология контейнеризации) находится на передовой современных микро сервисных архитектур.


3.1 SF Food Trucks

Приложение, которое мы переведем в Докер, называется SF Food Trucks (к сожалению, сейчас приложение уже не работает публично — прим. пер.). Моя цель была сделать что-то полезное (и похожее на настоящее приложение из реального мира), что-то, что использует как минимум один сервис, но не слишком сложное для этого пособия. Вот что я придумал.

Бэкэнд приложения написано на Питоне (Flask), а для поиска используется Elasticsearch. Как и все остальное в этом пособии, код находится на Github. Мы используем это приложение, чтобы научиться запускать и деплоить много-контейнерное окружение.

Теперь, когда вы завелись (надеюсь), давайте подумаем, как будет выглядеть этот процесс. В нашем приложении есть бэкэнд на Flask и сервис Elasticsearch. Очевидно, что можно поделить приложение на два контейнера: один для Flask, другой для Elasticsearch (ES). Если приложение станет популярным, то можно будет добавлять новые контейнеры в нужном месте, смотря где будет узкое место.

Отлично, значит нужно два контейнера. Это не сложно, правда? Мы уже создавали Flask-контейнер в прошлом разделе. А для Elasticsearch… давайте посмотрим, есть ли что-нибудь в хабе:

$ docker search elasticsearch
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
elasticsearch                     Elasticsearch is a powerful open source se...   697       [OK]
itzg/elasticsearch                Provides an easily configurable Elasticsea...   17                   [OK]
tutum/elasticsearch               Elasticsearch image - listens in port 9200.     15                   [OK]
barnybug/elasticsearch            Latest Elasticsearch 1.7.2 and previous re...   15                   [OK]
digitalwonderland/elasticsearch   Latest Elasticsearch with Marvel & Kibana       12                   [OK]
monsantoco/elasticsearch          ElasticSearch Docker image                      9                    [OK]

Не удивительно, но существуют официальный образ для Elasticsearch. Чтобы запустить ES, нужно всего лишь выполнить docker run, и вскоре у нас будет локальный, работающий контейнер с одним узлом ES.

$ docker run -dp 9200:9200 elasticsearch
d582e031a005f41eea704cdc6b21e62e7a8a42021297ce7ce123b945ae3d3763

$ curl 0.0.0.0:9200
{
  "name" : "Ultra-Marine",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.1.1",
    "build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
    "build_timestamp" : "2015-12-15T13:05:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.3.1"
  },
  "tagline" : "You Know, for Search"
}

Заодно давайте запустим контейнер с Flask. Но вначале нужен Dockerfile. В прошлой секции мы использовали образ python:3-onbuild в качестве базового. Однако, в этом раз, кроме установки зависимостей через pip, нам нужно, чтобы приложение генерировало минимизированный Javascript-файл для продакшена. Для этого понадобится Nodejs. Так что нужен свой билд с нуля, поэтому начнем с базового образа ubuntu.


Замечание: если оказывается, что существующий образ не подходит для вашей задачи, то спокойно создавайте свой образ на основе другого базового образа. В большинстве случаем, для образов на Docker Hub можно найти соответствующий Dockerfile на Github. Почитайте существующий Докерфайлы — это один из лучших способов научиться делать свои образы.


Наш Dockerfile для Flask-приложения выглядит следующим образом:

# start from base
FROM ubuntu:14.04
MAINTAINER Prakhar Srivastav <[email protected]>

# install system-wide deps for python and node
RUN apt-get -yqq update
RUN apt-get -yqq install python-pip python-dev
RUN apt-get -yqq install nodejs npm
RUN ln -s /usr/bin/nodejs /usr/bin/node

# copy our application code
ADD flask-app /opt/flask-app
WORKDIR /opt/flask-app

# fetch app specific deps
RUN npm install
RUN npm run build
RUN pip install -r requirements.txt

# expose port
EXPOSE 5000

# start app
CMD [ "python", "./app.py" ]

Тут много всего нового. Вначале указан базовый образ Ubuntu LTS, потом используется пакетный менеджер apt-get для установки зависимостей, в частности — Python и Node. Флаг yqq нужен для игнорирования вывода и автоматического выбора “Yes” во всех местах. Также создается символическая ссылка для бинарного файла node. Это нужно для решения проблем обратной совместимости.

Потом мы используем команду ADD для копирования приложения в нужную директорию в контейнере — /opt/flask-app. Здесь будет находиться весь наш код. Мы также устанавливаем эту директорию в качестве рабочей, так что следующие команды будут выполняться в контексте этой локации. Теперь, когда наши системные зависимости установлены, пора установить зависимости уровня приложения. Начнем с Node, установки пакетов из npm и запуска команды сборки, как указано в нашем файле package.json. В конце устанавливаем пакеты Python, открываем порт и определяем запуск приложения с помощь CMD, как в предыдущем разделе.

Наконец, можно собрать образ и запустить контейнер (замените prakhar1989 на свой username ниже).

$ docker build -t prakhar1989/foodtrucks-web .

При первом запуске нужно будет больше времени, так как клиент Докера будет скачивать образ ubuntu, запускать все команды и готовить образ. Повторный запуск docker build после последующих изменений будет практически моментальным. Давайте попробуем запустить приложение

$ docker run -P prakhar1989/foodtrucks-web
Unable to connect to ES. Retying in 5 secs...
Unable to connect to ES. Retying in 5 secs...
Unable to connect to ES. Retying in 5 secs...
Out of retries. Bailing out...

Упс! Наше приложение не смогло запуститься, потому что оно не может подключиться к Elasticsearch. Как сообщить одному контейнеру о другом и как заставить их взаимодействовать друг с другом? Ответ — в следующей секции.


3.2 Сети Docker

Перед тем, как обсудить возможности Докера для решения описанной задачи, давайте посмотрим на возможные варианты обхода проблемы. Думаю, это поможет нам оценить удобство той функциональности, которую мы вскоре изучим.

Ладно, давайте запустим docker ps, что тут у нас:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
e931ab24dedc        elasticsearch       "/docker-entrypoint.s"   2 seconds ago       Up 2 seconds        0.0.0.0:9200->9200/tcp, 9300/tcp   cocky_spence

Итак, у нас есть контейнер ES по адресу и порту 0.0.0.0:9200, и мы можем напрямую обращаться к нему. Если можно было бы сообщить нашему приложению подключаться к этому адресу, то оно сможет общаться с ES, верно? Давайте взглянем на код на Питоне, туда, где описано подключение.

es = Elasticsearch(host='es')

Нужно сообщить Flask-контейнеру, что контейнер ES запущен на хосте 0.0.0.0 (порт по умолчанию 9200), и все заработает, да? К сожалению, нет, потому что IP 0.0.0.0 это адрес для доступа к контейнеру с  хост-машины, то есть с моего Мака. Другой контейнер не сможет обратиться по этому адресу. Ладно, если не этот адрес, то какой другой адрес нужно использовать для работы с контейнером ES? Рад, что вы спросили.

Это хороший момент, чтобы изучить работу сети в Докере. После установки, Докер автоматически создает три сети:

$ docker network ls
NETWORK ID          NAME                DRIVER
075b9f628ccc        none                null
be0f7178486c        host                host
8022115322ec        bridge              bridge

Сеть bridge — это сеть, в которой контейнеры запущены по умолчанию. Это значит, что когда я запускаю контейнер ES, он работает в этой сети bridge. Чтобы удостовериться, давайте проверим:

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "8022115322ec80613421b0282e7ee158ec41e16f565a3e86fa53496105deb2d7",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Containers": {
            "e931ab24dedc1640cddf6286d08f115a83897c88223058305460d7bd793c1947": {
                "EndpointID": "66965e83bf7171daeb8652b39590b1f8c23d066ded16522daeb0128c9c25c189",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        }
    }
]

Видно, что контейнер e931ab24dedc находится в секции Containers. Также виден IP-адрес, выданный этому контейнеру — 172.17.0.2. Именно этот адрес мы и искали? Давайте проверим: запустим Flask-приложение и попробуем обратиться к нему по IP:

$ docker run -it --rm prakhar1989/foodtrucks-web bash
[email protected]:/opt/flask-app# curl 172.17.0.2:9200
bash: curl: command not found
[email protected]:/opt/flask-app# apt-get -yqq install curl
[email protected]:/opt/flask-app# curl 172.17.0.2:9200
{
  "name" : "Jane Foster",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.1.1",
    "build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
    "build_timestamp" : "2015-12-15T13:05:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.3.1"
  },
  "tagline" : "You Know, for Search"
}
[email protected]:/opt/flask-app# exit

Сейчас все должно быть понятно. Мы запустили контейнер в интерактивном режиме с процессом bash. Флаг --rm нужен для удобства, благодаря нему контейнер автоматически удаляется после выхода. Мы попробуем curl, но нужно сначала установить его. После этого можно удостовериться, что по адресу 172.17.0.2:9200 на самом деле можно обращаться к ES! Супер!

Не смотря на то, что мы нашли способ наладить связь между контейнерами, существует несколько проблем с этим подходом:


  1. Придется добавлять записи в файл /etc/hosts внутри Flask-контейнера, чтобы приложение понимало, что имя хоста es означает 172.17.0.2. Если IP-адрес меняется, то придется вручную менять запись.
  2. Так как сеть bridge используется всеми контейнерами по умолчанию, этот метод не безопасен.

Но есть хорошие новости: в Докере есть отличное решение этой проблемы. Докер позволяет создавать собственные изолированные сети. Это решение также помогает справиться с проблемой /etc/hosts, сейчас увидим как.

Во-первых, давайте создадим свою сеть:

$ docker network create foodtrucks
1a3386375797001999732cb4c4e97b88172d983b08cd0addfcb161eed0c18d89

$ docker network ls
NETWORK ID          NAME                DRIVER
1a3386375797        foodtrucks          bridge
8022115322ec        bridge              bridge
075b9f628ccc        none                null
be0f7178486c        host                host

Команда network create создает новую сеть bridge. Нам сейчас нужен именно такой тип. Существуют другие типы сетей, и вы можете почитать о них в официальной документации.

Теперь у нас есть сеть. Можно запустить наши контейнеры внутри сети с помощью флага --net. Давайте так и сделаем, но сначала остановим контейнер с ElasticSearch, который был запущен в сети bridge по умолчанию.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
e931ab24dedc        elasticsearch       "/docker-entrypoint.s"   4 hours ago         Up 4 hours          0.0.0.0:9200->9200/tcp, 9300/tcp   cocky_spence

$ docker stop e931ab24dedc
e931ab24dedc

$ docker run -dp 9200:9200 --net foodtrucks --name es elasticsearch
2c0b96f9b8030f038e40abea44c2d17b0a8edda1354a08166c33e6d351d0c651

$ docker network inspect foodtrucks
[
    {
        "Name": "foodtrucks",
        "Id": "1a3386375797001999732cb4c4e97b88172d983b08cd0addfcb161eed0c18d89",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        "Containers": {
            "2c0b96f9b8030f038e40abea44c2d17b0a8edda1354a08166c33e6d351d0c651": {
                "EndpointID": "15eabc7989ef78952fb577d0013243dae5199e8f5c55f1661606077d5b78e72a",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]

Мы сделали то же, что и раньше, но на этот раз дали контейнеру название es. Перед тем, как запускать контейнер с приложением, давайте проверим что происходит, когда запуск происходит в сети.

$ docker run -it --rm --net foodtrucks prakhar1989/foodtrucks-web bash
[email protected]:/opt/flask-app# cat /etc/hosts
172.18.0.3  53af252b771a
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2  es
172.18.0.2  es.foodtrucks

[email protected]:/opt/flask-app# curl es:9200
bash: curl: command not found
[email protected]:/opt/flask-app# apt-get -yqq install curl
[email protected]:/opt/flask-app# curl es:9200
{
  "name" : "Doctor Leery",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.1.1",
    "build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
    "build_timestamp" : "2015-12-15T13:05:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.3.1"
  },
  "tagline" : "You Know, for Search"
}
[email protected]:/opt/flask-app# ls
app.py  node_modules  package.json  requirements.txt  static  templates  webpack.config.js
[email protected]:/opt/flask-app# python app.py
Index not found...
Loading data in elasticsearch ...
Total trucks loaded:  733
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
[email protected]:/opt/flask-app# exit

Ура! Работает! Магическим образом Докер внес нужные правки в файл /etc/hosts, и поэтому es:9200 можно использовать в приложении — этот адрес корректно направляет запросы в контейнер ES. Отлично! Давайте теперь запустим Flask-контейнер по-настоящему:

$ docker run -d --net foodtrucks -p 5000:5000 --name foodtrucks-web prakhar1989/foodtrucks-web
2a1b77e066e646686f669bab4759ec1611db359362a031667cacbe45c3ddb413

$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                              NAMES
2a1b77e066e6        prakhar1989/foodtrucks-web   "python ./app.py"        2 seconds ago       Up 1 seconds        0.0.0.0:5000->5000/tcp             foodtrucks-web
2c0b96f9b803        elasticsearch                "/docker-entrypoint.s"   21 minutes ago      Up 21 minutes       0.0.0.0:9200->9200/tcp, 9300/tcp   es

$ curl -I 0.0.0.0:5000
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 3697
Server: Werkzeug/0.11.2 Python/2.7.6
Date: Sun, 10 Jan 2016 23:58:53 GMT

Зайдите на http://0.0.0.0:5000, и увидите приложение в работе. Опять же, может показаться, что было много работы, но на самом деле мы ввели всего 4 команды чтобы с нуля дойти до работающего приложения. Я собрал эти команды в bash-скрипт.

#!/bin/bash

# build the flask container
docker build -t prakhar1989/foodtrucks-web .

# create the network
docker network create foodtrucks

# start the ES container
docker run -d --net foodtrucks -p 9200:9200 -p 9300:9300 --name es elasticsearch

# start the flask app container
docker run -d --net foodtrucks -p 5000:5000 --name foodtrucks-web prakhar1989/foodtrucks-web

Теперь представьте, что хотите поделиться приложением с другом. Или хотите запустить на сервере, где установлен Докер. Можно запустить всю систему с помощью одной команды!

$ git clone https://github.com/prakhar1989/FoodTrucks
$ cd FoodTrucks
$ ./setup-docker.sh

Вот и все! По-моему, это невероятно крутой и мощный способ распространять и запускать приложения!


Docker Links

Перед тем, как завершить этот раздел, стоит отметить, что docker network это относительно новая фича, она входит в релиз Docker 1.9 .

До того, как появился network, ссылки были допустимым способом настройки взаимодействия между контейнерами. В соответствии с официальной документацией, linking вскоре будет переведены в статус deprecated. Если вам попадется туториал или статья, где используется link для соединения контейнеров, то просто не забывайте использовать вместо этого network (на момент публикации перевода links является legacy, — прим. пер.)


3.3 Docker Compose

До этого момента мы изучали клиент Докера. Но в экосистеме Докера есть несколько других инструментов с открытым исходным кодом, которые хорошо взаимодействуют с Докером. Некоторые из них это:


  1. Docker Machine позволяет создавать Докер-хосты на своем компьютере, облачном провайдере или внутри дата-центра.
  2. Docker Compose — инструмент для определения и запуска много-контейнерных приложений.
  3. Docker Swarm — нативное решение для кластеризации.

В этом разделе мы поговорим об одном из этих инструментов — Docker Compose, и узнаем, как он может упростить работу с несколькими контейнерами.

У Docker Compose довольно интересная предыстория. Примерно два года назад компания OrchardUp запустила инструмент под названием Fig. Идея была в том, чтобы создавать изолированные рабочие окружения с помощью Докера. Проект очень хорошо восприняли на Hacker News – я смутно помню, что читал о нем, но не особо понял его смысла.

Первый комментарий на самом деле неплохо объясняет, зачем нужен Fig и что он делает:


На самом деле, смысл Докера в следующем: запускать процессы. Сегодня у Докера есть неплохое API для запуска процессов: расшаренные между контейнерами (иными словами, запущенными образами) разделы или директории (shared volumes), перенаправление портов с хост-машины в контейнер, вывод логов, и так далее. Но больше ничего: Докер сейчас работает только на уровне процессов.
Не смотря на то, что в нем содержатся некоторые возможности оркестрации нескольких контейнеров для создания единого “приложения”, в Докере нет ничего, что помогало бы с управлением такими группами контейнеров как одной сущностью. И вот зачем нужен инструмент вроде Fig: чтобы обращаться с группой контейнеров как с единой сущностью. Чтобы думать о “запуске приложений” (иными словами, “запуске оркестрированного кластера контейнеров”) вместо “запуска контейнеров”.


Оказалось, что многие пользователи Докера согласны с такими мыслями. Постепенно, Fig набрал популярность, Docker Inc. заметили, купили компанию и назвали проект Docker Compose.

Итак, зачем используется Compose? Это инструмент для простого определения и запуска многоконтейнерных Докер-приложений. В нем есть файл docker-compose.yml, и с его помощью можно одной командой поднять приложение с набором сервисов.

Давайте посмотрим, сможем ли мы создать файл docker-compose.yml для нашего приложения SF-Foodtrucks и проверим, способен ли он на то, что обещает.

Но вначале нужно установить Docker Compose. Есть у вас Windows или Mac, то Docker Compose уже установлен — он идет в комплекте с Docker Toolbox. На Linux можно установить Docker Compose следуя простым инструкциям на сайте документации. Compose написан на Python, поэтому можно сделать просто pip install docker-compose. Проверить работоспособность так:

$ docker-compose version
docker-compose version 1.7.1, build 0a9ab35
docker-py version: 1.8.1
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1j 15 Oct 2014

Теперь можно перейти к следующему шагу, то есть созданию файла docker-compose.yml. Синтаксис yml-файлов очень простой, и в репозитории уже есть пример, который мы будем использовать

version: "2"
services:
  es:
    image: elasticsearch
  web:
    image: prakhar1989/foodtrucks-web
    command: python app.py
    ports:
      - "5000:5000"
    volumes:
      - .:/code

      

Давайте я разберу это подробнее. На родительском уровне мы задали название неймспейса для наших сервисов: es и web. К каждому сервису можно добавить дополнительные параметры, среди которых image — обязательный. Для es мы указываем доступный на Docker Hub образ elasticsearch. Для Flask-приложения — тот образ, который мы создали самостоятельно в начале этого раздела.

С помощью других параметров вроде command и ports можно предоставить информацию о контейнере. volumes отвечает за локацию монтирования, где будет находиться код в контейнере web. Это опциональный параметр, он полезен, если нужно обращаться к логам и так далее. Подробнее о параметрах и возможных значениях можно прочитать в документации.


Замечание: Нужно находиться в директории с файлом docker-compose.yml чтобы запускать большую часть команд Compose.


Отлично! Файл готов, давайте посмотрим на docker-compose в действии. Но вначале нужно удостовериться, что порты свободны. Так что если у вас запущены контейнеры Flask и ES, то пора их остановить:

$ docker stop $(docker ps -q)
39a2f5df14ef
2a1b77e066e6

Теперь можно запускать docker-compose. Перейдите в директорию с приложением Foodtrucks и выполните команду docker-compose up.

$ docker-compose up
Creating network "foodtrucks_default" with the default driver
Creating foodtrucks_es_1
Creating foodtrucks_web_1
Attaching to foodtrucks_es_1, foodtrucks_web_1
es_1  | [2016-01-11 03:43:50,300][INFO ][node                     ] [Comet] version[2.1.1], pid[1], build[40e2c53/2015-12-15T13:05:55Z]
es_1  | [2016-01-11 03:43:50,307][INFO ][node                     ] [Comet] initializing ...
es_1  | [2016-01-11 03:43:50,366][INFO ][plugins                  ] [Comet] loaded [], sites []
es_1  | [2016-01-11 03:43:50,421][INFO ][env                      ] [Comet] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/sda1)]], net usable_space [16gb], net total_space [18.1gb], spins? [possibly], types [ext4]
es_1  | [2016-01-11 03:43:52,626][INFO ][node                     ] [Comet] initialized
es_1  | [2016-01-11 03:43:52,632][INFO ][node                     ] [Comet] starting ...
es_1  | [2016-01-11 03:43:52,703][WARN ][common.network           ] [Comet] publish address: {0.0.0.0} is a wildcard address, falling back to first non-loopback: {172.17.0.2}
es_1  | [2016-01-11 03:43:52,704][INFO ][transport                ] [Comet] publish_address {172.17.0.2:9300}, bound_addresses {[::]:9300}
es_1  | [2016-01-11 03:43:52,721][INFO ][discovery                ] [Comet] elasticsearch/cEk4s7pdQ-evRc9MqS2wqw
es_1  | [2016-01-11 03:43:55,785][INFO ][cluster.service          ] [Comet] new_master {Comet}{cEk4s7pdQ-evRc9MqS2wqw}{172.17.0.2}{172.17.0.2:9300}, reason: zen-disco-join(elected_as_master, [0] joins received)
es_1  | [2016-01-11 03:43:55,818][WARN ][common.network           ] [Comet] publish address: {0.0.0.0} is a wildcard address, falling back to first non-loopback: {172.17.0.2}
es_1  | [2016-01-11 03:43:55,819][INFO ][http                     ] [Comet] publish_address {172.17.0.2:9200}, bound_addresses {[::]:9200}
es_1  | [2016-01-11 03:43:55,819][INFO ][node                     ] [Comet] started
es_1  | [2016-01-11 03:43:55,826][INFO ][gateway                  ] [Comet] recovered [0] indices into cluster_state
es_1  | [2016-01-11 03:44:01,825][INFO ][cluster.metadata         ] [Comet] [sfdata] creating index, cause [auto(index api)], templates [], shards [5]/[1], mappings [truck]
es_1  | [2016-01-11 03:44:02,373][INFO ][cluster.metadata         ] [Comet] [sfdata] update_mapping [truck]
es_1  | [2016-01-11 03:44:02,510][INFO ][cluster.metadata         ] [Comet] [sfdata] update_mapping [truck]
es_1  | [2016-01-11 03:44:02,593][INFO ][cluster.metadata         ] [Comet] [sfdata] update_mapping [truck]
es_1  | [2016-01-11 03:44:02,708][INFO ][cluster.metadata         ] [Comet] [sfdata] update_mapping [truck]
es_1  | [2016-01-11 03:44:03,047][INFO ][cluster.metadata         ] [Comet] [sfdata] update_mapping [truck]
web_1 |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Перейдите по IP чтобы увидеть приложение. Круто, да? Всего лишь пара строк конфигурации и несколько Докер-контейнеров работают в унисон. Давайте остановим сервисы и перезапустим в detached mode:

web_1 |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Killing foodtrucks_web_1 ... done
Killing foodtrucks_es_1 ... done

$ docker-compose up -d
Starting foodtrucks_es_1
Starting foodtrucks_web_1

$ docker-compose ps
      Name                    Command               State           Ports
----------------------------------------------------------------------------------
foodtrucks_es_1    /docker-entrypoint.sh elas ...   Up      9200/tcp, 9300/tcp
foodtrucks_web_1   python app.py                    Up      0.0.0.0:5000->5000/tcp

Не удивительно, но оба контейнера успешно запущены. Откуда берутся имена? Их Compose придумал сам. Но что насчет сети? Его Compose тоже делаем сам? Хороший вопрос, давайте выясним.

Для начала, остановим запущенные сервисы. Их всегда можно вернуть одной командой:

$ docker-compose stop
Stopping foodtrucks_web_1 ... done
Stopping foodtrucks_es_1 ... done

Заодно, давайте удалим сеть foodtrucks, которую создали в прошлый раз. Эта сеть нам не потребуется, потому что Compose автоматически сделает все за нас.

$ docker network rm foodtrucks
$ docker network ls
NETWORK ID          NAME                DRIVER
4eec273c054e        bridge              bridge
9347ae8783bd        none                null
54df57d7f493        host                host

Класс! Теперь в этом чистом состоянии можно проверить, способен ли Compose на волшебство.

$ docker-compose up -d
Recreating foodtrucks_es_1
Recreating foodtrucks_web_1
$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
f50bb33a3242        prakhar1989/foodtrucks-web   "python app.py"          14 seconds ago      Up 13 seconds       0.0.0.0:5000->5000/tcp   foodtrucks_web_1
e299ceeb4caa        elasticsearch                "/docker-entrypoint.s"   14 seconds ago      Up 14 seconds       9200/tcp, 9300/tcp       foodtrucks_es_1

Пока все хорошо. Проверим, создались ли какие-нибудь сети:

$ docker network ls
NETWORK ID          NAME                 DRIVER
0c8b474a9241        bridge               bridge              
293a141faac3        foodtrucks_default   bridge              
b44db703cd69        host                 host                
0474c9517805        none                 null  

Видно, что Compose самостоятельно создал сеть foodtrucks_default и подсоединил оба сервиса в эту сеть, так, чтобы они могли общаться друг с другом. Каждый контейнер для сервиса подключен к сети, и оба контейнера доступны другим контейнерам в сети. Они доступны по hostname, который совпадает с названием контейнера. Давайте проверим, находится ли эта информация в /etc/hosts.

$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES
bb72dcebd379        prakhar1989/foodtrucks-web   "python app.py"          20 hours ago        Up 19 hours         0.0.0.0:5000->5000/tcp   foodtrucks_web_1
3338fc79be4b        elasticsearch                "/docker-entrypoint.s"   20 hours ago        Up 19 hours         9200/tcp, 9300/tcp       foodtrucks_es_1

$ docker exec -it bb72dcebd379 bash
[email protected]:/opt/flask-app# cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.2  bb72dcebd379

Упс! Оказывается, файл понятия не имеет о es. Как же наше приложение работает? Давайте попингуем его по названию хоста:

[email protected]:/opt/flask-app# ping es
PING es (172.18.0.3) 56(84) bytes of data.
64 bytes from foodtrucks_es_1.C
--- es ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.049/0.056/0.064/0.010 ms

Вуаля! Работает! Каким-то магическим образом контейнер смог сделать пинг хоста es. Оказывается, Docker 1.10 добавили новую сетевую систему, которая производит обнаружение сервисов через DNS-сервер. Если интересно, то почитайте подробнее о предложении и release notes.

На этом наш тур по Docker Compose завершен. С этим инструментом можно ставить сервисы на паузу, запускать отдельные команды в контейнере и даже масштабировать систему, то есть увеличивать количество контейнеров. Также советую изучать некоторые другие примеры использования Docker Compose.

Надеюсь, я продемонстрировал как на самом деле просто управлять многоконтейнерной средой с Compose. В последнем разделе мы задеплоим все на AWS!


3.4 AWS Elastic Container Service

В прошлом разделе мы использовали docker-compose чтобы запустить наше приложение локально одной командой: docker-compose up. Теперь, когда приложение работает, мы хотим показать его миру, заполучить юзеров, поднять кучу денег и купить большой дом в Майами. Последние три шага выходят за пределы этого пособия, так что займемся выяснением деталей о деплое многоконтейнерного приложения в облако AWS.

Если вы дочитали до этого места, то скорее всего убедились, что Docker — довольно крутая технология. И вы не одиноки. Облачные провайдеры заметили взрывной рост популярности Докера и стали добавлять поддержку в свои сервисы. Сегодня, Докер-приложения можно деплоить на AWS, Azure,Rackspace, DigitalOcean и много других. Мы уже умеем деплоить приложение с одним контейнером на Elastic Beanstalk, а в этом разделе мы изучим AWS Elastic Container Service (или ECS).

AWS ECS — это масштабируемый и гибкий сервис по управлению контейнерами, и он поддерживает Докер. С его помощью можно управлять кластером на EC2 через простой API. В Beanstalk были нормальные настройки по умолчанию, но ECS позволяет настроить каждый аспект окружения по вашим потребностям. По этой причине ECS — не самый простой инструмент в начале пути.

К счастью, у ECS есть удобный инструмент командной строки (CLI) с поддержкой Docker Compose и автоматической провизией на ECS! Так как у нас уже есть рабочий файл docker-compose.yml, настройка и запуск на AWS должна быть достаточно легкой. Начнем!

Вначале нужно установить CLI. На момент написания этого пособия CLI-утилита не доступна на Windows. Инструкции по установке CLI на Mac и Linux хорошо описаны на сайте с официальной документацией. Установите утилиту, а потом проверьте ее работоспособность так:

$ ecs-cli --version
ecs-cli version 0.1.0 (*cbdc2d5)

Первый шаг — задать пару ключей для авторизации на инстансах. Зайдите на страницу EC2 Console и создайте новый keypair. Скачайте файл и держите его в безопасном месте. Еще один момент — имя региона. Я назвал свой ключ ecs и указал регион us-east-1. Я продолжу повествование с этим допущением.

Теперь настройте CLI:

$ ecs-cli configure --region us-east-1 --cluster foodtrucks
INFO[0000] Saved ECS CLI configuration for cluster (foodtrucks)

Команда configure с именем региона, в котором хотим разместить наш кластер, и название кластера. Нужно указать тот же регион, что использовался прри создании ключей. Если у вас не настроен AWS CLI, то следуйте руководству, которое подробно описывает все шаги.

Следующий шаг позволяет утилите создавать шаблон CloudFormation.

$ ecs-cli up --keypair ecs --capability-iam --size 2 --instance-type t2.micro
INFO[0000] Created cluster                               cluster=foodtrucks
INFO[0001] Waiting for your cluster resources to be created
INFO[0001] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0061] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0122] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0182] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0242] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS

Здесь мы указываем названия ключей, которые мы скачали (в моем случае ecs), количество инстансов (--size) и тип инстансов, на которых хотим запускать контейнеры. Флаг --capability-iam говорит утилите, что мы понимаем, что эта команда может создать ресурсы IAM.

В последнем шаге мы используем файл docker-compose.yml. Требуется небольшое изменение, так что вместо модификации файла, давайте сделаем копию и назовем ее aws-compose.yml. Содержание этого файла (после изменений):

es:
  image: elasticsearch
  cpu_shares: 100
  mem_limit: 262144000
web:
  image: prakhar1989/foodtrucks-web
  cpu_shares: 100
  mem_limit: 262144000
  ports:
    - "80:5000"
  links:
    - es

    

Единственные отличия от оригинального файла docker-compose.yml это параметры mem_limit и cpu_shares для каждого контейнера.

Также, мы убрали version и services, так как AWS еще не поддерживает версию 2 файлового формата Compose. Так как наше приложение будет работать на инстансах типа t2.micro, мы задали 250 мегабайт памяти. Теперь нам нужно опубликовать образ на Docker Hub. На момент написания этого пособия, ecs-cli не поддерживает команду build. Но Docker Compose поддерживает ее без проблем.

$ docker push prakhar1989/foodtrucks-web

Красота! Давайте запустим финальную команду, которая произведет деплой на ECS!

$ ecs-cli compose --file aws-compose.yml up
INFO[0000] Using ECS task definition                     TaskDefinition=ecscompose-foodtrucks:2
INFO[0000] Starting container...                         container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/es
INFO[0000] Starting container...                         container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/web
INFO[0000] Describe ECS container status                 container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/web desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-foodtrucks:2
INFO[0000] Describe ECS container status                 container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/es desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-foodtrucks:2
INFO[0036] Describe ECS container status                 container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/es desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-foodtrucks:2
INFO[0048] Describe ECS container status                 container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/web desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-foodtrucks:2
INFO[0048] Describe ECS container status                 container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/es desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-foodtrucks:2
INFO[0060] Started container...                          container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/web desiredStatus=RUNNING lastStatus=RUNNING taskDefinition=ecscompose-foodtrucks:2
INFO[0060] Started container...                          container=845e2368-170d-44a7-bf9f-84c7fcd9ae29/es desiredStatus=RUNNING lastStatus=RUNNING taskDefinition=ecscompose-foodtrucks:2

То, что вывод похож на вывод Docker Compose — не совпадение. Аргумент --file используется для переопределения файла по умолчанию (docker-compose.yml). Если все прошло хорошо, то вы увидите строку desiredStatus=RUNNING lastStatus=RUNNING в самом конце.

Круто! Теперь приложение запущено. Как к нему обратиться?

ecs-cli ps
Name                                      State    Ports                     TaskDefinition
845e2368-170d-44a7-bf9f-84c7fcd9ae29/web  RUNNING  54.86.14.14:80->5000/tcp  ecscompose-foodtrucks:2
845e2368-170d-44a7-bf9f-84c7fcd9ae29/es   RUNNING                            ecscompose-foodtrucks:2

Откройте http://54.86.14.14 в браузере, и увидите Food Trucks во всей своей желто-черной красе! Заодно, давайте взглянем на консоль AWS ECS.

Видно, что был создан ECS-кластер ‘foodtrucks’, и в нем выполняется одна задача с двумя инстансами. Советую поковыряться в этой консоли и изучить разные ее части и опции.

Вот и все. Всего несколько команд — и приложение работает на AWS!


4.0 Заключение

Мы подошли к концу. После длинного, изматывающего, но интересного пособия вы готовы захватить мир контейнеров! Если вы следовали пособию до самого конца, то можете заслуженно гордиться собой. Вы научились устанавливать Докер, запускать свои контейнеры, запускать статические и динамические веб-сайты и, самое главное, получили опыт деплоя приложений в облако.

Надеюсь, прохождение этого руководства помогло вам стать увереннее в своих способностях управляться с серверами. Когда у вас появится новая идея для сайта или приложения, можете быть уверены, что сможете показать его людям с минимальными усилиями.


4.1 Следующие шаги

Ваше путешествие в мир контейнеров только началось. Моей целью в этом руководстве было нагулять ваш аппетит и показать мощь Докера. В мире современных технологий иногда бывает сложно разобраться самостоятельно, и руководства вроде этого призваны помогать вам. Это такое пособие, которое мне хотелось бы иметь, когда я только знакомился с Докером сам. Надеюсь, ему удалось заинтересовать вас, так что теперь вы сможете следить за прогрессом в этом области не со стороны, а с позиции знающего человека.

Ниже — список дополнительных полезных ресурсов. Советую использовать Докер в вашем следующем проекте. И не забывайте — практика приводит к совершенству.

Дополнительные ресурсы


Удачи, юный падаван!


4.2 Фидбек автору

Теперь моя очередь задавать вопросы. Вам понравилось пособие? Оно показалось вам запутанным, или вам удалось научиться чему-то?

Напишите мне (автору оригинального пособия, — прим. пер.) напрямую на [email protected] или просто создайте issue. Я есть в Твиттере, так что если хотите, то можете писать туда.

(Автор оригинального пособия говорит по-английски, — прим. пер.).

Буду рад услышать ваши отзывы. Не стесняйтесь предлагать улучшения или указывать на мои ошибки. Я хочу, чтобы это пособие стало одним из лучших стартовых руководств в интернете. У меня не получится это без вашей помощи.

Что такое Docker — реестр контейнеров


Рис. 2

Система инкрементных файлов

Файловая система образа Docker многоуровневая с семантикой копирования при записи. Таким образом обеспечивается наследование и повторное использование, экономия ресурсов на диске и скачивание инкрементных образов.

Как показано на рис. 2, образ Docker с развертыванием WebLogic может быть основан на образе с доменом Oracle WebLogic Server, который может быть основан на образе WebLogic, основанном на образе Java Development Kit (JDK), который в свою очередь основан на базовом образе Oracle Linux.

Реестр Docker

Хотя образы Docker легко создавать и разработчикам удобно работать с простыми и портативными образами Docker, быстро обнаружилось, что управлять тысячами образов Docker очень сложно. Решает эту проблему реестр Docker. Реестр Docker — это стандартный способ хранения и распространения образов Docker. Реестр — это репозиторий с открытым исходным кодом, имеющий либеральную лицензию Apache.

Реестр Docker также помогает улучшить контроль доступа и безопасность образов Docker, хранящихся в его репозитории. Он управляет распространением изображений, а также может интегрироваться с рабочими процессами разработки приложений. Разработчики могут настроить свой собственный реестр Docker или использовать размещенный сервис реестра Docker, например Docker Hub, Oracle Container Registry, Azure Container Registry и т. д.

Docker Hub — это размещенный реестр Docker, управляемый Docker. Docker Hub содержит более 100 000 образов контейнеров от поставщиков программного обеспечения, проектов с открытым исходным кодом и сообщества. Docker Hub содержит программное обеспечение и приложения из официальных репозиториев, таких как NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu и Oracle Linux.

При запуске контейнера Docker по умолчанию автоматически извлекает соответствующий образ из общедоступного Docker Hub, если он недоступен локально. Более того, Вы также можете создавать свои собственные образы и отправлять их в Docker Hub в общедоступный или частный репозиторий.


Рис. 3

Docker как среда выполнения микросервисов

Идея разделить монолитные приложения на более мелкие части микросервисов сегодня привлекает большое внимание разработчиков программного обеспечения.

Микросервисы развертываются независимо как процесс, используют облегченные протоколы для связи друг с другом, а каждый сервис владеет своими данными [7]. Поскольку для микросервисов применяется децентрализованный подход к управлению, требуется достаточно значительная автоматизация инфраструктуры, автоматизация тестирования, полностью автоматизированные конвейеры CD и квалифицированные и оперативные команды DevOps.

По поводу такого архитектурного стиля все еще идет много дискуссий, так как наивно было бы полагать, что приложение, разложенное на микросервисы, может просто работать как набор процессов. Вот лишь несколько требований: микросервис должен быть независимым от хоста и изолированным на уровне операционной системы. Он должен работать в пределах своих ресурсных возможностей, увеличиваться и уменьшаться в размерах, перезапускаться в случае сбоя, обнаруживаться и подключаться к другим микросервисам через программно-определяемый сетевой уровень.

Таким образом, запуск микросервиса в контейнере Docker — это прекрасный старт для достижения большинства из этих целей.

достоинства и недостатки, отзывы, ассортимент, виды, фото и видео инструкция по монтажу своими руками

Фасадные панели Docke-R производят в Германии. Это литой сайдинг из полимеров, получаемый под давлением. Литьевой метод обеспечивает высокие прочностные характеристики материалу, что позволяет увеличить срок эксплуатации до 50 лет.

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

Продукция от торговой марки Деке имеет свои особенности и достоинства:

  • привлекательный вид;
  • устойчивость к внешним повреждениям и деформациям за счет усиленных ребер жесткости;
  • сохраняет свои характеристики при температуре от +50 до -50°С;
  • не горит, при пожаре не дает открытого огня, только тлеет;
  • экологичность, в составе панелей нет токсичных добавок;
  • применение специальной системы окраски в 3 этапа придает панелям уникальные защитные свойства от воздействия ультрафиолетового излучения и агрессивных погодных явлений;
  • простота монтажа и надежное соединение достигается надежной системой замков, которыми снабжены панели деке;
  • плиты Döcke-R оборудованы специальными упорами, которые обеспечивают правильные тепловые зазоры, для сохранения стабильной геометрии панелей за весь срок эксплуатации.
  • сайдинг Деке не поддается процессам гниения и коррозии;
  • материал не привлекает насекомых и грызунов;
  • гигиеничность, материал моют от пыли простой водой;
  • натуральные текстуры;
  • высокое качество облицовочного материала.

Ассортимент фасадной облицовки Деке

В ассортименте компании Döcke-R представлено 4 коллекции фасадной облицовки: Berg, Burg, Stein, Fels. Внешние поверхности всех коллекций повторяют материалы, из которых строились средневековые замки.

Разработчики коллекций добились почти идеального сходства поверхности сайдинга с натуральным камнем, песчаником или вручную обработанным кирпичом.

Цокольная облицовка Berg («гора») включает 5 видов панелей с дизайном внешней поверхности под обожженный кирпич. Цветовая гамма представлена цветами: вишневый, серый, золотистый, кирпичный, коричневый. Текстура сайдинга имеет вид натурального кирпича. Для получения данного эффекта разработчиками компании Docke-R изготовлены формы с помощью метода трехмерного сканирования натуральных кирпичей. Размер панелей Berg — 1127×461 мм. В коллекцию входят доборные элементы: стартовый угловой профиль, углы Berg, фасадный J-профиль 30 мм, универсальные бордюры, базовые планки и внутренние углы, стартовый профиль.

Ассортимент фасадных панелей Docke

Цокольные фасадные панели Burg («замок») имеют наружную поверхность, имитирующую натуральный камень ручной обработки. Палитра коллекции включает в себя 10 цветов. Размеры материала — 1072×472 мм. Панели упакованы в коробки по 10 шт. Для выполнения монтажных работ коллекция комплектуется доборными элементами: стартовый угловой профиль, углы Bиrg, фасадный J-профиль 30 мм, универсальные бордюры, базовые планки и внутренние углы, стартовый профиль.

Внешняя поверхность полимерных панелей Stein («камень») повторяет рисунок песчаника. Коллекция представлена в 5 цветах. Плиты имеют размеры 1196×426 мм. В комплект входят доборные элементы: стартовый угловой профиль, углы Stein, фасадный J-профиль 35 мм, универсальные бордюры, базовые планки и внутренние углы, стартовый профиль. Материал расфасован в коробки по 10 шт.

Коллекция сайдинга серии Fels («гора» или «утес») имитирует скальные породы. Серия выполняется в 6 цветах. Размеры — 1150×450 мм. В комплект входят аксессуары: стартовый угловой профиль, углы Fels, фасадный J-профиль 35 мм, универсальные бордюры, базовые планки и внутренние углы, стартовый профиль.

Сайдинг серии Fels

Особенности монтажа

Фасадные системы Деке при перепадах температуры окружающей среды расширяются и сжимаются. Учитывая это свойство материала, монтаж выполняют по следующим правилам:

  • саморезы ввинчиваются только в гвоздевое отверстие;
  • саморез не докручивается до шляпки на расстояние в 1 мм;
  • плиты вставляются друг в друга до упоров, которые гарантируют тепловой зазор;
  • монтажные работы выполняют при температурах выше минус 15°С.

Фасадными панелями Деке облицовывают стены построенных зданий, еще строящихся и старые постройки. Сайдинговый профиль ТМ Döcke-R придает фасадам респектабельный вид, имеет приемлемую цену и постоянно растущую популярность.

Как многоуровнево защищать контейнеры Docker с помощью улучшенных образов

По мере того, как организации совершенствуют свое использование облака, они будут находить более инновационные и эффективные решения для своих рабочих нагрузок. Например, контейнерные приложения обеспечивают переносимость, высокую эффективность и быстрый запуск приложений. Это лишь некоторые из причин, по которым Gartner сообщает, что к 2023 году «70% приложений, развернутых в облаке, будут использовать контейнеры в качестве механизма упаковки» («Обеспечивает непрерывную доставку через контейнеры и DevOps».Лучшие практики », 16 апреля 2020 г., аналитик Деннис Смит).

Как известно, инновации сопряжены с риском. Имея это в виду, эксперты по облачной безопасности понимают, что крайне важно защитить контейнерную среду и воспользоваться преимуществами улучшенных образов для снижения этого риска.

Центр безопасности в Интернете (CIS) предоставляет образы с повышенной степенью защиты CIS, которые переносят в облако признанные во всем мире рекомендации по настройке безопасности для тестов CIS. Этот ресурс представляет собой улучшенный образ виртуальной машины (ВМ), который может использоваться операционными системами, базами данных, веб-серверами и контейнерами.Контейнерные образы с расширенными возможностями CIS создаются на основе образа поставщика через Docker. Docker, автономный программный пакет, упрощает запуск ваших приложений в нескольких вычислительных средах. CIS предлагает эти контейнеризованные образы CIS с повышенной степенью защиты на торговой площадке Amazon Web Services (AWS).

Преимущества безопасного контейнера

Контейнерное программное обеспечение, такое как Docker, упаковывает код вашего приложения вместе со всеми другими файлами и библиотеками, которые необходимы вашему приложению для запуска, поэтому вы можете легко перенести его в другие вычислительные среды.Преимущества использования этих безопасных контейнеров Docker:

  • Возможность быстро создавать и тестировать приложения. Преимущества DevOps и процессы тестирования
  • Приложения, упакованные в контейнеры, легко заменить
  • Гибкость, экономичность и простота использования

CIS создается с использованием Docker, но образы контейнеров CIS работают с другим контейнерным программным обеспечением.

Расширенный образ CIS, созданный на основе защищенного контейнера Docker

CIS предоставляет несколько улучшенных образов, размещенных в защищенном контейнере Docker на AWS Marketplace.К ним относятся версии Amazon Linux, Ubuntu Linux, NGINX и PostgreSQL. Полный список образов, обработанных CIS. Список платформ веб-сайта CIS ..

Эти расширенные CIS образы в защищенном контейнере Docker на AWS Marketplace:

  • Быстрое развертывание с предустановленной безопасностью
  • Легко исправить – удалить старые слои, захватить исправленные слои, протестировать и продолжить или легко откатить, если необходимо
  • Экономическая эффективность – AWS выставляет счета по модели с оплатой по мере использования, поэтому используйте только то, что вам нужно

Сопоставление с нормативной базой

Кибер сообщество безопасности Контрольный показатель в СНГ Когда контроль в СНГ В качестве отраслевого стандарта киберзащиты во всем мире.Кроме того, во многих отраслевых структурах эталонный показатель CIS рассматривается как приемлемый стандарт для соответствия требованиям. Эти структуры включают DoD STIG, FedRAMP, DoD Cloud Computing SRG, HIPAA, PCI DSS и NIST. Кроме того, CIS Hardened Images может помочь вам обеспечить соответствие этим фреймворкам.

Защитите свои облачные рабочие нагрузки с помощью образа CIS-Enhanced

CIS Hardened Images помогает организациям безопасно и по доступной цене работать в облаке. CIS предварительно настраивает эти улучшенные образы в соответствии с рекомендациями теста CIS.CIS возглавляет сообщество профессионалов в области кибербезопасности в разработке рекомендаций на основе консенсуса.

Обработанные изображения безопаснее стандартных изображений. Они обеспечивают защиту от вредоносных программ, неадекватной авторизации и удаленного вторжения в облако. Это также снижает первоначальные затраты на оборудование и экономит время, необходимое для обслуживания. Все улучшенные изображения CIS включают отчет CIS-CAT Pro, показывающий соответствие стандарту CIS.

Посмотреть все увеличенные изображения CIS

Copyright © 2021 IDG Communications, Inc.

Как вы можете установить Odoo 13 или 14 в Docker Container 2021 Советы

Это руководство посвящено тому, как вы можете установить Odoo 13 или 14 в Docker Container. Мы сделаем все возможное, чтобы вы поняли это руководство. Надеюсь, вам понравился этот блог. Как установить Odoo 13 или 14 на контейнер Docker . Если ваш ответ утвердительный, пожалуйста, поделитесь этим после прочтения.


Проверьте, как вы можете установить Odoo 13 или 14 на Docker Container

Есть несколько хорошо известных программ для управления бизнесом с открытым исходным кодом, и Odoo – одно из них.Он предлагает ERP, CRM, ECM, планирование проектов и многое другое… В этой статье мы узнаем, как установить Odoo 14 и 13 в докер-контейнер, работающий на Ubuntu 20.04 LTS Focal fossa.

Odoo – это бесплатное программное обеспечение для бизнеса, которое охватывает широкий круг задач. В дополнение к классическим функциям ERP среда предлагает CRM, электронную коммерцию, управление контентом, планирование проектов, управление складом, бухгалтерский учет, управление персоналом, портал, базу знаний, управление продуктами, человеческие ресурсы, маркетинг и многое другое..

В основе Odoo лежит старый OpenERP, основанный на типичной трехуровневой архитектуре. Ядро – это сервер приложений, который отвечает за бизнес-логику и контролирует доступ к базе данных.

Система также предоставляет модули для электронной коммерции, электронного маркетинга и электронной коммерции. Существует более 10 000 приложений Odoo, и их число растет с каждым днем. Он написан на Python и предлагает современный веб-интерфейс, использующий HTML 5.0 и JavaScript. Он использует сервер базы данных PostgreSQL для управления важными для бизнеса данными и конфигурацией системы.

В то время как Docker – это платформа виртуализации на основе контейнеров, которую можно установить в популярной операционной системе для создания изолированных контейнеров (виртуальных машин), очень легких.

Шаги по установке Odoo 13/14 в контейнере Docker. Здесь мы используем Ubuntu 20.04 LTS в качестве платформы операционной системы для установки Docker, однако приведенные здесь шаги по установке Odoo можно использовать на любой платформе, работающей на Docker.

Убедитесь, что Docker запущен.

Просто запустите команду -docker в командном терминале вашей операционной системы, чтобы убедиться, что она у вас установлена.Если у вас его нет, сначала установите Docker в свою операционную систему, для этого вы можете проверить наши учебные пособия –

Как установить и настроить контейнер Docker в AlmaLinux 8

Установить и настроить контейнер Docker в Rocky Linux 8 или CentOS / RHEL 8 Установка Docker CE на Debian 11 Bullseye Linux Лучший способ установить Docker на Ubuntu 20.04… Как установить Docker на Windows 10

Хорошо установите Odoo Docker Image.

Если у вас есть Docker в вашей системе, чтобы установить Odoo Container, нам нужно выполнить только одну команду.Это потому, что в Docker-хабе уже есть готовый официальный образ Odoo.

Чтобы установить Odoo 14, используйте эту команду:

docker pull odoo: 14 Для Oddo 13 используйте это:

longshoreman pull odoo: 13

Установите образ Docker базы данных PostgreSQL

Следующее, что нам нужно настроить, это настроить база данных для Odoo, чтобы сохранить свои данные в Docker. Ну, как и в любом другом популярном приложении, у нас также есть картинки для этой базы данных. Итак, просто в вашем командном терминале введите –

Docker pull postgres Команда Docker PostgreSQL и образы Odoo

Создать контейнер базы данных

Итак, мы уже загрузили вышеуказанный образ PostgreSQL, теперь мы будем использовать его для создания контейнера с базой данных. .

docker run -d -v odoo-db: / var / lib / postgresql / data -e POSTGRES_USER = odoo -e POSTGRES_PASSWORD = odoo -e POSTGRES_DB = postgres –name db postgres

Примечание. Не забудьте изменить имя пользователя базы данных. и пароль, включая имя базы данных, с тем, что вы хотите сопоставить перед запуском команды.

Объяснение:

Мы прерываем предыдущую команду, чтобы понять, что происходит.

docker run -d -v: это команда docker для создания и запуска контейнера с использованием загруженного образа.

odoo-db: / var / lib / postgresql / data – с этим мы создали отдельную выделенную папку, в которой будут храниться данные базы данных. Это означает, что даже после удаления контейнера наши данные Odoo останутся нетронутыми для использования в будущем.

POSTGRES_USER = odoo – Пользователь, созданный для базы данных, измените значение на все, что захотите.

POSTGRES_PASSWORD = odo0 – Пароль для созданного пользователя базы данных. Кроме того, измените это значение, чтобы также установить свой пароль.

POSTGRES_DB = postgres: имя базы данных, которую вы хотите использовать.

–Name db: имя контейнера для его идентификации.

postgres: имя загруженного образа PostgreSQL, который мы используем для создания контейнера.

Создание и запуск контейнера Odoo

Как и в случае с PostgreSQL, мы также используем загруженный образ Odoo 14 или 13 для создания и запуска контейнера для него.

Для Odoo версии 14

docker run -v odoo-data: / var / lib / odoo -d -p 8069: 8069 –name odoo –link db: db -t odoo: 14 Для Odoo Version 13

docker run -v odoo-data: / var / lib / odoo -d -p 8069: 8069 –name odoo –link db: db -t odoo: 13 Объяснение:

odoo-data: / var / lib / odoo: Мы создали выделенная папка с постоянными данными, в которой будут храниться файлы данных и конфигурации Odoo, которые останутся там даже после удаления контейнера.

-p 8069: 8069: Откройте порт докера 8069 для доступа к веб-интерфейсу Odoo из докера. Или, проще говоря, здесь мы сопоставляем порт контейнера докеров с системным портом 8069.

–Name odoo – это имя, которое мы даем нашему контейнеру.

–Link db: db – Связывание контейнера PostgreSQL с контейнером Odoo, чтобы они могли обмениваться данными.

В то время как odoo: 13 или odoo: 14 – это образ Docker, который мы используем для создания контейнера.

Открыть порт на брандмауэре

Теперь, чтобы получить доступ к веб-интерфейсу Odoo извне с сервера, на который вы его установили, с помощью докера, мы должны открыть его порт 8069 в системе.

Для Ubuntu, Debian, Linux Mint и ему подобных:

sudo ufw allow 8069 Для RHEL, CentOS, AlmaLinux, RockyLinux, Oracle:

firewall-cmd –zone = public –add-port = 8069 / tcp –permanentfirewall -cmd –reload

Доступ к веб-интерфейсу Odoo и создание базы данных

Теперь перейдите к любому ПК или ноутбуку, у которого есть доступ к IP-адресу сервера, на котором вы установили Docker и его контейнер. После этого откройте браузер и укажите IP-адрес сервера вместе с номером порта 8069.

Пример:

http://192.168.0.102:8069 Введите необходимую информацию и создайте базу данных

Создайте базу данных Odoo

Установите приложения и начните использовать Odoo.

Приложения Odoo установлены в Docker containerCRM и ERP

Заключительные слова: Как вы можете установить Odoo 13 или 14 на Docker Container

Надеюсь, вы понимаете эту статью Как вы можете установить Odoo 13 или 14 на Docker Container , если ваш ответ отрицательный, тогда вы можете спросить что угодно через раздел форума контактов, связанный с этой статьей.И если ваш ответ положительный, поделитесь этой статьей со своей семьей и друзьями.

Как Docker сломался пополам

Docker не изобрел контейнеры – метод упаковки компьютерного кода в компактные блоки, которые можно было бы легко перенести с ноутбука на сервер на сервер, – но он сделал их массовыми, создав общий набор инструментов с открытым исходным кодом и повторно используемых образов, которые внезапно позволил всем разработчикам создать свое программное обеспечение один раз и запускать его где угодно.

Легкость, с которой Docker позволила разработчикам «контейнеризовать» свой код и перемещать его из системы в систему, быстро сделала его чем-то вроде отраслевого стандарта, изменив доминирующий метод развертывания приложений на виртуальных машинах (ВМ) и сделав Docker единым целым. самых быстрых корпоративных технологий поколения.

Сегодня Docker все еще жив, но это лишь часть той компании, которой он мог бы стать, так и не сумев превратить это технологическое новшество в устойчивую бизнес-модель, что в конечном итоге привело к продаже своего корпоративного бизнеса Mirantis в ноябре 2019 года. .InfoWorld побеседовала с более чем десятком бывших и нынешних сотрудников Docker, разработчиками ПО с открытым исходным кодом, клиентами и отраслевыми аналитиками, чтобы услышать историю о том, как Docker разбился на части.

Рождение Docker

Основанная в 2008 году Соломоном Хайксом в Париже под названием DotCloud, компания, которая впоследствии стала Docker, изначально была задумана как платформа как услуга (PaaS) для разработчиков, позволяющая легко создавать и отправлять свои приложения.

К Хайксу вскоре присоединился его друг и коллега-программист Себастьен Пал, а затем летом 2010 года он вместе переехал в Кремниевую долину, чтобы пройти престижную программу Y Combinator.Получив один раз отказ, Хайкс и Пал подали повторную заявку, и отец Пала передал им деньги на билеты на самолет до Сан-Франциско за несколько недель до собеседования. Увы, пара была снова отвергнута, пока выпускник YC Джеймс Линденбаум, основатель конкурирующей компании под названием Heroku, не поручился за них.

Docker, каким мы его знаем, впервые был продемонстрирован Хайксом на PyCon в марте 2013 года, где он объяснил, что разработчики продолжали запрашивать доступ к базовой технологии, на которой основана платформа DotCloud.«Мы всегда думали, что было бы круто сказать« да », вот наша низкоуровневая часть, теперь вы можете создавать контейнеры Linux вместе с нами и делать все, что хотите, создавать свою платформу, вот что мы делаем. , – сказал он во время разговора.

«Звучит банально, но мы с Соломоном говорили о предварительном выпуске, и мы могли видеть все контейнеровозы, заходящие в порт Окленда, и мы говорили о ценности контейнера в мире судоходства», – Бен Голуб, Об этом InfoWorld сообщил генеральный директор Docker в период с 2013 по 2017 год.«Тот факт, что было легче доставить машину из одного конца света, чем доставить приложение с одного сервера на другой, казался проблемой, созревшей для решения».

Проект с открытым исходным кодом Docker быстро набрал обороты, привлекая тысячи пользователей, громкие партнерские отношения с Microsoft, AWS и IBM, а также тачки, полные венчурных денег, включая ранние инвестиции Питера Фентона из Benchmark and Dan Шольник из Trinity Ventures. Переориентированная компания сменила название на Docker и получила около 300 миллионов долларов от таких компаний, как Benchmark, Coatue Management, Goldman Sachs и Greylock Partners.Однако, как и многие компании, занимающиеся разработкой программного обеспечения с открытым исходным кодом, она изо всех сил пыталась найти прибыльную бизнес-модель, и этим инвесторам так и не удалось добиться своего большого выхода.

«Соломон создал одну из самых привлекательных технологий за последние 20 лет, и в бизнесе по упаковке чего-то с учетом мнения и превращения его в чрезвычайно ценный для огромного числа разработчиков Docker был огромным», – сказал аналитик RedMonk Джеймс Губернатор. «Докер принимал неверные решения? Очевидно, что да, но венчурные капиталисты сошли с ума, и сумма денег, которую они бросили в них, означала, что у них, должно быть, было ощущение, что они могут сделать что угодно, а это было проблематично.

Перенесемся в 2021 год, и краткая версия этой истории заключается в том, что популярный инструмент оркестровки контейнеров с открытым исходным кодом Kubernetes съел обед Docker (бизнес), сместив основной центр прибыли: корпоративную версию собственного инструмента оркестровки контейнеров. называется Docker Swarm. Однако реальная история намного сложнее.

Сложно коммерциализировать открытый исходный код

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

«Есть поговорка, что« когда слоны дерутся, траву топтают », и нам стало ясно, что речь идет не только о Docker, но и о том, как поставщики облачных услуг конкурируют друг с другом. Все хотели развести нас в разные стороны. Это было постоянное жонглирование, чтобы оставаться верным нашим ценностям и корням и строить бизнес », – сказал Голуб.

Бывший генеральный директор отмечает, что все эти факторы создали «естественную напряженность» по мере роста Docker. «Мы хотели создать отличное сообщество и монетизировать продукт для разработчиков, а также создать отличный операторский продукт, который позволил бы клиентам создавать и развертывать контейнеры в любом масштабе», – сказал Голуб.«Это было видение, и довольно быстро мы поняли, что нам нужно быстро масштабироваться, и у нас не было много времени, чтобы сбалансировать сообщество и коммерческий бизнес … в стартапе вы принимаете 100 решений в день, и вы надеетесь 80 правы ».

Docker начал серьезно относиться к бизнес-стратегии по монетизации своего лидирующего положения в мире контейнеров примерно в 2014 году, когда компания потратила часть этих денег венчурного капитала на приобретение Koality в 2014 году и Tutum в 2015 году, а также запустила первую итерацию. собственной программы поддержки предприятий.

Эти инвестиции привели к появлению таких продуктов, как Docker Hub, который можно представить как GitHub для образов Docker (который также существует сейчас), и, в конечном итоге, Docker Enterprise. Но ни один из этих продуктов по-настоящему не понравился корпоративным клиентам, которые, как правило, были счастливы работать с более авторитетными партнерами или создавать, а не покупать решения, поскольку Docker работал над созданием набора продуктов, которые действительно были нужны клиентам.

«Мы никогда не поставляли отличный коммерческий продукт», – сказал Хайкс InfoWorld во время отпуска во Франции этим летом.«Причина в том, что мы не сосредоточились. Мы постарались сделать всего понемногу. Достаточно сложно поддерживать рост вашего сообщества разработчиков и создать один отличный коммерческий продукт, не говоря уже о трех или четырех, и невозможно сделать и то, и другое, но это то, что мы пытались сделать и потратили на это огромные деньги. ”

«За пределами открытого исходного кода не было технической доставки, – сказал Ник Стайнемейтс, бывший вице-президент по развитию бизнеса и техническим альянсам и один из первых сотрудников Docker.«Была принципиальная неспособность поставлять коммерческое программное обеспечение».

Оглядываясь назад, Хайкс считает, что Docker следовало тратить меньше времени на доставку продуктов и больше времени на то, чтобы выслушивать клиентов. «Я бы не спешил с масштабированием коммерческого продукта и вложил больше средств в сбор информации от нашего сообщества и создание команды, посвященной пониманию их коммерческих потребностей», – сказал Хайкс. «У нас был период в 2014 году, который был переломным моментом, и мы чувствовали, что не можем ждать, но я думаю, что у нас была роскошь ожидания большего, чем мы думали.

Другие считают, что Docker слишком рано раздавал слишком много бесплатно. «Они выпустили что-то бесплатно, и это здорово, – сказала Келси Хайтауэр из Google в интервью журналу Increment ранее в этом году. «Они решили всю проблему и достигли потолка этой проблемы: создать изображение, построить его, где-нибудь сохранить, а затем запустить. Что еще делать? »

Хайкс не согласен с этой оценкой. «Я думаю, что это неправильно, и, вообще говоря, основной продукт с открытым исходным кодом вызвал массовый рост, который, в первую очередь, создал возможность для монетизации», – сказал он.«Многие компании успешно монетизируют Docker, но только не Docker. Было много вещей, которые можно было монетизировать, но Docker не смог его реализовать ».

Например, и Red Hat, и Pivotal (теперь часть VMware) были первыми партнерами Docker, интегрируя контейнеры Docker в свои коммерческие продукты PaaS (OpenShift и Cloud Foundry соответственно) и внося свой вклад в проект с открытым исходным кодом.

«Если я буду щедрым, то вклад Red Hat на раннем этапе немного раскрутил Соломона», – сказал Стинемейтс.«Соломон сжег много мостов, и на Hacker News есть сообщения о том, что он начал драки со скептиками. У партнеров по предприятию не могло быть такого с Соломоном ».

Сегодня Хайкс говорит, что он был виновен в том, что перепутал «сообщество с экосистемой». Red Hat, в частности, «не были частью сообщества, они никогда не поддерживали успех Docker», – сказал он. «Ошибка с нашей стороны заключалась в том, что мы отчаянно хотели, чтобы они стали частью сообщества. Оглядываясь назад, мы никогда бы не выиграли от этого партнерства.

В результате первые клиенты, такие как компания по производству туристических технологий Amadeus, обратились к Red Hat в 2015 году, чтобы заполнить то, что они считали корпоративным уровнем, оставленным Docker. «Мы перешли непосредственно от новаторского режима, в котором мы использовали версии [Docker] с открытым исходным кодом, к прочному партнерству с Red Hat, где они покрывали поддержку контейнерных технологий для нас», – сказал Эдуард Хубин, глава облачной платформы. решения в Amadeus, сообщили InfoWorld по электронной почте. «Контейнеризация была первым шагом на пути технологического отхода от виртуализации.Настоящим переломным моментом для предприятия стало решение для оркестровки контейнеров. Очевидно, что Docker проиграл эту битву Kubernetes, и для них это была очень сложная ситуация ».

Решение Kubernetes

Docker пожаловался на предыдущий набор решений, связанных с его отказом по-настоящему принять Kubernetes как развивающийся инструмент оркестровки контейнеров, который позволил клиентам запускать флоты контейнеров в масштабе и в унисон – вместо того, чтобы продвигаться вперед с собственным проприетарным оркестратором Docker Swarm (RIP) с близоруким уровнем внимания.

«Самой большой ошибкой было упустить Kubernetes. Мы оказались в том пузыре коллективного мышления, где внутренне мы думали, что Kubernetes слишком сложен, а Swarm будет гораздо более успешным », – сказал Жером Петаццони, один из первых и старейших сотрудников Docker. «Это было нашей коллективной неудачей, чтобы не осознавать этого».

По правде говоря, Docker имел возможность тесно сотрудничать с командой Kubernetes в Google в 2014 году и потенциально владеть всей экосистемой контейнера в процессе.«Мы могли бы сделать Kubernetes первоклассным Docker-проектом под баннером Docker на GitHub. Оглядываясь назад, это было серьезной ошибкой, учитывая, что Swarm так поздно поступил на рынок », – сказал Stinemates.

Эти первые обсуждения в офисах Google в Сан-Франциско были техническими и напряженными, по словам нескольких человек, присутствовавших в зале, поскольку обе стороны твердо придерживались мнения о том, как следует проводить оркестровку контейнеров.

Крейг Маклакки, соучредитель Kubernetes, а ныне вице-президент VMware, говорит, что он предлагал передать Kubernetes Docker, но стороны не смогли прийти к соглашению.«В этом был взаимный элемент высокомерия: они говорили о том, что мы не понимаем опыта разработчиков, но взаимное чувство заключалось в том, что эти молодые выскочки действительно не понимают управления распределенными системами», – сказал он InfoWorld. Другие говорят, что дискуссии носили более неформальный характер и были сосредоточены на совместной разработке контейнерных технологий. В любом случае, команды никогда не сходились во взглядах и в итоге пошли разными путями, и Google запустил сам Kubernetes летом 2014 года.

Хайкс оспаривает, что Google предлагал Docker право собственности на проект Kubernetes, говоря, что у них была «возможность быть частью экосистемы, как и все остальные.

Хайкс признает, что в то время между командами Docker и Google существовала напряженность. «Был момент, когда возобладало эго. «Многие умные и опытные люди в Google были ошеломлены посторонними в Docker», – сказал Хайкс. «Мы не работали в Google, мы не учились в Стэнфорде, у нас не было докторской степени по информатике. Некоторые люди считали, что это их дело, поэтому произошла битва эго. Результатом этого не было хорошего сотрудничества между командами Docker и Kubernetes, когда действительно имело смысл сотрудничать.

«Это фундаментальное эго, с одной стороны, и напряженность, с другой, с [соучредителями Kubernetes] Джо Бедой, Бренданом Бернсом и Крейгом МакЛаки, которые твердо придерживались мнения о необходимости API уровня обслуживания, а Docker технически имел собственное мнение по этому поводу. единый API с точки зрения простоты – это означало, что мы не могли прийти к единому мнению », – сказал Стинемейтс.

Хайкс признает, что в то время Docker находился под давлением необходимости найти решение для оркестрации для клиентов, которые хотели масштабировать использование контейнеров, но в то время не было очевидно, что Kubernetes станет таким решением.«Kubernetes появился так рано и стал одним из десятков, и мы даже не догадывались, что он будет доминировать», – сказал Хайкс. «Было даже неясно, насколько привержен этому делу Google. Я спросил наших инженеров и архитекторов, что делать, и они порекомендовали нам продолжить разработку Swarm », – сказал он.

Даже Маклакки признает, что «не знал, что Kubernetes станет Kubernetes . Легко оглянуться на историю и назвать это плохим выбором ».

Как бы то ни было, Kubernetes в конечном итоге выиграл битву за оркестровку контейнеров, а все остальное становится отличным моментом «скользящей двери» для индустрии программного обеспечения.

Docker Desktop больше не является бесплатным для корпоративных пользователей

Docker начнет принуждать корпоративных клиентов подписаться на платный план для использования его популярного настольного приложения с 31 августа 2021 года в рамках серьезного изменения цен на подписку со стороны контейнерной компании.

Существующие профессиональные клиенты Docker Desktop, которые работают в компании с более чем 250 сотрудниками или имеют доход в размере 10 миллионов долларов, должны до 31 января 2022 года подписаться на платную подписку, чтобы продолжить использование приложения.Он останется бесплатным для малого бизнеса, личного пользования, образования и «некоммерческих проектов с открытым исходным кодом», на которые, по словам компании, приходится около половины ее текущей пользовательской базы.

Этот шаг является частью широкого изменения условий лицензирования Docker, так как генеральный директор Скотт Джонстон продолжает планировать реорганизацию некогда блестящего стартапа горячих контейнеров, который продал свой корпоративный бизнес Mirantis в 2019 году. При Джонстоне остатки компании сосредоточился на обслуживании разработчиков, создающих контейнерные приложения, в первую очередь через среду выполнения контейнера Docker Engine, репозиторий образов Hub и приложение Desktop, которое установлено на 3.3 миллиона компьютеров по последним подсчетам.

Новые тарифные планы – «Личный», «Профессиональный», «Групповой» и «Бизнес» заменяют старые тарифные планы «Бесплатный», «Профессиональный», «Групповой» и «Большой». План Personal остается бесплатным, план Pro стоит 5 долларов в месяц для отдельных лиц, а план Team стоит 7 долларов в месяц на пользователя. Новый бизнес-план начинается с 21 доллара за пользователя в месяц.

Планы Pro и Team во многом останутся прежними, в то время как крупным бизнес-пользователям – это корпоративный план во всем, кроме названия – потребуется платная подписка на дополнительные функции, такие как ограничения реестра, единый вход и безопасное управление цепочкой поставок программного обеспечения. .

Пользователи Docker Personal продолжат получать бесплатный доступ к Desktop, а также к Docker CLI, Docker Compose, Docker Engine, Docker Hub и официальным изображениям Docker.

«Обновленные условия лицензии для Docker Desktop отражают нашу потребность в устойчивом масштабировании нашего бизнеса и позволяют нам продолжать обеспечивать ценность всех подписок Docker», – написал Джонстон в сообщении в блоге, в котором подробно описаны изменения.

Не было никаких изменений в среде выполнения Docker Engine, в исходных проектах Docker с открытым исходным кодом или в проектах Moby.

Copyright © 2021 IDG Communications, Inc.

Новая подписка «Business» здесь • Реестр

Docker ограничит использование бесплатной версии своей утилиты Docker Desktop частными лицами или малыми предприятиями и ввел новую более дорогую подписку, поскольку она ищет устойчивую бизнес-модель.

Компания переименовала свой бесплатный план в «Персональный» и теперь требует, чтобы компании с 250 или более сотрудниками или годовой выручкой более 10 миллионов долларов США использовали платную подписку, если им требуется Docker Desktop.В Docker Engine из командной строки изменений нет. Подписки Pro за 5 долларов в месяц и Teams за 7 долларов в месяц остаются прежними, но новая бизнес-подписка за 21 доллар в месяц добавляет функции, включая централизованное управление, единый вход и повышенную безопасность.

Новые планы Docker

Платформа Docker состоит из нескольких компонентов, из которых Docker Desktop – лишь одна часть. Образы Docker определяют содержимое контейнеров. Контейнеры Docker – это запускаемые экземпляры образов. Демон Docker – это фоновое приложение, которое управляет образами и контейнерами Docker и запускает их.Клиент Docker – это служебная программа командной строки, которая вызывает API-интерфейс демона Docker. Реестры Docker содержат образы, а Docker Hub – широко используемый общедоступный реестр. Большая часть Docker (но не Desktop) имеет открытый исходный код под лицензией Apache v2.

В то время как большинство компонентов Docker доступны для Windows, Mac и Linux, и, несмотря на то, что большинство контейнеров Docker работают в Linux, Desktop доступен только для Windows и Mac …

Docker Desktop – это инструмент с графическим интерфейсом для управления различными компонентами и функциями Docker, включая контейнеры, образы, тома (хранилище, подключенное к контейнерам), локальные Kubernetes, среды разработки в контейнерах и многое другое.В то время как большинство компонентов Docker доступны для Windows, Mac и Linux, и, несмотря на то, что большинство контейнеров Docker работают в Linux, Desktop доступен только для Windows и Mac.

В чем причина изменений? По словам генерального директора Скотта Джонстона, Docker стал корпоративным стандартом, но есть проблемы с безопасностью в цепочке поставок программного обеспечения, которые компания хочет решить. Кроме того, что, возможно, наиболее важно, компании нужна жизнеспособная бизнес-модель.

«Мы по-прежнему наблюдаем рост на рынке девелоперов.Согласно последним статистическим данным, к 2030 году в мире будет 45 миллионов разработчиков по сравнению с 18 с некоторыми миллионами сегодня… для этого необходимо, чтобы у нас был устойчиво масштабируемый бизнес », – сказал Джонстон The Register .

Большинство пользователей Docker используют его бесплатно, подтвердил Джонстон, хотя он надеется, что в результате изменений количество платных подписок увеличится. «По нашим оценкам, сегодня вдвое больше подписчиков, которые, вероятно, сочтут необходимым подписаться на подписку, но это все еще менее 10 процентов от общего использования Docker», – сказал он.

Есть ли риск, что некоторые пользователи просто решат не использовать Docker Desktop и продолжат пользоваться бесплатными инструментами командной строки? «Всегда существует ненулевой риск, но мы попытались провести черту так, чтобы именно те организации, которые уже получают большую пользу от Docker Desktop, будут рассматривать 5 долларов за рабочее место как скромные средства», – сказал Джонстон.

Компаниям достаточно подписаться на планы Pro или Teams, чтобы соответствовать требованиям. Какова добавленная стоимость новой подписки Business при трехкратной цене? «Уровень Business по цене 21 доллар за место действительно добавляет намного больше ценности», – сказал Джонстон. «Во-первых, у него есть то, что мы называем безопасными функциями цепочки поставок программного обеспечения. Пользователи могут устанавливать в централизованной плоскости управления то, что они хотят разрешить разработчикам. Это распространяется на рабочие столы Docker, которые могут применять эти политики в среды разработки.

«Мы также обеспечиваем централизованное управление на основе SaaS для контроля конфигурации использования ЦП, памяти, портов и доступа к брандмауэру. Единый вход – еще один пример безопасности и управления пользователями, которые мы обеспечиваем только на этом бизнес-уровне. . ”

На уровне Business также есть варианты приобретения пакетов поддержки премиум-класса и увеличения потребления образов Docker, если оно превышает ограничения пакета, опять же за дополнительную плату.Docker раньше указывал «Премиальную поддержку клиентов» как функцию всех своих платных планов, но теперь это называется «поддержка по электронной почте».

Нора в форме пингвина

Есть также несколько недостатков, связанных с ориентацией на Docker Desktop, не в последнюю очередь из-за того, что он не работает в Linux. «По нашим оценкам, Linux составляет от 20 до 25 процентов сред разработки», – сказал нам Джонстон. «Мы хотим иметь согласованную плоскость управления во всех этих сферах, поэтому следите за этим пространством». Между тем «обновленные условия Docker Desktop применимы только к Mac и Windows.«

Другая проблема связана с удаленными средами разработки, такими как GitHub Codespaces или Gitpod. «У нас есть запросы клиентов на этот вариант использования», – сказал Джонстон, и они будут частично рассмотрены Docker Desktop для Linux, когда они появятся. «Мы по-прежнему видим подавляющее большинство наших пользователей на выделенных локальных машинах, Windows Mac и Linux», – сказал он, но компания знает о тенденциях. «Пользователи хотят иметь такой же удаленный опыт, как и локально, и этот опыт Docker может быть предоставлен удаленно.Это вопрос производства и доставки ».

Новые условия будут трудно продавать для некоторых, но одна область, которую Docker может использовать в дальнейшем, – это безопасность. «Каждый образ контейнера в Интернете создается с помощью Docker Build. Сборка отправляется в репозиторий Git, извлекает исходный код, создает образ. Таким образом, Docker Build дает нам возможность быть в самом начале создания этого образа. Происходит преобразование стандартов, при котором мы можем отследить происхождение каждого слоя изображения, мы можем начать подписывать эти слои, и с помощью этих метаданных мы можем начать автоматическое принятие решений, автоматическую отчетность, автоматическую видимость того, что было сделано для это изображение на каждом этапе жизненного цикла.«

Johnston предусматривает создание на основе этого инструментария, который «помогает сотрудникам отдела нормативно-правового соответствия:« Покажите мне, кто соблюдает требования, обновите все эти рабочие столы последними образами »… этот набор функций, который мы представляем [сейчас], – это только начало того, что будет многолетнее наращивание дополнительных функций исправления цепочки поставок безопасного программного обеспечения “.

Впрочем, до такого сценария еще далеко. Стандарт подписи должен быть Notary v2, проект CNCF, и прогресс идет медленно, с планами на 2021 год, сфокусированными на прототипах и «начать спецификацию Notary v2».«Между тем, Docker уже предлагает сканирование уязвимостей на основе технологии Snyk. ®

Учебное пособие по Docker для начинающих

Введение

Что такое докер?

Википедия определяет Docker как

– проект с открытым исходным кодом, который автоматизирует развертывание программных приложений внутри контейнеров , обеспечивая дополнительный уровень абстракции и автоматизации виртуализации на уровне ОС в Linux.

Вау! Это полный рот. Проще говоря, Docker – это инструмент, который позволяет разработчикам, системным администраторам и т. Д. Легко развертывать свои приложения в песочнице (называемой контейнерами ) для работы в операционной системе хоста, то есть Linux. Ключевым преимуществом Docker является то, что он позволяет пользователям упаковать приложение со всеми его зависимостями в стандартизированный модуль для разработки программного обеспечения. В отличие от виртуальных машин, контейнеры не имеют больших накладных расходов и, следовательно, позволяют более эффективно использовать базовую систему и ресурсы.

Что такое контейнеры?

Сегодня отраслевым стандартом является использование виртуальных машин (ВМ) для запуска программных приложений. Виртуальные машины запускают приложения внутри гостевой операционной системы, которая работает на виртуальном оборудовании, работающем под управлением ОС хоста сервера.

Виртуальные машины

отлично подходят для обеспечения полной изоляции процессов для приложений: существует очень мало способов, которыми проблема в операционной системе хоста может повлиять на программное обеспечение, работающее в гостевой операционной системе, и наоборот. Но эта изоляция обходится дорого – вычислительные затраты, затрачиваемые на виртуализацию оборудования для использования гостевой ОС, значительны.

Контейнеры используют другой подход: используя низкоуровневую механику операционной системы хоста, контейнеры обеспечивают большую часть изоляции виртуальных машин при небольшой вычислительной мощности.

Зачем нужны контейнеры?

Контейнеры

предлагают механизм логической упаковки, в котором приложения могут быть абстрагированы от среды, в которой они фактически работают. Такое разделение позволяет легко и последовательно развертывать приложения на основе контейнеров, независимо от того, является ли целевая среда частным центром обработки данных, общедоступным облаком или даже личным ноутбуком разработчика.Это дает разработчикам возможность создавать предсказуемые среды, которые изолированы от остальных приложений и могут быть запущены где угодно.

С точки зрения операций, помимо переносимости, контейнеры также предоставляют более детальный контроль над ресурсами, повышая эффективность вашей инфраструктуры, что может привести к лучшему использованию ваших вычислительных ресурсов.

Google Trends для Docker

Благодаря этим преимуществам контейнеры (и Docker) получили широкое распространение.Такие компании, как Google, Facebook, Netflix и Salesforce, используют контейнеры, чтобы сделать большие группы инженеров более продуктивными и улучшить использование вычислительных ресурсов. Фактически, Google считает, что контейнеры избавили от необходимости в центре обработки данных.

Чему меня научит этот учебник?

Этот учебник призван стать универсальным средством, позволяющим запачкать руки с помощью Docker. Помимо демистификации ландшафта Docker, он даст вам практический опыт создания и развертывания собственных веб-приложений в облаке.Мы будем использовать Amazon Web Services для развертывания статического веб-сайта и двух динамических веб-приложений на EC2 с использованием Elastic Beanstalk и Elastic Container Service. Даже если у вас нет предыдущего опыта развертывания, это руководство должно быть всем, что вам нужно для начала работы.


Начало работы

Этот документ состоит из нескольких разделов, каждый из которых объясняет определенный аспект Docker. В каждом разделе мы будем вводить команды (или писать код). Весь код, использованный в руководстве, доступен в репозитории Github.

Примечание. В этом руководстве используется Docker версии 18.05.0-ce . Если вы обнаружите, что какая-либо часть учебника несовместима с будущей версией, поднимите вопрос. Спасибо!

Предварительные требования

Для этого учебника не требуются какие-либо специальные навыки, кроме базового удобства работы с командной строкой и использования текстового редактора. В этом руководстве используется git clone для локального клонирования репозитория. Если в вашей системе не установлен Git, либо установите его, либо не забудьте вручную загрузить zip-файлы с Github.Предыдущий опыт разработки веб-приложений будет полезен, но не обязателен. По мере продвижения по руководству мы будем использовать несколько облачных сервисов. Если вы хотите продолжить, создайте учетную запись на каждом из этих веб-сайтов:

Настройка компьютера

Установка всех инструментов на вашем компьютере может быть сложной задачей, но, к счастью, поскольку Docker стал стабильным, настроить Docker и запустить его на вашей любимой ОС стало очень легко.

До нескольких выпусков назад запуск Docker в OSX и Windows был довольно сложной задачей.Однако в последнее время Docker вложил значительные средства в улучшение процесса адаптации своих пользователей к этим ОС, поэтому запуск Docker теперь – легкая прогулка. Руководство по началу работы с по Docker содержит подробные инструкции по настройке Docker на Mac, Linux и Windows.

По завершении установки Docker протестируйте установку Docker, выполнив следующее:

  $ docker run hello-world

Привет из Докера.
Это сообщение показывает, что ваша установка работает правильно....  

Привет, мир

Игра с Busybox

Теперь, когда у нас все настроено, пришло время испачкать руки. В этом разделе мы собираемся запустить контейнер Busybox в нашей системе и познакомиться с командой docker run .

Для начала запустим в нашем терминале:

  $ docker pull busybox  

Примечание. В зависимости от того, как вы установили докер в своей системе, вы можете увидеть ошибку , в которой отказано в разрешении , после выполнения указанной выше команды.Если вы используете Mac, убедитесь, что движок Docker запущен. Если вы работаете в Linux, добавьте к командам docker префикс sudo . В качестве альтернативы вы можете создать группу докеров, чтобы избавиться от этой проблемы.

Команда pull извлекает образ busybox из реестра Docker и сохраняет его в нашей системе. Вы можете использовать команду docker images , чтобы просмотреть список всех образов в вашей системе.

  $ образы докеров
РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАН ВИРТУАЛЬНЫЙ РАЗМЕР
busybox latest c51f86c28340 4 недели назад 1.109 МБ  

Запуск Docker

Отлично! Теперь давайте запустим контейнер Docker на основе этого образа. Для этого мы собираемся использовать всемогущую команду docker run .

  $ docker run busybox
$  

Подождите, ничего не произошло! Это ошибка? Ну нет. За кулисами произошло много всего. Когда вы вызываете run , клиент Docker находит образ (в данном случае busybox), загружает контейнер и затем запускает команду в этом контейнере.Когда мы запускали docker run busybox , мы не предоставляли команду, поэтому контейнер загрузился, выполнил пустую команду и затем вышел. Ну да – облом вроде. Попробуем что-нибудь поинтереснее.

  $ docker run busybox echo "привет от busybox"
привет от busybox  

Красиво – наконец-то мы видим какой-то вывод. В этом случае клиент Docker послушно выполнил команду echo в нашем контейнере busybox, а затем вышел из нее. Если вы заметили, все это произошло довольно быстро.Представьте, что вы загружаете виртуальную машину, выполняете команду, а затем завершаете ее работу. Теперь вы знаете, почему говорят, что контейнеры быстрые! Хорошо, теперь пора увидеть команду docker ps . Команда docker ps показывает все запущенные в данный момент контейнеры.

  $ докер пс
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНА СОСТОЯНИЕ ИМЕНА ПОРТОВ  

Поскольку ни один контейнер не запущен, мы видим пустую строку.Попробуем более полезный вариант: docker ps -a

  $ docker ps -a
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
305297d7a235 busybox "uptime" 11 минут назад Завершился (0) 11 минут назад distracted_goldstine
ff0a5c3750b9 busybox "sh" 12 минут назад Завершился (0) 12 минут назад elated_ramanujan
14e5bd11d164 hello-world "/ hello" 2 минуты назад Завершился (0) 2 минуты назад thirsty_euclid  

Итак, то, что мы видим выше, – это список всех запущенных нами контейнеров.Обратите внимание, что столбец STATUS показывает, что эти контейнеры закрылись несколько минут назад.

Вы, наверное, задаетесь вопросом, есть ли способ выполнить в контейнере более одной команды. Давайте попробуем это сейчас:

  $ docker run -it busybox sh
/
bin dev и т. д. home proc root sys tmp usr var
/
 05:45:21 до 5:58, 0 пользователей, средняя нагрузка: 0,00, 0,01, 0,04  

Выполнение команды run с флагами -it подключает нас к интерактивному терминалу в контейнере.Теперь мы можем запускать в контейнере столько команд, сколько захотим. Найдите время, чтобы выполнить свои любимые команды.

Опасная зона : Если вы любите приключения, вы можете попробовать rm -rf bin в контейнере. Убедитесь, что вы запускаете эту команду в контейнере, а , а не на своем ноутбуке / настольном компьютере. Это приведет к тому, что любые другие команды, такие как ls , uptime , не будут работать. Как только все перестанет работать, вы можете выйти из контейнера (введите exit и нажмите Enter), а затем снова запустить его с помощью команды docker run -it busybox sh .Поскольку Docker каждый раз создает новый контейнер, все должно снова заработать.

На этом завершается вихревой тур по мощной команде docker run , которая, скорее всего, будет той командой, которую вы будете использовать чаще всего. Имеет смысл потратить некоторое время на то, чтобы освоиться с этим. Чтобы узнать больше о run , используйте команду docker run --help , чтобы просмотреть список всех поддерживаемых им флагов. По мере продвижения мы увидим еще несколько вариантов docker run .

Прежде чем двигаться дальше, давайте быстро поговорим об удалении контейнеров. Выше мы видели, что мы все еще можем видеть остатки контейнера даже после выхода, запустив docker ps -a . На протяжении всего этого руководства вы будете запускать docker run несколько раз, и оставление бродячих контейнеров будет занимать место на диске. Следовательно, как правило, я очищаю контейнеры после того, как закончу с ними. Для этого вы можете запустить команду docker rm . Просто скопируйте идентификаторы контейнеров сверху и вставьте их вместе с командой.

  $ докер rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9  

При удалении вы должны увидеть, как вам будут возвращены идентификаторы. Если вам нужно удалить сразу несколько контейнеров, копирование идентификаторов может оказаться утомительным занятием. В этом случае вы можете просто запустить –

  $ docker rm $ (docker ps -a -q -f status = exited)  

Эта команда удаляет все контейнеры со статусом , завершен . Если вам интересно, флаг -q возвращает только числовые идентификаторы, а -f фильтрует вывод на основе предоставленных условий.Последняя вещь, которая будет полезна, – это флаг --rm , который можно передать в docker run , который автоматически удаляет контейнер при выходе из него. Для однократных запусков докеров очень полезен флаг --rm .

В более поздних версиях Docker для достижения того же эффекта можно использовать команду docker container prune .

  $ докер контейнер чернослив
ПРЕДУПРЕЖДЕНИЕ! Это удалит все остановленные контейнеры.
Вы уверены что хотите продолжить? [да / нет] г
Удаленные контейнеры:
4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063
f98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f640

Общая мелиорированная площадь: 212 B

Наконец, вы также можете удалить изображения, которые вам больше не нужны, запустив docker rmi .

Терминология

В последнем разделе мы использовали много специфичного для Docker жаргона, который некоторых может сбить с толку. Итак, прежде чем мы двинемся дальше, позвольте мне прояснить некоторую терминологию, которая часто используется в экосистеме Docker.

  • Изображения – Чертежи нашего приложения, которые составляют основу контейнеров. В приведенной выше демонстрации мы использовали команду docker pull для загрузки образа busybox .
  • Контейнеры – создаются из образов Docker и запускают собственное приложение.Мы создаем контейнер, используя docker run , который мы сделали, используя загруженный нами образ busybox. Список запущенных контейнеров можно увидеть с помощью команды docker ps .
  • Docker Daemon – фоновая служба, работающая на хосте, которая управляет построением, запуском и распространением контейнеров Docker. Демон – это процесс, который выполняется в операционной системе, с которой общаются клиенты.
  • Docker Client – инструмент командной строки, позволяющий пользователю взаимодействовать с демоном.В более общем плане могут быть и другие формы клиентов, такие как Kitematic, которые предоставляют пользователям графический интерфейс.
  • Docker Hub – Реестр образов Docker. Вы можете рассматривать реестр как каталог всех доступных образов Docker. При необходимости можно разместить собственные реестры Docker и использовать их для получения образов.

Веб-приложения с Docker

Отлично! Итак, теперь мы посмотрели на docker run , поигрались с контейнером Docker, а также поняли некоторую терминологию.Вооружившись всеми этими знаниями, мы готовы приступить к реальной работе, то есть к развертыванию веб-приложений с помощью Docker!

Статические сайты

Начнем с маленьких шагов. Первое, что мы собираемся рассмотреть, это то, как мы можем запустить абсолютно простой статический веб-сайт. Мы собираемся получить образ Docker из Docker Hub, запустить контейнер и посмотреть, насколько легко запустить веб-сервер.

Начнем. Образ, который мы собираемся использовать, представляет собой одностраничный веб-сайт, который я уже создал для этой демонстрации и размещен в реестре – prakhar1989 / static-site .Мы можем загрузить и запустить образ прямо за один раз, используя docker run . Как отмечалось выше, флаг --rm автоматически удаляет контейнер при выходе.

  $ docker run --rm prakhar1989 / static-site  

Поскольку образ не существует локально, клиент сначала извлекает образ из реестра, а затем запускает образ. Если все пойдет хорошо, вы должны увидеть сообщение Nginx is running ... в вашем терминале. Хорошо, теперь, когда сервер запущен, как увидеть веб-сайт? На каком порту он работает? И что еще более важно, как получить доступ к контейнеру непосредственно с нашего хост-компьютера? Нажмите Ctrl + C, чтобы остановить контейнер.

Что ж, в этом случае клиент не предоставляет никаких портов, поэтому нам нужно повторно запустить команду docker run для публикации портов. Пока мы это делаем, мы также должны найти способ, чтобы наш терминал не был привязан к работающему контейнеру. Таким образом, вы можете закрыть свой терминал и оставить контейнер работающим. Это называется режимом с отключенным режимом .

  $ docker run -d -P --name static-site prakhar1989 / static-site
e61d12292d69556eabe2a44c16cbd54486b2527e2ce4f95438e504afb7b02810  

В приведенной выше команде -d отсоединит наш терминал, -P опубликует все открытые порты в случайные порты и, наконец, --name соответствует имени, которое мы хотим дать.Теперь мы можем увидеть порты, выполнив команду docker port [CONTAINER] command

  $ docker порт static-site
80 / TCP -> 0.0.0.0:32769
443 / tcp -> 0.0.0.0:32768  

Вы можете открыть http: // localhost: 32769 в своем браузере.

Примечание. Если вы используете docker-toolbox, вам может потребоваться использовать docker-machine ip по умолчанию для получения IP.

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

  $ docker run -p 8888: 80 prakhar1989 / static-site
Nginx работает ...  

Чтобы остановить отдельный контейнер, запустите docker stop , указав идентификатор контейнера. В этом случае мы можем использовать имя static-site , которое мы использовали для запуска контейнера.

  $ docker stop static-site
статический сайт  

Я уверен, вы согласны, что это было очень просто. Чтобы развернуть это на реальном сервере, вам просто нужно установить Docker и выполнить указанную выше команду Docker.Теперь, когда вы увидели, как запустить веб-сервер внутри образа Docker, вам должно быть интересно – как мне создать свой собственный образ Docker? Это вопрос, который мы рассмотрим в следующем разделе.

Образы Docker

Мы уже рассматривали образы и раньше, но в этом разделе мы углубимся в то, что такое образы Docker, и создадим свой собственный образ! Наконец, мы также будем использовать этот образ для локального запуска нашего приложения и, наконец, развернуть его на AWS, чтобы поделиться им с нашими друзьями! В восторге? Большой! Давайте начнем.

Docker-образов являются основой контейнеров. В предыдущем примере мы вытащили образ Busybox из реестра и попросили клиент Docker запустить контейнер , основанный на на этом образе. Чтобы просмотреть список образов, доступных локально, используйте команду docker images .

  $ образы докеров
РЕПОЗИТОРНЫЙ ТЕГ ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ СОЗДАН ВИРТУАЛЬНЫЙ РАЗМЕР
prakhar1989 / catnip последнее c7ffb5626a50 2 часа назад 697.9 МБ
prakhar1989 / static-site latest b270625a1631 21 часов назад 133.9 МБ
python 3-onbuild cf4002b2c383 5 дней назад 688,8 МБ
martin / docker-cleanup-volume последнее b42990daaca2 7 недель назад 22,14 МБ
ubuntu latest e9ae3c220b23 7 недель назад 187,9 МБ
busybox latest c51f86c28340 9 недель назад 1.109 МБ
hello-world последнее 0a6ba66e537a 11 недель назад 960 B  

Выше приведен список образов, которые я извлек из реестра, а также образы, которые я создал сам (мы вскоре увидим, как это сделать). ТЕГ относится к конкретному снимку изображения, а ИДЕНТИФИКАТОР ИЗОБРАЖЕНИЯ является соответствующим уникальным идентификатором для этого изображения.

Для простоты вы можете думать об образе, похожем на репозиторий git – образы могут быть зафиксированы с изменениями и иметь несколько версий.Если вы не укажете конкретный номер версии, клиент по умолчанию будет использовать , последний . Например, вы можете загрузить определенную версию ubuntu image

  $ docker pull ubuntu: 18.04  

Чтобы получить новый образ Docker, вы можете либо получить его из реестра (например, Docker Hub), либо создать свой собственный. В Docker Hub доступны десятки тысяч образов. Вы также можете искать изображения прямо из командной строки, используя поиск в докере .

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

  • Базовые образы – это образы, у которых нет родительского образа, обычно это образы с такой ОС, как ubuntu, busybox или debian.

  • Дочерние образы – это образы, которые основаны на базовых образах и добавляют дополнительные функции.

Далее идут официальные и пользовательские образы, которые могут быть как базовыми, так и дочерними.

  • Официальные образы – это образы, которые официально поддерживаются и поддерживаются людьми в Docker. Обычно это одно слово. В приведенном выше списке изображений изображения python , ubuntu , busybox и hello-world являются официальными изображениями.

  • Изображения пользователей – это изображения, созданные и опубликованные такими пользователями, как вы и я. Они основаны на базовых образах и добавляют дополнительную функциональность.Обычно они имеют формат имя-пользователя / изображения .

Наше первое изображение

Теперь, когда мы лучше понимаем изображения, пришло время создать наши собственные. Нашей целью в этом разделе будет создание образа, который помещает в песочницу простое приложение Flask. Для целей этого семинара я уже создал забавное маленькое приложение Flask, которое отображает случайный cat .gif каждый раз, когда он загружается – потому что вы знаете, кто не любит кошек? Если вы еще этого не сделали, пожалуйста, продолжайте и клонируйте репозиторий локально, например, так –

  $ git clone https: // github.com / prakhar1989 / docker-curriculum.git
$ cd docker-curriculum / flask-app  

Это должно быть клонировано на машине, на которой вы выполняете команды докеров, и , а не внутри контейнера докеров.

Теперь следующим шагом будет создание изображения с помощью этого веб-приложения. Как упоминалось выше, все пользовательские изображения основаны на базовом изображении. Поскольку наше приложение написано на Python, базовым образом, который мы собираемся использовать, будет Python 3.

Dockerfile

Dockerfile – это простой текстовый файл, содержащий список команд, которые клиент Docker вызывает при создании образа.Это простой способ автоматизировать процесс создания изображений. Самое приятное то, что команды, которые вы пишете в Dockerfile, на почти на идентичны их эквивалентным командам Linux. Это означает, что вам действительно не нужно изучать новый синтаксис для создания собственных файлов докеров.

Каталог приложения действительно содержит Dockerfile, но, поскольку мы делаем это впервые, мы создадим его с нуля. Для начала создайте новый пустой файл в нашем любимом текстовом редакторе и сохраните его в той же папке , что и приложение flask, под именем Dockerfile .

Начнем с указания нашего базового образа. Используйте для этого ключевое слово FROM

  ОТ python: 3  

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

 
РАБОЧИЙ КАТАЛОГ / usr / src / app


КОПИРОВАТЬ. .  

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

 
RUN pip install --no-cache-dir -r requirements.txt  

Следующее, что нам нужно указать, – это номер порта, который необходимо предоставить. Поскольку наше приложение flask работает на порту 5000 , мы укажем именно это.

  EXPOSE 5000  

Последний шаг – написать команду для запуска приложения, которая просто – python ./app.py . Для этого мы используем команду CMD –

  CMD ["python", "./app.py"]  

Основная цель CMD – сообщить контейнеру, какую команду он должен выполнять при запуске.Теперь наш Dockerfile готов. Вот как это выглядит –

  ОТ питона: 3


РАБОЧИЙ КАТАЛОГ / usr / src / app


КОПИРОВАТЬ. .


ЗАПУСТИТЬ pip install --no-cache-dir -r requirements.txt


EXPOSE 5000


CMD ["питон", "./app.py"]  

Теперь, когда у нас есть Dockerfile , мы можем создать наш образ. Команда docker build выполняет тяжелую работу по созданию образа Docker из файла Dockerfile .

В разделе ниже показаны результаты выполнения того же самого.Прежде чем запускать команду самостоятельно (не забывайте точку), обязательно замените мое имя пользователя на свое. Это имя пользователя должно быть тем же, которое вы создали при регистрации в Docker Hub. Если вы еще этого не сделали, пожалуйста, создайте учетную запись. Команда docker build довольно проста – она ​​принимает необязательное имя тега с -t и расположение каталога, содержащего Dockerfile .

  $ docker build -t yourusername / catnip.Отправка контекста сборки демону Docker 8,704 КБ
Шаг 1: ИЗ python: 3

Шаг 1. Скопируйте файл requirements.txt / usr / src / app /
 ---> Использование кеша
Шаг 1: ЗАПУСТИТЕ pip install --no-cache-dir -r requirements.txt
 ---> Использование кеша
Шаг 1: КОПИРОВАТЬ. / USR / SRC / приложение
 ---> 1d61f639ef9e
Снятие промежуточного контейнера 4de6ddf5528c
Шаг 2: ЭКСПОЗИРУЙТЕ 5000
 ---> Запуск в 12cfcf6d67ee
 ---> f423c2f179d1
Снятие промежуточного контейнера 12cfcf6d67ee
Шаг 3: CMD python ./app.py
 ---> Запуск в f01401a5ace9
 ---> 13e87ed1fbc2
Снятие промежуточного контейнера f01401a5ace9
Успешно построено 13e87ed1fbc2  

Если у вас нет образа python: 3 , клиент сначала извлечет образ, а затем создаст его.Следовательно, ваш результат выполнения команды будет отличаться от моего. Если все прошло удачно, ваш образ должен быть готов! Запустите docker images и посмотрите, отображается ли ваше изображение.

Последний шаг в этом разделе – запустить образ и посмотреть, действительно ли он работает (заменив мое имя пользователя на ваше).

  $ docker run -p 8888: 5000 имя пользователя / кошачья мята
 * Запуск по http://0.0.0.0:5000/ (для выхода нажмите CTRL + C)  

Команда, которую мы только что выполнили, использовала порт 5000 для сервера внутри контейнера и предоставила его извне через порт 8888.Перейдите по URL-адресу с портом 8888, где должно быть размещено ваше приложение.

Поздравляем! Вы успешно создали свой первый образ докера.

Docker на AWS

Что хорошего в приложении, которым нельзя поделиться с друзьями? Итак, в этом разделе мы увидим, как мы можем развернуть наше замечательное приложение в облаке, чтобы мы могли поделиться им с нашими друзьями! Мы собираемся использовать AWS Elastic Beanstalk, чтобы запустить наше приложение за несколько кликов. Мы также увидим, насколько легко сделать наше приложение масштабируемым и управляемым с помощью Beanstalk!

Пуш Docker

Первое, что нам нужно сделать перед развертыванием нашего приложения в AWS, – это опубликовать наш образ в реестре, к которому AWS может получить доступ.Есть много разных реестров Docker, которые вы можете использовать (вы даже можете разместить свой собственный). А пока воспользуемся Docker Hub для публикации образа.

Если вы запускаете изображение впервые, клиент попросит вас войти в систему. Предоставьте те же учетные данные, которые вы использовали для входа в Docker Hub.

  $ докер логин
Войдите в систему со своим идентификатором Docker, чтобы отправлять и получать изображения из Docker Hub. Если у вас нет Docker ID, перейдите на https://hub.docker.com, чтобы создать его.
Имя пользователя: yourusername
Пароль:
ПРЕДУПРЕЖДЕНИЕ! Ваш пароль будет храниться в незашифрованном виде в / Users / yourusername /.докер / config.json
Настройте помощник по учетным данным, чтобы удалить это предупреждение. Видеть
https://docs.docker.com/engine/reference/commandline/login/credential-store

Войти успешно  

Для публикации просто введите команду ниже, не забывая заменить имя тега изображения выше на свое. Важно иметь формат yourusername / image_name , чтобы клиент знал, где публиковать.

  $ docker push yourusername / catnip  

Как только это будет сделано, вы сможете просмотреть свой образ в Docker Hub.Например, вот веб-страница моего изображения.

Примечание. Прежде чем мы продолжим, я хотел бы прояснить одну вещь: не обязательно, , размещать ваш образ в общедоступном реестре (или любом другом реестре) для развертывания в AWS. Если вы пишете код для следующего запуска единорога стоимостью в миллион долларов, вы можете полностью пропустить этот шаг. Причина, по которой мы публикуем наши образы публично, заключается в том, что это упрощает развертывание за счет пропуска нескольких промежуточных шагов настройки.

Теперь, когда ваш образ находится в сети, любой, у кого установлен докер, может играть с вашим приложением, набрав всего одну команду.

  $ docker run -p 8888: 5000 yourusername / catnip  

Если вы раньше ломали голову над настройкой локальных сред разработки / совместного использования конфигурации приложений, вы хорошо знаете, как это круто. Вот почему Докер такой крутой!

Бобовый стебель

AWS Elastic Beanstalk (EB) – это PaaS (платформа как услуга), предлагаемая AWS.Если вы использовали Heroku, Google App Engine и т. Д., Вы почувствуете себя как дома. Как разработчик, вы просто говорите EB, как запускать ваше приложение, а он позаботится обо всем остальном, включая масштабирование, мониторинг и даже обновления. В апреле 2014 года EB добавила поддержку для запуска развертываний Docker с одним контейнером, что мы будем использовать для развертывания нашего приложения. Хотя EB имеет очень интуитивно понятный интерфейс командной строки, он требует некоторой настройки, и для простоты мы будем использовать веб-интерфейс для запуска нашего приложения.

Для продолжения вам понадобится работающая учетная запись AWS.Если вы еще этого не сделали, сделайте это сейчас – вам нужно будет ввести данные своей кредитной карты. Но не волнуйтесь, это бесплатно, и все, что мы делаем в этом уроке, также будет бесплатным! Давайте начнем.

Вот шаги:

  • Войдите в консоль AWS.
  • Щелкните “Эластичный бобовый стебель”. Он будет в разделе вычислений в левом верхнем углу. Кроме того, вы можете получить доступ к консоли Elastic Beanstalk.
  • Нажмите «Создать новое приложение» в правом верхнем углу.
  • Дайте своему приложению запоминающееся (но уникальное) имя и предоставьте (необязательно) описание
  • На экране New Environment создайте новую среду и выберите Web Server Environment .
  • Введите информацию о среде, выбрав домен. Этим URL-адресом вы поделитесь со своими друзьями, поэтому убедитесь, что его легко запомнить.
  • В разделе базовой конфигурации. Выберите Docker из предопределенной платформы .
  • Теперь нам нужно загрузить код нашего приложения. Но поскольку наше приложение упаковано в контейнер Docker, нам просто нужно сообщить EB о нашем контейнере. Откройте файл Dockerrun.aws.json , расположенный в папке flask-app , и измените Name изображения на имя вашего изображения.Не волнуйтесь, я вскоре объясню содержимое файла. Когда вы закончите, установите переключатель «Загрузить свой код», выберите этот файл и нажмите «Загрузить».
  • Теперь нажмите «Создать среду». На последнем экране, который вы увидите, будет несколько счетчиков, указывающих, что ваша среда настраивается. Обычно первая настройка занимает около 5 минут.

Пока мы ждем, давайте быстро посмотрим, что содержится в файле Dockerrun.aws.json . По сути, этот файл представляет собой специальный файл AWS, который сообщает EB о конфигурации нашего приложения и докера.

  {
  "AWSEBDockerrunVersion": "1",
  "Изображение": {
    «Имя»: «prakhar1989 / кошачья мята»,
    «Обновление»: «правда»
  },
  «Порты»: [
    {
      «КонтейнерПорт»: 5000, г.
      «HostPort»: 8000
    }
  ],
  «Ведение журнала»: «/ var / log / nginx»
}  

Файл должен быть понятным, но вы всегда можете обратиться к официальной документации для получения дополнительной информации. Мы предоставляем имя образа, который должен использовать EB, а также порт, который должен открывать контейнер.

Надеюсь, к настоящему времени наш экземпляр должен быть готов.Перейдите на страницу EB, и вы должны увидеть зеленую галочку, указывающую, что ваше приложение работает и работает.

Откройте URL-адрес в своем браузере, и вы увидите приложение во всей красе. Не стесняйтесь отправлять по электронной почте / IM / Snapchat эту ссылку своим друзьям и семье, чтобы они тоже могли насладиться несколькими гифками с кошками.

Очистка

После того, как вы закончите наслаждаться великолепием своего приложения, не забудьте завершить работу среды, чтобы не платить за дополнительные ресурсы.

Поздравляем! Вы развернули свое первое приложение Docker! Это может показаться большим количеством шагов, но с помощью инструмента командной строки для EB вы можете почти имитировать функциональность Heroku за несколько нажатий клавиш! Надеюсь, вы согласны с тем, что Docker избавляет от многих проблем, связанных с созданием и развертыванием приложений в облаке. Я бы посоветовал вам прочитать документацию AWS по одноконтейнерным средам Docker, чтобы понять, какие функции существуют.

В следующей (и последней) части руководства мы немного повысим ставки и развернем приложение, которое более точно имитирует реальный мир; приложение с постоянным уровнем внутреннего хранилища.Давайте прямо к делу!


Многоконтейнерные среды

В последнем разделе мы увидели, насколько легко и весело запускать приложения с помощью Docker. Мы начали с простого статического веб-сайта, а затем попробовали приложение Flask. И то, и другое мы могли запускать локально и в облаке с помощью всего нескольких команд. У обоих этих приложений было одно общее: они работали в одном контейнере .

Те из вас, у кого есть опыт использования сервисов в производственной среде, знают, что в наши дни с приложениями обычно не все так просто.Почти всегда задействована база данных (или любое другое постоянное хранилище). Такие системы, как Redis и Memcached, стали de rigueur большинства архитектур веб-приложений. Следовательно, в этом разделе мы собираемся потратить некоторое время на изучение того, как Dockerize приложения, которые зависят от запуска различных сервисов.

В частности, мы увидим, как мы можем запускать и управлять многоконтейнерными средами докеров . Вы спросите, почему именно мультиконтейнер? Что ж, одним из ключевых моментов Docker является то, как он обеспечивает изоляцию.Идея объединения процесса с его зависимостями в песочнице (называемой контейнерами) делает это таким мощным.

Подобно тому, как это хорошая стратегия для разделения уровней приложений, разумно хранить контейнеры для каждой из служб отдельно. У каждого уровня, вероятно, будут разные потребности в ресурсах, и эти потребности могут расти с разной скоростью. Разделив уровни на разные контейнеры, мы можем составить каждый уровень, используя наиболее подходящий тип экземпляра на основе различных потребностей в ресурсах.Это также очень хорошо сочетается со всем движением микросервисов, что является одной из основных причин, почему Docker (или любая другая контейнерная технология) находится на переднем крае современных архитектур микросервисов.

SF Food Trucks

Приложение, которое мы собираемся Dockerize, называется SF Food Trucks. Моя цель при создании этого приложения состояла в том, чтобы иметь что-то полезное (в том смысле, что оно напоминает реальное приложение), полагающееся хотя бы на одну службу, но не слишком сложное для целей этого руководства.Это то, что я придумал.

Серверная часть приложения написана на Python (Flask) и для поиска использует Elasticsearch. Как и все остальное в этом руководстве, весь исходный код доступен на Github. Мы будем использовать это приложение в качестве кандидата, чтобы узнать, как создавать, запускать и развертывать многоконтейнерную среду.

Сначала давайте клонируем репозиторий локально.

  $ git clone https://github.com/prakhar1989/FoodTrucks
$ cd FoodTrucks
$ tree -L 2
.
├── Dockerfile
├── README.мкр
├── aws-compose.yml
├── docker-compose.yml
├── flask-app
│ ├── app.py
│ ├── package-lock.json
│ ├── package.json
│ ├── requirements.txt
│ ├── статический
│ ├── шаблоны
│ └── webpack.config.js
├── setup-aws-ecs.sh
├── setup-docker.sh
├── shot.png
└── утилиты
    ├── generate_geojson.py
    └── trucks.geojson  

Папка flask-app содержит приложение Python, а папка utils содержит некоторые утилиты для загрузки данных в Elasticsearch.Каталог также содержит некоторые файлы YAML и Dockerfile, каждый из которых мы рассмотрим более подробно по мере прохождения этого руководства. Если вам интересно, не стесняйтесь взглянуть на файлы.

Теперь, когда вы взволнованы (надеюсь), давайте подумаем, как мы можем докеризовать приложение. Мы видим, что приложение состоит из внутреннего сервера Flask и службы Elasticsearch. Естественным способом разделения этого приложения было бы наличие двух контейнеров: в одном выполняется процесс Flask, а в другом – процесс Elasticsearch (ES).Таким образом, если наше приложение станет популярным, мы сможем масштабировать его, добавляя больше контейнеров в зависимости от того, где находится узкое место.

Отлично, нам нужно два контейнера. Это не должно быть сложно, правда? Мы уже создали собственный контейнер Flask в предыдущем разделе. Что касается Elasticsearch, давайте посмотрим, сможем ли мы что-нибудь найти на хабе.

  $ поиск докеров elasticsearch
НАЗВАНИЕ ОПИСАНИЕ ЗВЕЗДЫ ОФИЦИАЛЬНЫЙ АВТОМАТ
elasticsearch Elasticsearch - это мощный инструмент с открытым исходным кодом... 697 [ОК]
itzg / elasticsearch Предоставляет легко настраиваемый Elasticsea ... 17 [OK]
tutum / elasticsearch Образ Elasticsearch - прослушивает порт 9200. 15 [OK]
barnybug / elasticsearch Последняя версия Elasticsearch 1.7.2 и предыдущая версия ... 15 [OK]
digitalwonderland / elasticsearch Последняя версия Elasticsearch с Marvel и Kibana 12 [OK]
monsantoco / elasticsearch Образ Docker для ElasticSearch 9 [OK]  

Неудивительно, что существует официально поддерживаемый образ для Elasticsearch.Чтобы запустить ES, мы можем просто использовать docker run и мгновенно запустить локально одноузловой контейнер ES.

Примечание. Elastic, компания, стоящая за Elasticsearch, ведет собственный реестр продуктов Elastic. Рекомендуется использовать образы из этого реестра, если вы планируете использовать Elasticsearch.

Давайте сначала потянем изображение

  $ docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2  

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

  $ docker run -d --name es -p 9200: 9200 -p 9300: 9300 -e "discovery.type = single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2
277451c15ec183dd939e80298ea4bcf55050328a39b04124b387d668e3ed3943  

Примечание. Если в вашем контейнере возникают проблемы с памятью, вам может потребоваться настроить некоторые флаги JVM, чтобы ограничить потребление памяти.

Как видно выше, мы используем --name es , чтобы дать нашему контейнеру имя, которое упрощает использование в последующих командах.После запуска контейнера мы можем просмотреть журналы, запустив журналы контейнера докеров с именем (или идентификатором) контейнера для проверки журналов. Если Elasticsearch успешно запустился, вы должны увидеть журналы, подобные приведенным ниже.

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

  $ док-контейнер ls
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
277451c15ec1 докер.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 2 минуты назад вверх на 2 минуты 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es

$ docker контейнерные журналы es
[2018-07-29T05: 49: 09,304] [INFO] [o.e.n.Node] [] инициализация ...
[2018-07-29T05: 49: 09,385] [INFO] [oeeNodeEnvironment] [L1VMyzt] с использованием [1] путей к данным, монтирования [[/ (overlay)]], net usable_space [54,1 ГБ], net total_space [62,7 ГБ ], типы [оверлей]
[2018-07-29T05: 49: 09,385] [ИНФОРМАЦИЯ] [o.e.e.NodeEnvironment] [L1VMyzt] размер кучи [990,7 МБ], сжатые указатели обычных объектов [true]
[2018-07-29T05: 49: 11,979] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-security]
[2018-07-29T05: 49: 11,980] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-sql]
[2018-07-29T05: 49: 11,980] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-upgrade]
[2018-07-29T05: 49: 11,980] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный модуль [x-pack-watcher]
[2018-07-29T05: 49: 11,981] [ИНФОРМАЦИЯ] [o.e.p.PluginsService] [L1VMyzt] загруженный плагин [ingest-geoip]
[2018-07-29T05: 49: 11,981] [INFO] [o.e.p.PluginsService] [L1VMyzt] загруженный плагин [ingest-user-agent]
[2018-07-29T05: 49: 17,659] [INFO] [o.e.d.DiscoveryModule] [L1VMyzt] с использованием типа обнаружения [одноузловой]
[2018-07-29T05: 49: 18,962] [INFO] [o.e.n.Node] [L1VMyzt] инициализирован
[2018-07-29T05: 49: 18,963] [INFO] [o.e.n.Node] [L1VMyzt] запускается ...
[2018-07-29T05: 49: 19,218] [INFO] [o.e.t.TransportService] [L1VMyzt] publish_address {172.17.0.2: 9300}, bound_addresses {0.0.0.0:9300}
[2018-07-29T05: 49: 19,302] [ИНФОРМАЦИЯ] [o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [L1VMyzt] publish_address {172.17.0.2:9200}, bound_addresses {0.0.0.0:9200}
[2018-07-29T05: 49: 19,303] [INFO] [o.e.n.Node] [L1VMyzt] началось
[2018-07-29T05: 49: 19,439] [WARN] [o.e.x.s.a.s.m.NativeRoleMappingStore] [L1VMyzt] Не удалось очистить кеш для миров [[]]
[2018-07-29T05: 49: 19,542] [INFO] [например, GatewayService] [L1VMyzt] восстановил [0] индексов в cluster_state  

Теперь попробуем проверить, можно ли отправить запрос в контейнер Elasticsearch.Мы используем порт 9200 для отправки запроса cURL в контейнер.

  $ curl 0.0.0.0:9200
{
  "name": "ijJDAOm",
  "cluster_name": "docker-cluster",
  "cluster_uuid": "a_nSV3XmTCqpzYYzb-LhNw",
  "версия": {
    "number": "6.3.2",
    "build_flavor": "по умолчанию",
    "build_type": "tar",
    "build_hash": "053779d",
    "build_date": "2018-07-20T05: 20: 23.451332Z",
    "build_snapshot": ложь,
    "lucene_version": "7.3.1",
    "minimum_wire_compatibility_version": "5.6.0 ",
    "minimum_index_compatibility_version": "5.0.0"
  },
  "слоган": "Знаешь, для поиска"
}  

Sweet! Выглядит хорошо! Пока мы на этом, давайте также запустим наш контейнер Flask. Но прежде чем мы дойдем до этого, нам понадобится Dockerfile . В последнем разделе мы использовали образ python: 3 в качестве нашего базового образа. Однако на этот раз, помимо установки зависимостей Python через pip , мы хотим, чтобы наше приложение также генерировало наш миниатюрный файл Javascript для производства.Для этого нам потребуется Nodejs. Поскольку нам нужен пользовательский шаг сборки, мы начнем с базового образа ubuntu , чтобы собрать наш Dockerfile с нуля.

Примечание: если вы обнаружите, что существующий образ не соответствует вашим потребностям, не стесняйтесь начать с другого базового образа и настроить его самостоятельно. Для большинства образов в Docker Hub вы сможете найти соответствующий Dockerfile на Github. Чтение существующих файлов Docker – один из лучших способов научиться создавать собственные.

Наш Dockerfile для приложения flask выглядит так, как показано ниже –

 
ОТ ubuntu: 18.04

ТЕХНИЧЕСКИЙ ОБСЛУЖИВАНИЕ Пракхар Шривастав 


ЗАПУСТИТЬ apt-get -yqq update
ЗАПУСТИТЬ apt-get -yqq установить python3-pip python3-dev curl gnupg
ВЫПОЛНИТЬ curl -sL https://deb.nodesource.com/setup_10.x | трепать
ЗАПУСТИТЬ apt-get install -yq nodejs


ДОБАВИТЬ приложение flask-app / opt / flask-app
WORKDIR / opt / flask-app


ЗАПУСТИТЬ npm install
ЗАПУСТИТЬ npm запустить сборку
ЗАПУСТИТЬ pip3 install -r requirements.txt


EXPOSE 5000


CMD ["python3", "./app.py "]  

Здесь довольно много нового, так что давайте быстро пройдемся по этому файлу. Мы начинаем с базового образа Ubuntu LTS и используем диспетчер пакетов apt-get для установки зависимостей, а именно Python и Node. Флаг yqq используется для подавления вывода и предполагает «Да» на все запросы.

Затем мы используем команду ADD , чтобы скопировать наше приложение в новый том в контейнере – / opt / flask-app . Здесь будет находиться наш код.Мы также устанавливаем это как наш рабочий каталог, так что следующие команды будут выполняться в контексте этого местоположения. Теперь, когда наши общесистемные зависимости установлены, мы приступаем к установке зависимостей для конкретных приложений. Прежде всего, мы приступаем к работе с Node, устанавливая пакеты из npm и выполняя команду сборки, как определено в нашем файле package.json . Мы завершаем работу над файлом, устанавливая пакеты Python, открывая порт и определяя CMD для запуска, как мы это делали в предыдущем разделе.

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

  $ docker build -t prakhar1989 / foodtrucks-web.  

При первом запуске это займет некоторое время, так как клиент Docker загрузит образ ubuntu, выполнит все команды и подготовит ваш образ. Повторный запуск docker build после любых последующих изменений, внесенных в код приложения, будет практически мгновенным.Теперь попробуем запустить наше приложение.

  $ docker run -P --rm prakhar1989 / foodtrucks-web
Невозможно подключиться к ES. Повтор через 5 секунд ...
Невозможно подключиться к ES. Повтор через 5 секунд ...
Невозможно подключиться к ES. Повтор через 5 секунд ...
Нет повторов. Спасение ...  

Ой! Наше приложение flask не могло работать, так как оно не могло подключиться к Elasticsearch. Как мы сообщаем одному контейнеру о другом контейнере и заставляем их разговаривать друг с другом? Ответ кроется в следующем разделе.

Сеть Докеров

Прежде чем мы поговорим о функциях, которые Docker предоставляет специально для работы с такими сценариями, давайте посмотрим, сможем ли мы найти способ обойти проблему. Надеюсь, это должно дать вам представление о конкретной функции, которую мы собираемся изучить.

Хорошо, давайте запустим docker container ls (это то же самое, что docker ps ) и посмотрим, что у нас получилось.

  $ док-контейнер ls
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
277451c15ec1 докер.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 17 минут назад вверх на 17 минут 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp es  

Итак, у нас есть один контейнер ES, работающий на порту 0.0.0.0:9200 , к которому мы можем получить прямой доступ. Если мы можем указать нашему приложению Flask подключиться к этому URL-адресу, оно должно иметь возможность подключаться и разговаривать с ES, верно? Давайте углубимся в наш код Python и посмотрим, как определяются детали подключения.

  es = Elasticsearch (host = 'es')  

Чтобы это сработало, нам нужно сообщить контейнеру Flask, что контейнер ES работает на 0.0.0.0 host (порт по умолчанию 9200 ), и это должно заставить его работать, не так ли? К сожалению, это неверно, поскольку IP 0.0.0.0 – это IP-адрес для доступа к контейнеру ES с хост-машины , то есть с моего Mac. Другой контейнер не сможет получить к нему доступ с того же IP-адреса. Хорошо, если не этот IP-адрес, то по какому IP-адресу должен быть доступен контейнер ES? Я рад, что вы задали этот вопрос.

Сейчас хорошее время, чтобы начать наше исследование сетей в Docker.Когда докер установлен, он автоматически создает три сети.

  $ сеть докеров ls
ИМЯ СЕТЕВОГО ИДЕНТИФИКАЦИИ ДРАЙВЕРА ОБЪЕМ
c2c695315b3a мост мост местный
a875bec5d6fd host host local
ead0e804a67b нет null локальный  

Мост Сеть – это сеть, в которой по умолчанию запускаются контейнеры. Это означает, что когда я запускал контейнер ES, он работал в этой сети моста.Чтобы убедиться в этом, давайте проверим сеть.

  $ docker network осмотреть мост
[
    {
        «Название»: «мост»,
        «Id»: «c2c695315b3aaf8fc30530bb3c6b8f6692cedd5cc7579663f0550dfdd21c9a26»,
        «Создано»: «2018-07-28T20: 32: 39.405687265Z»,
        «Область действия»: «местный»,
        «Водитель»: «мост»,
        «EnableIPv6»: ложь,
        "IPAM": {
            "Драйвер": "по умолчанию",
            «Параметры»: ноль,
            "Конфиг": [
                {
                    «Подсеть»: «172.17.0.0 / 16 ",
                    «Шлюз»: «172.17.0.1»
                }
            ]
        },
        «Внутренний»: ложь,
        "Присоединяемый": ложь,
        "Ingress": ложь,
        "ConfigFrom": {
            "Сеть": ""
        },
        "ConfigOnly": ложь,
        "Контейнеры": {
            "277451c15ec183dd939e80298ea4bcf55050328a39b04124b387d668e3ed3943": {
                «Имя»: «es»,
                "EndpointID": "5c417a2fc6b13d8ec97b76bbd54aaf3ee2d48f328c3f7279ee335174fbb4d6bb",
                "MacAddress": "02: 42: ac: 11: 00: 02",
                «IPv4Address»: «172.17.0.2 / 16 ",
                "IPv6Address": ""
            }
        },
        "Параметры": {
            "com.docker.network.bridge.default_bridge": "истина",
            "com.docker.network.bridge.enable_icc": "правда",
            "com.docker.network.bridge.enable_ip_masquerade": "правда",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Ярлыки": {}
    }
]  

Вы можете видеть, что наш контейнер 277451c15ec1 указан в разделе Контейнеры выходных данных.Мы также видим IP-адрес, выделенный этому контейнеру – 172.17.0.2 . Это тот IP-адрес, который мы ищем? Давайте узнаем, запустив наш контейнер фляги и попробовав получить доступ к этому IP.

  $ docker run -it --rm prakhar1989 / foodtrucks-web bash
корень @ 35180ccc206a: / opt / flask-app
{
  "name": "Джейн Фостер",
  "имя_кластера": "elasticsearch",
  "версия": {
    "number": "2.1.1",
    "build_hash": "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
    "build_timestamp": "2015-12-15T13: 05: 55Z",
    "build_snapshot": ложь,
    "lucene_version": "5.3,1 дюйма
  },
  "слоган": "Знаешь, для поиска"
}
корень @ 35180ccc206a: / opt / flask-app  

Теперь это должно быть для вас довольно просто. Запускаем контейнер в интерактивном режиме с процессом bash . --rm – удобный флаг для запуска одноразовых команд, поскольку контейнер очищается, когда его работа завершена. Мы пробуем curl , но сначала нам нужно его установить. Как только мы это сделаем, мы увидим, что действительно можем поговорить с ES по телефону 172.17.0.2: 9200 . Потрясающие!

Хотя мы придумали способ заставить контейнеры взаимодействовать друг с другом, у этого подхода все еще есть две проблемы –

  1. Как мы сообщаем контейнеру Flask, что es hostname означает 172.17.0.2 или какой-то другой IP-адрес, поскольку IP-адрес может измениться?

  2. Поскольку bridge сеть используется всеми контейнерами по умолчанию, этот метод небезопасен . Как изолировать нашу сеть?

Хорошая новость в том, что у Docker есть отличный ответ на наши вопросы.Это позволяет нам определять наши собственные сети, сохраняя их изолированными с помощью команды docker network .

Давайте сначала создадим нашу собственную сеть.

  $ docker network создать foodtrucks-net
0815b2a3bb7a6608e850d05553cc0bda98187c4528d94621438f31d97a6fea3c

$ docker network ls
ИМЯ СЕТЕВОГО ИДЕНТИФИКАЦИИ ДРАЙВЕРА ОБЪЕМ
c2c695315b3a мост мост местный
0815b2a3bb7a фудтраки-сеть мост местный
a875bec5d6fd host host local
ead0e804a67b нет null локальный  

Команда network create создает новую сеть bridge , что нам и нужно в данный момент.С точки зрения Docker, мостовая сеть использует программный мост, который позволяет контейнерам, подключенным к одной и той же мостовой сети, обмениваться данными, обеспечивая изоляцию от контейнеров, которые не подключены к этой мостовой сети. Драйвер моста Docker автоматически устанавливает правила на хост-машине, чтобы контейнеры в разных сетях моста не могли напрямую взаимодействовать друг с другом. Существуют и другие типы сетей, которые вы можете создавать, и вам рекомендуется прочитать о них в официальной документации.

Теперь, когда у нас есть сеть, мы можем запускать наши контейнеры внутри этой сети, используя флаг --net . Давайте сделаем это – но сначала, чтобы запустить новый контейнер с тем же именем, мы остановим и удалим наш контейнер ES, который работает в сети моста (по умолчанию).

  $ docker container stop es
es

$ docker container rm es
es

$ docker run -d --name es --net foodtrucks-net -p 9200: 9200 -p 9300: 9300 -e "discovery.type = single-node" docker.elastic.co / elasticsearch / elasticsearch: 6.3.2
13d6415f73c8d88bddb1f236f584b63dbaf2c3051f09863a3f1ba219edba3673

$ docker network проверить foodtrucks-net
[
    {
        «Название»: «foodtrucks-net»,
        «Id»: «0815b2a3bb7a6608e850d05553cc0bda98187c4528d94621438f31d97a6fea3c»,
        «Создано»: «2018-07-30T00: 01: 29.1500984Z»,
        «Область действия»: «местный»,
        «Водитель»: «мост»,
        «EnableIPv6»: ложь,
        "IPAM": {
            "Драйвер": "по умолчанию",
            "Параметры": {},
            "Конфиг": [
                {
                    «Подсеть»: «172.18.0.0 / 16 ",
                    «Шлюз»: «172.18.0.1»
                }
            ]
        },
        «Внутренний»: ложь,
        "Присоединяемый": ложь,
        "Ingress": ложь,
        "ConfigFrom": {
            "Сеть": ""
        },
        "ConfigOnly": ложь,
        "Контейнеры": {
            "13d6415f73c8d88bddb1f236f584b63dbaf2c3051f09863a3f1ba219edba3673": {
                «Имя»: «es»,
                "EndpointID": "29ba2d33f9713e57eb6b38db41d656e4ee2c53e4a2f7cf636bdca0ec59cd3aa7",
                "MacAddress": "02: 42: ac: 12: 00: 02",
                «IPv4Address»: «172.18.0.2 / 16 ",
                "IPv6Address": ""
            }
        },
        "Параметры": {},
        "Ярлыки": {}
    }
]  

Как видите, наш контейнер es теперь работает внутри мостовой сети foodtrucks-net . Теперь давайте посмотрим, что происходит, когда мы запускаем в нашей сети foodtrucks-net .

  $ docker run -it --rm --net foodtrucks-net prakhar1989 / foodtrucks-web bash
корень @ 9d2722cf282c: / opt / flask-app
{
  "name": "wWALl9M",
  "cluster_name": "docker-cluster",
  "cluster_uuid": "BA36XuOiRPaghPNBLBHleQ",
  "версия": {
    «число»: «6.3,2 ",
    "build_flavor": "по умолчанию",
    "build_type": "tar",
    "build_hash": "053779d",
    "build_date": "2018-07-20T05: 20: 23.451332Z",
    "build_snapshot": ложь,
    "lucene_version": "7.3.1",
    "minimum_wire_compatibility_version": "5.6.0",
    "minimum_index_compatibility_version": "5.0.0"
  },
  "слоган": "Знаешь, для поиска"
}
корень @ 53af252b771a: / opt / flask-app
app.py node_modules package.json requirements.txt статические шаблоны webpack.config.js
корень @ 53af252b771a: / opt / flask-app
Индекс не найден...
Загрузка данных в elasticsearch ...
Всего загружено грузовиков: 733
 * Запуск на http://0.0.0.0:5000/ (нажмите CTRL + C, чтобы выйти)
корень @ 53af252b771a: / opt / flask-app  

Wohoo! Это работает! В пользовательских сетях, таких как foodtrucks-net, контейнеры могут связываться не только по IP-адресу, но также могут преобразовывать имя контейнера в IP-адрес. Эта возможность называется автоматическим обнаружением службы . Большой! Запустим наш контейнер Flask по-настоящему сейчас –

  $ docker run -d --net foodtrucks-net -p 5000: 5000 --name foodtrucks-web prakhar1989 / foodtrucks-web
852fc74de2954bb72471b858dce64d764181dca0cf7693fed201d76da33df794

$ docker container ls
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
852fc74de295 prakhar1989 / foodtrucks-web "python3./app.py "Около минуты назад Вверх Около минуты 0.0.0.0:5000->5000/tcp foodtrucks-web
13d6415f73c8 docker.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 17 минут назад Вверх 17 минут 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300 / tcp es

$ curl -I 0.0.0.0:5000
HTTP / 1.0 200 ОК
Тип содержимого: текст / html; charset = utf-8
Длина содержимого: 3697
Сервер: Werkzeug / 0.11.2 Python / 2.7.6
Дата: вс, 10 января 2016 г., 23:58:53 GMT  

Перейдите по адресу http: // 0.0.0.0: 5000 и посмотрите свое великолепное приложение вживую! Хотя это могло показаться большим трудом, на самом деле мы просто набрали 4 команды, чтобы перейти от нуля к работе. Я собрал команды в сценарии bash.

  #! / Bin / bash


сборка докеров -t prakhar1989 / foodtrucks-web.


сеть докеров создать foodtrucks-net


docker run -d --name es --net foodtrucks-net -p 9200: 9200 -p 9300: 9300 -e "discovery.type = single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2


docker run -d --net foodtrucks-net -p 5000: 5000 --name foodtrucks-web prakhar1989 / foodtrucks-web  

Теперь представьте, что вы распространяете свое приложение другу или работаете на сервере с установленным докером.Вы можете запустить все приложение с помощью одной команды!

  $ git clone https://github.com/prakhar1989/FoodTrucks
$ cd FoodTrucks
$ ./setup-docker.sh  

И все! Если вы спросите меня, я считаю, что это очень крутой и мощный способ совместного использования и запуска ваших приложений!

Docker Compose

До сих пор мы тратили все свое время на изучение клиента Docker. Однако в экосистеме Docker есть множество других инструментов с открытым исходным кодом, которые очень хорошо работают с Docker.Некоторые из них –

  1. Docker Machine – Создание хостов Docker на вашем компьютере, у облачных провайдеров и внутри вашего собственного центра обработки данных
  2. Docker Compose – инструмент для определения и запуска многоконтейнерных приложений Docker.
  3. Docker Swarm – собственное решение кластеризации для Docker
  4. Kubernetes – Kubernetes – это система с открытым исходным кодом для автоматизации развертывания, масштабирования и управления контейнерными приложениями.

В этом разделе мы рассмотрим один из этих инструментов, Docker Compose, и посмотрим, как он может упростить работу с многоконтейнерными приложениями.

История создания Docker Compose довольно интересна. Примерно в январе 2014 года компания OrchardUp запустила инструмент под названием Fig. Идея Fig заключалась в том, чтобы заставить изолированные среды разработки работать с Docker. Проект был очень хорошо принят Hacker News – я, как ни странно, помню, как читал об этом, но не совсем понял.

Первый комментарий на форуме действительно хорошо объясняет, что такое Fig.

Итак, на данный момент Docker и занимается именно запуском процессов.Теперь Docker предлагает довольно богатый API для запуска процессов: общие тома (каталоги) между контейнерами (т. Е. Запущенные образы), порт пересылки от хоста к контейнеру, отображение журналов и т. Д. Но это все: Docker на данный момент остается на уровне процесса.

Хотя он предоставляет возможности для оркестровки нескольких контейнеров для создания одного «приложения», он не рассматривает управление такой группой контейнеров как единым целым. И здесь на помощь приходят такие инструменты, как Fig: речь идет о группе контейнеров как о едином объекте.Подумайте «запустить приложение» (т.е. «запустить оркестрованный кластер контейнеров») вместо «запустить контейнер».

Оказывается, многие люди, использующие докер, согласны с этим мнением. Медленно и неуклонно по мере того, как Fig стал популярным, Docker Inc. обратила на это внимание, приобрела компанию и переименовала Fig в Docker Compose.

Итак, для чего используется Compose ? Compose – это инструмент, который используется для простого определения и запуска многоконтейнерных приложений Docker. Он предоставляет файл конфигурации под названием docker-compose.yml , который можно использовать для вызова приложения и набора служб, от которых оно зависит, с помощью всего одной команды. Compose работает во всех средах: производственная, промежуточная, разработка, тестирование, а также рабочие процессы CI, хотя Compose идеально подходит для сред разработки и тестирования.

Давайте посмотрим, сможем ли мы создать файл docker-compose.yml для нашего приложения SF-Foodtrucks и оценить, оправдывает ли Docker Compose свое обещание.

Однако первым шагом является установка Docker Compose.Если вы используете Windows или Mac, Docker Compose уже установлен, поскольку он входит в панель инструментов Docker. Пользователи Linux могут легко получить доступ к Docker Compose, следуя инструкциям в документации. Поскольку Compose написан на Python, вы также можете просто выполнить pip install docker-compose . Проверьте свою установку с помощью –

  $ docker-compose --version
docker-compose версия 1.21.2, сборка a133471  

Теперь, когда он установлен, мы можем перейти к следующему шагу i.е. файл Docker Compose docker-compose.yml . Синтаксис YAML довольно прост, и репозиторий уже содержит файл docker-compose, который мы будем использовать.

  версия: "3"
Сервисы:
  es:
    изображение: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    имя_контейнера: es
    среда:
      - discovery.type = одноузловой
    порты:
      - 9200: 9200
    объемы:
      - esdata1: / usr / share / elasticsearch / data
  Интернет:
    изображение: prakhar1989 / foodtrucks-web
    команда: приложение python3.ру
    зависит от:
      - es
    порты:
      - 5000: 5000
    объемы:
      - ./flask-app:/opt/flask-app
объемы:
  esdata1:
    водитель: местный  

Позвольте мне объяснить, что означает файл выше. На родительском уровне мы определяем названия наших сервисов – es и web . Параметр image требуется всегда, и для каждой службы, которую мы хотим, чтобы Docker запускал, мы можем добавить дополнительные параметры. Для es мы просто ссылаемся на образ elasticsearch , доступный в реестре Elastic.Для нашего приложения Flask мы ссылаемся на изображение, которое мы создали в начале этого раздела.

Другие параметры, такие как команда и порты , предоставляют дополнительную информацию о контейнере. Параметр volume указывает точку монтирования в нашем контейнере web , где будет находиться код. Это совершенно необязательно и полезно, если вам нужен доступ к журналам и т. Д. Позже мы увидим, как это может быть полезно во время разработки. Обратитесь к онлайн-ссылке, чтобы узнать больше о параметрах, которые поддерживает этот файл.Мы также добавляем тома для контейнера es , чтобы данные, которые мы загружаем, сохранялись между перезапусками. Мы также указываем depends_on , который сообщает докеру, что нужно запустить контейнер es до web . Вы можете узнать больше об этом в docker compose docs.

Примечание. Вы должны находиться внутри каталога с файлом docker-compose.yml , чтобы выполнять большинство команд Compose.

Отлично! Теперь файл готов, давайте посмотрим, как работает docker-compose .Но прежде чем мы начнем, нам нужно убедиться, что порты и имена свободны. Так что, если у вас запущены контейнеры Flask и ES, давайте отключим их.

  $ docker stop es foodtrucks-web
es
foodtrucks-сеть

$ docker rm es foodtrucks-сеть
es
foodtrucks-web  

Теперь мы можем запустить docker-compose . Перейдите в каталог фургонов с едой и запустите docker-compose up .

  $ docker-compose up
Создание сети foodtrucks_default с драйвером по умолчанию
Создание foodtrucks_es_1
Создание foodtrucks_web_1
Присоединение к foodtrucks_es_1, foodtrucks_web_1
es_1 | [2016-01-11 03: 43: 50,300] [ИНФОРМАЦИЯ] [узел] [Комета] версия [2.1.1], pid [1], build [40e2c53 / 2015-12-15T13: 05: 55Z]
es_1 | [2016-01-11 03: 43: 50,307] [INFO] [узел] [Comet] инициализация ...
es_1 | [2016-01-11 03: 43: 50,366] [INFO] [плагины] [Comet] загружены [], сайты []
es_1 | [2016-01-11 03: 43: 50,421] [INFO] [env] [Comet] с использованием [1] путей к данным, монтирует [[/ usr / share / elasticsearch / data (/ dev / sda1)]], net usable_space [16gb], net total_space [18,1gb], спины? [возможно], типы [ext4]
es_1 | [2016-01-11 03: 43: 52,626] [INFO] [узел] [Comet] инициализирован
es_1 | [2016-01-11 03: 43: 52,632] [ИНФОРМАЦИЯ] [узел] [Комета] запускается...
es_1 | [2016-01-11 03: 43: 52,703] [WARN] [common.network] [Comet] опубликовать адрес: {0.0.0.0} - это групповой адрес, возвращающийся к первому без петлевого тестирования: {172.17.0.2}
es_1 | [2016-01-11 03: 43: 52,704] [INFO] [транспорт] [Comet] publish_address {172.17.0.2:9300}, bound_addresses {[::]: 9300}
es_1 | [2016-01-11 03: 43: 52,721] [ИНФОРМАЦИЯ] [открытие] [Комета] elasticsearch / cEk4s7pdQ-evRc9MqS2wqw
es_1 | [2016-01-11 03: 43: 55,785] [ИНФОРМАЦИЯ] [cluster.service] [Comet] new_master {Comet} {cEk4s7pdQ-evRc9MqS2wqw} {172.17.0.2} {172.17.0.2:9300}, причина: zen-disco-join (selected_as_master, [0] присоединений получено)
es_1 | [2016-01-11 03: 43: 55,818] [WARN] [common.network] [Comet] адрес публикации: {0.0.0.0} - это групповой адрес, возвращающийся к первому без петлевого тестирования: {172.17.0.2}
es_1 | [2016-01-11 03: 43: 55,819] [INFO] [http] [Comet] publish_address {172.17.0.2:9200}, bound_addresses {[::]: 9200}
es_1 | [2016-01-11 03: 43: 55,819] [INFO] [узел] [Comet] запущен
es_1 | [2016-01-11 03: 43: 55,826] [INFO] [gateway] [Comet] восстановили [0] индексов в cluster_state
es_1 | [2016-01-11 03: 44: 01,825] [ИНФОРМАЦИЯ] [кластер.метаданные] [Комета] [sfdata] создание индекса, причина [auto (index api)], шаблоны [], сегменты [5] / [1], сопоставления [грузовик]
es_1 | [2016-01-11 03: 44: 02,373] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [грузовик]
es_1 | [2016-01-11 03: 44: 02,510] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [грузовик]
es_1 | [2016-01-11 03: 44: 02,593] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [truck]
es_1 | [2016-01-11 03: 44: 02,708] [ИНФОРМАЦИЯ] [cluster.metadata] [Comet] [sfdata] update_mapping [truck]
es_1 | [2016-01-11 03: 44: 03,047] [ИНФОРМАЦИЯ] [кластер.метаданные] [Комета] [sfdata] update_mapping [грузовик]
web_1 | * Запуск по http://0.0.0.0:5000/ (для выхода нажмите CTRL + C)  

Перейдите на IP-адрес, чтобы увидеть свое приложение вживую. Это было потрясающе, не правда ли? Всего несколько строк конфигурации, и у нас есть два контейнера Docker, успешно работающих в унисон. Остановим службы и перезапустим их в автономном режиме.

  web_1 | * Запуск на http://0.0.0.0:5000/ (нажмите CTRL + C, чтобы выйти)
Убиваем foodtrucks_web_1 ... готово
Убийство foodtrucks_es_1... сделано

$ docker-compose up -d
Создание es ... готово
Создание foodtrucks_web_1 ... готово

$ docker-compose ps
      Имя команды Состояние портов
-------------------------------------------------- ------------------------------------------
es / usr / local / bin / docker-entr ... До 0.0.0.0:9200->9200/tcp, 9300 / tcp
foodtrucks_web_1 python3 app.py Up 0.0.0.0:5000->5000/tcp  

Неудивительно, что оба контейнера работают успешно.Откуда взялись имена? Они были созданы Compose автоматически. Но разве Compose также создает сеть автоматически? Хороший вопрос! Давайте разберемся.

Прежде всего, остановим работу служб. Мы всегда можем вернуть их обратно с помощью одной команды. Тома данных сохранятся, поэтому можно снова запустить кластер с теми же данными с помощью docker-compose up. Чтобы уничтожить кластер и тома данных, просто введите docker-compose down -v .

  $ docker-compose down -v
Остановка foodtrucks_web_1 ... выполнено
Остановка es ... сделано
Удаление foodtrucks_web_1 ... выполнено
Удаление es ... сделано
Удаление сети foodtrucks_default
Снятие объема foodtrucks_esdata1  

Пока мы это делаем, мы также удалим сеть foodtrucks , которую мы создали в прошлый раз.

  $ докер сеть rm foodtrucks-net
$ docker network ls
ИМЯ СЕТЕВОГО ИДЕНТИФИКАЦИИ ДРАЙВЕРА ОБЪЕМ
c2c695315b3a мост мост местный
a875bec5d6fd host host local
ead0e804a67b нет null локальный  

Отлично! Теперь, когда у нас есть чистый лист, давайте повторно запустим наши службы и посмотрим, сотворит ли Compose свое волшебство.

  $ docker-compose up -d
Воссоздание foodtrucks_es_1
Воссоздание foodtrucks_web_1

$ docker container ls
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
f50bb33a3242 prakhar1989 / foodtrucks-web "python3 app.py" 14 секунд назад Вверх на 13 секунд 0.0.0.0:5000->5000/tcp foodtrucks_web_1
e299ceeb4caa elasticsearch "/docker-entrypoint.s" 14 секунд назад Up 14 секунд 9200 / tcp, 9300 / tcp foodtrucks_es_1  

Пока все хорошо.Пора посмотреть, были ли созданы какие-нибудь сети.

  $ сеть докеров ls
ИМЯ СЕТЕВОГО ИДЕНТИФИКАЦИИ ДРАЙВЕР
c2c695315b3a мост мост местный
f3b80f381ed3 foodtrucks_default мост местный
a875bec5d6fd host host local
ead0e804a67b нет null локальный  

Вы можете видеть, что compose пошел дальше и создал новую сеть с именем foodtrucks_default и подключил обе новые службы в этой сети, так что каждая из них может быть обнаружена другой.Каждый контейнер для службы присоединяется к сети по умолчанию и одновременно доступен другим контейнерам в этой сети и может быть обнаружен ими по имени хоста, совпадающему с именем контейнера.

  $ докер пс
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
8c6bb7e818ec docker.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" Около минуты назад вверх Около минуты 0.0.0.0: 9200-> 9200 / tcp, 9300 / tcp es
7640cec7feb7 prakhar1989 / foodtrucks-web "python3 app.py" Около минуты назад Вверх Около минуты 0.0.0.0:5000->5000/tcp foodtrucks_web_1

$ docker network проверить foodtrucks_default
[
    {
        "Name": "foodtrucks_default",
        «Id»: «f3b80f381ed3e03b3d5e605e42c4a576e32d38ba24399e963d7dad848b3b4fe7»,
        «Создано»: «2018-07-30T03: 36: 06.0384826Z»,
        «Область действия»: «местный»,
        «Водитель»: «мост»,
        «EnableIPv6»: ложь,
        "IPAM": {
            "Драйвер": "по умолчанию",
            «Параметры»: ноль,
            "Конфиг": [
                {
                    «Подсеть»: «172.19.0.0 / 16 ",
                    «Шлюз»: «172.19.0.1»
                }
            ]
        },
        «Внутренний»: ложь,
        "Присоединяемый": правда,
        "Ingress": ложь,
        "ConfigFrom": {
            "Сеть": ""
        },
        "ConfigOnly": ложь,
        "Контейнеры": {
            "7640cec7feb7f5615eaac376271a93fb8bab2ce54c7257256bf16716e05c65a5": {
                "Имя": "foodtrucks_web_1",
                "EndpointID": "b1aa3e735402abafea3edfbba605eb4617f81d94f1b5f8fcc566a874660a0266",
                "MacAddress": "02: 42: ac: 13: 00: 02",
                «IPv4Address»: «172.19.0.2 / 16 ",
                "IPv6Address": ""
            },
            "8c6bb7e818ec1f88c37f375c18f00beb030b31f4b10aee5a0952aad753314b57": {
                «Имя»: «es»,
                "EndpointID": "649b3567d38e5e6f03fa6c004a4302508c14a5f2ac086ee6dcf13ddef936de7b",
                "MacAddress": "02: 42: ac: 13: 00: 03",
                «IPv4Address»: «172.19.0.3/16»,
                "IPv6Address": ""
            }
        },
        "Параметры": {},
        "Ярлыки": {
            "com.docker.compose.сеть ":" по умолчанию ",
            "com.docker.compose.project": "foodtrucks",
            "com.docker.compose.version": "1.21.2"
        }
    }
]  

Рабочий процесс разработки

Прежде чем мы перейдем к следующему разделу, я хотел бы рассказать еще об одной вещи, касающейся docker-compose. Как было сказано ранее, docker-compose действительно отлично подходит для разработки и тестирования. Итак, давайте посмотрим, как мы можем настроить compose, чтобы облегчить нам жизнь во время разработки.

На протяжении всего этого руководства мы работали с готовыми образами докеров.Хотя мы создавали образы с нуля, мы еще не касались кода приложений и в основном ограничились редактированием файлов Docker и конфигураций YAML. Вам, должно быть, интересно, как выглядит рабочий процесс во время разработки? Следует ли создавать образы Docker для каждого изменения, затем публиковать их, а затем запускать, чтобы проверить, работают ли изменения должным образом? Я уверен, что это звучит очень утомительно. Там должен быть лучший способ. В этом разделе мы собираемся изучить это.

Давайте посмотрим, как мы можем внести изменения в только что запущенное приложение Foodtrucks. Убедитесь, что у вас запущено приложение,

  $ док-контейнер ls
КОНТЕЙНЕР ИДЕНТИФИКАЦИЯ ИЗОБРАЖЕНИЕ КОМАНДА СОЗДАНО СОСТОЯНИЕ НАЗВАНИЯ ПОРТОВ
5450ebedd03c prakhar1989 / foodtrucks-web "python3 app.py" 9 секунд назад Вверх на 6 секунд 0.0.0.0:5000->5000/tcp foodtrucks_web_1
05d408b25dfe докер.elastic.co/elasticsearch/elasticsearch:6.3.2 "/ usr / local / bin / dock…" 10 часов назад Вверх 10 часов 0.0.0.0:9200->9200/tcp, 9300 / tcp es  

Теперь посмотрим, сможем ли мы изменить это приложение для отображения Hello world! Сообщение при запросе на маршрут / hello . В настоящее время приложение отвечает 404.

  $ curl -I 0.0.0.0:5000/hello
HTTP / 1.0 404 НЕ НАЙДЕН
Тип содержимого: текст / html
Длина содержимого: 233
Сервер: Werkzeug / 0.11.2 Python / 2.7.15rc1
Дата: Пн, 30 июля 2018 г. 15:34:38 ​​GMT  

Почему это происходит? Поскольку наше приложение является Flask, мы можем увидеть app.py (ссылка) для ответов. Во Flask маршруты определяются с помощью синтаксиса @ app.route. В файле вы увидите, что у нас определены только три маршрута – /, / debug и / search . Маршрут / отображает основное приложение, отладочный маршрут используется для возврата некоторой отладочной информации и, наконец, поиск используется приложением для запроса elasticsearch.

  $ curl 0.0.0.0:5000/debug
{
  "msg": "желтый открытый sfdata Ibkx7WYjSt-g8NZXOEtTMg 5 1 618 0 1,3 МБ 1,3 МБ \ n",
  "статус": "успех"
}  

Учитывая этот контекст, как нам добавить новый маршрут для hello ? Ты угадал! Давайте откроем flask-app / app.py в нашем любимом редакторе и внесем следующие изменения

  @ app.route ('/')
def index ():
  вернуть render_template ("index.html")


@ app.route ('/ привет')
def привет ():
  ответьте "привет, мир!"  

А теперь попробуем сделать запрос еще раз

  $ curl -I 0.0.0.0: 5000 / привет
HTTP / 1.0 404 НЕ НАЙДЕН
Тип содержимого: текст / html
Длина содержимого: 233
Сервер: Werkzeug / 0.11.2 Python / 2.7.15rc1
Дата: Пн, 30 июля 2018 г. 15:34:38 ​​GMT  

О нет! Это не сработало! Что мы сделали не так? Хотя мы внесли изменения в app.py , файл находится на нашей машине (или на хост-машине), но поскольку Docker запускает наши контейнеры на основе образа prakhar1989 / foodtrucks-web , он не знает об этом изменении. Чтобы проверить это, давайте попробуем следующее –

  $ docker-compose запустить web bash
Запуск es... сделано
корень @ 581e351c82b0: / opt / flask-app
app.py package-lock.json шаблоны requirements.txt
node_modules package.json статический webpack.config.js
корень @ 581e351c82b0: / opt / flask-app
корень @ 581e351c82b0: / opt / flask-app  

То, что мы пытаемся сделать здесь, – это проверить, что наших изменений нет в app.py , который выполняется в контейнере. Мы делаем это, выполняя команду docker-compose run , которая похожа на своего двоюродного брата docker run , но принимает дополнительные аргументы для службы (в нашем случае это web ).Как только мы запускаем bash , оболочка открывается в / opt / flask-app , как указано в нашем Dockerfile. Из команды grep мы видим, что наших изменений нет в файле.

Давайте посмотрим, как мы можем это исправить. Во-первых, нам нужно указать docker compose не использовать изображение, а вместо этого использовать файлы локально. Мы также установим режим отладки на true , чтобы Flask знал, что нужно перезагрузить сервер при изменении app.py . Замените web часть файла docker-compose.yml файл так:

  версия: "3"
Сервисы:
  es:
    изображение: docker.elastic.co/elasticsearch/elasticsearch:6.3.2
    имя_контейнера: es
    среда:
      - discovery.type = одноузловой
    порты:
      - 9200: 9200
    объемы:
      - esdata1: / usr / share / elasticsearch / data
  Интернет:
    строить: .
    команда: python3 app.py
    среда:
      - DEBUG = True
    зависит от:
      - es
    порты:
      - «5000: 5000»
    объемы:
      - ./flask-app:/opt/flask-app
объемы:
  esdata1:
    водитель: местный  

С этим изменением (diff) давайте остановим и запустим контейнеры.

  $ docker-compose down -v
Остановка foodtrucks_web_1 ... выполнено
Остановка es ... сделано
Удаление foodtrucks_web_1 ... выполнено
Удаление es ... сделано
Удаление сети foodtrucks_default
Удаление тома foodtrucks_esdata1

$ docker-compose up -d
Создание сети foodtrucks_default с драйвером по умолчанию
Создание тома foodtrucks_esdata1 с локальным драйвером
Создание es ... готово
Создание foodtrucks_web_1 ... выполнено  

В качестве последнего шага внесем изменения в приложение .py , добавив новый маршрут. Теперь пробуем завить

  $ curl 0.0.0.0:5000/hello
привет мир  

Wohoo! Получаем обоснованный ответ! Попробуйте поиграться, внося больше изменений в приложение.

На этом мы завершаем обзор Docker Compose. С помощью Docker Compose вы также можете приостанавливать свои службы, запускать одноразовую команду для контейнера и даже масштабировать количество контейнеров. Я также рекомендую вам ознакомиться с несколькими другими вариантами использования Docker compose. Надеюсь, мне удалось показать вам, насколько легко управлять многоконтейнерными средами с помощью Compose.В последнем разделе мы собираемся развернуть наше приложение на AWS!

AWS Elastic Container Service

В последнем разделе мы использовали docker-compose для локального запуска нашего приложения с помощью одной команды: docker-compose up . Теперь, когда у нас есть работающее приложение, мы хотим поделиться им со всем миром, привлечь пользователей, заработать кучу денег и купить большой дом в Майами. Выполнение последних трех выходит за рамки учебного пособия, поэтому вместо этого мы потратим время на выяснение того, как мы можем развернуть наши многоконтейнерные приложения в облаке с помощью AWS.

Если вы дочитали до этого места, то практически уверены, что Docker – довольно крутая технология. И вы не одиноки. Увидев стремительный рост Docker, почти все поставщики облачных услуг начали работать над добавлением поддержки для развертывания приложений Docker на своей платформе. На сегодняшний день вы можете развертывать контейнеры на Google Cloud Platform, AWS, Azure и многих других. У нас уже есть учебник по развертыванию приложений с одним контейнером с помощью Elastic Beanstalk, и в этом разделе мы рассмотрим Elastic Container Service (или ECS) от AWS.

AWS ECS – это масштабируемая и сверхгибкая служба управления контейнерами, которая поддерживает контейнеры Docker. Он позволяет управлять кластером Docker поверх экземпляров EC2 через простой в использовании API. В то время как Beanstalk поставляется с разумными настройками по умолчанию, ECS позволяет полностью настроить среду в соответствии с вашими потребностями. На мой взгляд, это делает ECS довольно сложной задачей для начала работы.

К счастью для нас, у ECS есть удобный инструмент командной строки, который понимает файлы Docker Compose и автоматически подготавливает кластер к ECS! Поскольку у нас уже есть действующий файл docker-compose.yml , установка и запуск на AWS не потребуют больших усилий. Итак, приступим!

Первым шагом является установка интерфейса командной строки. Инструкции по установке CLI на Mac и Linux очень четко объяснены в официальных документах. Идите вперед, установите CLI, и когда вы закончите, проверьте установку, запустив

  $ ecs-cli --версия
ecs-cli версия 1.18.1 (7e9df84)  

Далее мы будем работать над настройкой интерфейса командной строки, чтобы мы могли общаться с ECS.Мы будем следовать инструкциям, подробно описанным в официальном руководстве по документации AWS ECS. В случае возникновения недоразумений, смело обращайтесь к этому руководству.

Первый шаг будет включать создание профиля, который мы будем использовать до конца урока. Чтобы продолжить, вам понадобятся ваши AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY . Чтобы получить их, выполните действия, описанные в разделе «Ключ доступа » и «Секретный ключ доступа » на этой странице.

  $ ecs-cli configure profile --profile-name ecs-foodtrucks --access-key $ AWS_ACCESS_KEY_ID --secret-key $ AWS_SECRET_ACCESS_KEY  

Затем нам нужно получить пару ключей, которую мы будем использовать для входа в экземпляры.Перейдите в консоль EC2 и создайте новую пару ключей. Загрузите пару ключей и храните ее в надежном месте. Еще одна вещь, на которую следует обратить внимание, прежде чем уходить с этого экрана, – это название региона. В моем случае я назвал свой ключ – ecs и установил свой регион как us-east-1 . Это то, что я предполагаю до конца этого пошагового руководства.

Следующим шагом является настройка интерфейса командной строки.

  $ ecs-cli configure --region us-east-1 --cluster foodtrucks
ИНФОРМАЦИЯ [0000] Сохраненная конфигурация интерфейса командной строки ECS для кластера (foodtrucks)  

Мы предоставляем команде configure имя региона, в котором должен находиться наш кластер, и имя кластера.Убедитесь, что вы предоставили то же имя региона , которое вы использовали при создании пары ключей. Если вы раньше не настраивали интерфейс командной строки AWS на своем компьютере, вы можете использовать официальное руководство, в котором все подробно объясняется, как все работает.

Следующий шаг позволяет CLI создать шаблон CloudFormation.

  $ ecs-cli up --keypair ecs --capability-iam --size 1 --instance-type t2.medium
ИНФОРМАЦИЯ [0000] Использование рекомендованного AMI Amazon Linux 2 с агентом ECS 1.39.0 и Docker версии 18.09.9-ce
ИНФОРМАЦИЯ [0000] Созданный кластер cluster = foodtrucks
ИНФОРМАЦИЯ [0001] Ожидание создания ресурсов кластера.
ИНФОРМАЦИЯ [0001] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
ИНФОРМАЦИЯ [0062] Состояние стека облачной информации stackStatus = CREATE_IN_PROGRESS
ИНФОРМАЦИЯ [0122] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
ИНФОРМАЦИЯ [0182] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
ИНФОРМАЦИЯ [0242] Статус стека облачной информации stackStatus = CREATE_IN_PROGRESS
VPC создан: vpc-0bbed8536930053a6
Создана группа безопасности: sg-0cf767fb4d01a3f99
Подсеть создана: subnet-05de1db2cb1a50ab8
Подсеть создана: subnet-01e1e8bc95d49d0fd
Кластер создан. 

Здесь мы указываем имя пары ключей, которую мы загрузили изначально ( ecs в моем случае), количество экземпляров, которые мы хотим использовать ( - размер ), и тип экземпляров, на которых мы хотим запускать контейнеры. . Флаг --capability-iam сообщает CLI, что мы подтверждаем, что эта команда может создавать ресурсы IAM.

На последнем и последнем шаге мы будем использовать наш файл docker-compose.yml . Нам нужно будет внести несколько незначительных изменений, поэтому вместо изменения оригинала давайте сделаем его копию.Содержимое этого файла (после внесения изменений) выглядит (ниже) –

  версия: '2'
Сервисы:
  es:
    изображение: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    cpu_shares: 100
    mem_limit: 3621440000
    среда:
      - discovery.type = одноузловой
      - bootstrap.memory_lock = true
      - "ES_JAVA_OPTS = -Xms512m -Xmx512m"
    протоколирование:
      драйвер: awslogs
      параметры:
        awslogs-group: фудтраки
        awslogs-region: us-east-1
        префикс-поток-awslogs: es
  Интернет:
    изображение: prakhar1989 / foodtrucks-web
    cpu_shares: 100
    mem_limit: 262144000
    порты:
      - «80: 5000»
    ссылки:
      - es
    протоколирование:
      драйвер: awslogs
      параметры:
        awslogs-group: фудтраки
        awslogs-region: us-east-1
        префикс-потока-awslogs: веб- 

Единственные изменения, которые мы внесли по сравнению с оригинальным docker-compose.yml предоставляют значения mem_limit (в байтах) и cpu_shares для каждого контейнера и добавляют некоторую конфигурацию журналирования. Это позволяет нам просматривать журналы, созданные нашими контейнерами, в AWS CloudWatch. Перейдите в CloudWatch, чтобы создать группу журналов под названием foodtrucks . Обратите внимание, что, поскольку ElasticSearch обычно занимает больше памяти, мы предоставили лимит памяти около 3,4 ГБ. Еще одна вещь, которую нам нужно сделать, прежде чем мы перейдем к следующему шагу, – это опубликовать наш образ в Docker Hub.

  $ docker push prakhar1989 / foodtrucks-web  

Отлично! Теперь давайте запустим последнюю команду, которая развернет наше приложение на ECS!

  $ cd aws-ecs
$ ecs-cli создать
ИНФОРМАЦИЯ [0000] Использование определения задачи ECS TaskDefinition = ecscompose-foodtrucks: 2
ИНФОРМАЦИЯ [0000] Запуск контейнера ... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es
ИНФОРМАЦИЯ [0000] Запуск контейнера ... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web
ИНФОРМАЦИЯ [0000] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web desireStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
ИНФОРМАЦИЯ [0000] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es desireStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
ИНФОРМАЦИЯ [0036] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es желаемыйStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
ИНФОРМАЦИЯ [0048] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web desireStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
ИНФОРМАЦИЯ [0048] Описание состояния контейнера ECS container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es желаемыйStatus = RUNNING lastStatus = PENDING taskDefinition = ecscompose-foodtrucks: 2
ИНФОРМАЦИЯ [0060] Запущенный контейнер... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web desireStatus = RUNNING lastStatus = RUNNING taskDefinition = ecscompose-foodtrucks: 2
ИНФОРМАЦИЯ [0060] Запущенный контейнер ... container = 845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es desireStatus = RUNNING lastStatus = RUNNING taskDefinition = ecscompose-foodtrucks: 2  

Это не совпадение, что приведенный выше вызов похож на тот, который мы использовали с Docker Compose . Если все прошло успешно, в последней строке вы должны увидеть желаемый статус = РАБОТАЕТ lastStatus = ВЫПОЛНЯЕТСЯ .

Отлично! Наше приложение работает, но как мы можем получить к нему доступ?

  ecs-cli пс
Имя Состояние Порты Задача Определение
845e2368-170d-44a7-bf9f-84c7fcd9ae29 / web RUNNING 54.86.14.14:80->5000/tcp ecscompose-foodtrucks: 2
845e2368-170d-44a7-bf9f-84c7fcd9ae29 / es РАБОТАЮЩИЕ ecscompose-foodtrucks: 2  

Идите вперед и откройте http://54.86.14.14 в своем браузере, и вы увидите Food Trucks во всей его черно-желтой красе! Раз уж мы затронули тему, давайте посмотрим, как выглядит наша консоль AWS ECS.

Выше мы видим, что наш кластер ECS под названием «foodtrucks» был создан и теперь выполняет 1 задачу с 2 экземплярами контейнеров. Потратьте некоторое время на просмотр этой консоли, чтобы ознакомиться со всеми опциями, которые здесь есть.

Очистка

После того, как вы поигрались с развернутым приложением, не забудьте выключить кластер –

  $ ecs-cli down --force
ИНФОРМАЦИЯ [0001] Ожидание удаления ресурсов кластера ...
ИНФОРМАЦИЯ [0001] Статус стека облачной информации stackStatus = DELETE_IN_PROGRESS
ИНФОРМАЦИЯ [0062] Статус стека облачной информации stackStatus = DELETE_IN_PROGRESS
ИНФОРМАЦИЯ [0124] Статус стека облачной информации stackStatus = DELETE_IN_PROGRESS
ИНФОРМАЦИЯ [0155] Удаленный кластер cluster = foodtrucks  

Итак, вот оно.С помощью всего нескольких команд мы смогли развернуть наше потрясающее приложение в облаке AWS!


Заключение

Вот и все! После долгого, исчерпывающего, но увлекательного урока вы теперь готовы штурмовать контейнерный мир! Если вы следовали до самого конца, то вам непременно стоит гордиться собой. Вы узнали, как настроить Docker, запустить свои собственные контейнеры, поиграть со статическими и динамическими веб-сайтами, и, что самое важное, получили практический опыт развертывания приложений в облаке!

Я надеюсь, что завершение этого урока сделает вас более уверенными в своих способностях работать с серверами.Когда у вас есть идея создать свое следующее приложение, вы можете быть уверены, что сможете донести его до людей с минимальными усилиями.

Следующие шаги

Ваше путешествие в мир контейнеров только началось! Моей целью в этом руководстве было пробудить ваш аппетит и показать вам мощь Docker. В море новых технологий может быть сложно ориентироваться в воде в одиночку, и такие учебные пособия, как этот, могут помочь вам. Это руководство по Docker, которое я хотел бы иметь, когда только начинал.Надеюсь, это послужило своей цели – заинтересовать вас контейнерами, чтобы вам больше не приходилось наблюдать за происходящим со стороны.

Ниже приведены несколько дополнительных ресурсов, которые будут полезны. Для вашего следующего проекта я настоятельно рекомендую вам использовать Docker. Помните – практика ведет к совершенству!

Дополнительные ресурсы

Давай, молодой падаван!

Оставить отзыв

Теперь, когда урок окончен, моя очередь задавать вопросы.Как вам урок? Вы нашли этот учебник полным беспорядком или вы повеселились и чему-то научились?

Отправьте свои мысли прямо мне или просто создайте проблему. Я тоже в Твиттере, так что если это ваша сделка, не стесняйтесь кричать там!

Мне очень хотелось бы услышать о вашем опыте работы с этим руководством. Дайте предложения, как это исправить, или сообщите мне о моих ошибках. Я хочу, чтобы это руководство было одним из лучших вводных руководств в Интернете, и я не смогу сделать это без вашей помощи.


Что такое Докер? | IBM

Docker – это платформа с открытым исходным кодом для создания, развертывания и управления контейнерными приложениями. Узнайте о контейнерах, их сравнении с виртуальными машинами и почему Docker так широко применяется и используется.

Что такое докер?

Docker – это платформа для контейнеризации с открытым исходным кодом. Он позволяет разработчикам упаковывать приложения в контейнеры – стандартизованные исполняемые компоненты, сочетающие исходный код приложения с библиотеками операционной системы (ОС) и зависимостями, необходимыми для запуска этого кода в любой среде.Контейнеры упрощают доставку распределенных приложений и становятся все более популярными по мере того, как организации переходят на облачную разработку и гибридные мультиоблачные среды.

Разработчики могут создавать контейнеры без Docker, но платформа упрощает, упрощает и безопаснее создание, развертывание и управление контейнерами. Docker – это, по сути, набор инструментов, который позволяет разработчикам создавать, развертывать, запускать, обновлять и останавливать контейнеры с помощью простых команд и автоматизации с помощью единого API.

Docker также относится к Docker, Inc. (ссылка находится за пределами IBM), компании, которая продает коммерческую версию Docker, и к проекту с открытым исходным кодом Docker (ссылка находится за пределами IBM), к которому Docker, Inc. и многие другие организации и люди вносят свой вклад.

Как работают контейнеры и почему они так популярны

Контейнеры стали возможными благодаря возможностям изоляции процессов и виртуализации, встроенным в ядро ​​Linux. Эти возможности, такие как группы управления , (Cgroups) для распределения ресурсов между процессами и пространства имен , для ограничения доступа процессов или видимости других ресурсов или областей системы, позволяют нескольким компонентам приложения совместно использовать ресурсы одного экземпляра. операционной системы хоста во многом так же, как гипервизор позволяет нескольким виртуальным машинам (ВМ) совместно использовать ЦП, память и другие ресурсы одного аппаратного сервера.

В результате контейнерная технология предлагает все функциональные возможности и преимущества виртуальных машин, включая изоляцию приложений, экономичную масштабируемость и возможность удаления, а также важные дополнительные преимущества:

  • Более легкий вес: В отличие от виртуальных машин, контейнеры не несут полезную нагрузку всего экземпляра ОС и гипервизора; они включают только процессы и зависимости ОС, необходимые для выполнения кода. Размеры контейнеров измеряются в мегабайтах (по сравнению с гигабайтами для некоторых виртуальных машин), они позволяют лучше использовать емкость оборудования и имеют более быстрое время запуска.
  • Повышение эффективности использования ресурсов: С контейнерами вы можете запускать на одном оборудовании в несколько раз больше копий приложения, чем при использовании виртуальных машин. Это может снизить ваши расходы на облако.
  • Повышенная продуктивность разработчиков: По сравнению с виртуальными машинами, контейнеры быстрее и проще развертывать, инициализировать и перезапускать. Это делает их идеальными для использования в конвейерах непрерывной интеграции и непрерывной доставки (CI / CD) и больше подходит для групп разработчиков, применяющих методы Agile и DevOps.

Компании, использующие контейнеры, сообщают о других преимуществах, включая повышение качества приложений, более быструю реакцию на изменения рынка и многое другое. Узнайте больше с помощью этого интерактивного инструмента:

Скачать полный отчет: Контейнеры на предприятии (PDF, 1.4MB)

Зачем нужен Докер?

Docker настолько популярен сегодня, что «Docker» и «контейнеры» используются как синонимы. Но первые технологии, связанные с контейнерами, были доступны в течение многих лет – даже десятилетий (ссылка находится за пределами IBM) – до того, как Docker был выпущен для широкой публики в 2013 году.

В частности, в 2008 году в ядре Linux были реализованы контейнеры L, inu, XC и (LXC), что позволило полностью реализовать виртуализацию для одного экземпляра Linux. Хотя LXC все еще используется сегодня, доступны более новые технологии, использующие ядро ​​Linux. Ubuntu, современная операционная система Linux с открытым исходным кодом, также предоставляет эту возможность.

Docker расширил собственные возможности контейнеризации Linux с помощью технологий, которые позволяют:

  • Улучшенная и бесшовная переносимость: В то время как контейнеры LXC часто ссылаются на конфигурацию, зависящую от компьютера, контейнеры Docker работают без изменений на любом рабочем столе, в центре обработки данных и в облачной среде.
  • Еще меньший вес и более детальные обновления: LXC позволяет объединить несколько процессов в одном контейнере. С контейнерами Docker в каждом контейнере может выполняться только один процесс. Это позволяет создать приложение, которое может продолжать работать, пока одна из его частей отключена для обновления или ремонта.
  • Автоматическое создание контейнера: Docker может автоматически создавать контейнер на основе исходного кода приложения.
  • Управление версиями контейнера: Docker может отслеживать версии образа контейнера, выполнять откат к предыдущим версиям и отслеживать, кто и как создал версию.Он даже может загружать только дельты между существующей версией и новой.
  • Повторное использование контейнеров: Существующие контейнеры можно использовать в качестве базовых образов – по сути, как шаблоны для создания новых контейнеров.
  • Общие библиотеки контейнеров: Разработчики могут получить доступ к реестру с открытым исходным кодом, содержащему тысячи добавленных пользователями контейнеров.

Сегодня контейнеризация Docker также работает с сервером Microsoft Windows. И большинство поставщиков облачных услуг предлагают определенные услуги, чтобы помочь разработчикам создавать, поставлять и запускать приложения, контейнеризованные с помощью Docker.

По этим причинам внедрение Docker резко возросло и продолжает расти. На момент написания этой статьи Docker Inc. сообщает об 11 миллионах разработчиков и 13 миллиардах загрузок образов контейнеров каждый месяц (ссылка находится за пределами IBM).

Инструменты и термины Docker

Некоторые инструменты и терминология, с которыми вы столкнетесь при использовании Docker, включают:

DockerFile

Каждый контейнер Docker начинается с простого текстового файла, содержащего инструкции по созданию образа контейнера Docker. DockerFile автоматизирует процесс создания образа Docker. По сути, это список инструкций интерфейса командной строки (CLI), которые Docker Engine будет запускать для сборки образа.

Образы Docker

Образы Docker содержат исходный код исполняемого приложения, а также все инструменты, библиотеки и зависимости, которые необходимы коду приложения для работы в качестве контейнера. Когда вы запускаете образ Docker, он становится одним экземпляром (или несколькими экземплярами) контейнера.

Можно создать образ Docker с нуля, но большинство разработчиков извлекают его из общих репозиториев. Из одного базового образа можно создать несколько образов Docker, и они будут иметь общие черты своего стека.

Образы Docker состоят из слоев , и каждый уровень соответствует версии образа. Каждый раз, когда разработчик вносит изменения в изображение, создается новый верхний слой, который заменяет предыдущий верхний слой в качестве текущей версии изображения.Предыдущие слои сохраняются для отката или для повторного использования в других проектах.

Каждый раз, когда контейнер создается из образа Docker, создается еще один новый слой, называемый слоем контейнера. Изменения, внесенные в контейнер, такие как добавление или удаление файлов, сохраняются только на уровне контейнера и существуют только во время работы контейнера. Этот итеративный процесс создания образа позволяет повысить общую эффективность, поскольку несколько экземпляров живых контейнеров могут запускаться только из одного базового образа, и когда они это делают, они используют общий стек.

Докер-контейнеры

Docker-контейнеры – это живые, работающие экземпляры образов Docker. В то время как образы Docker являются файлами, доступными только для чтения, контейнеры представляют собой живое, эфемерное исполняемое содержимое. Пользователи могут взаимодействовать с ними, а администраторы могут изменять их настройки и условия с помощью команд Docker.

Докер-хаб

Docker Hub (ссылка находится за пределами IBM) – это общедоступный репозиторий образов Docker, который называет себя «крупнейшей в мире библиотекой и сообществом образов контейнеров».«Он содержит более 100 000 образов контейнеров, полученных от поставщиков коммерческого программного обеспечения, проектов с открытым исходным кодом и отдельных разработчиков. Он включает образы, созданные Docker, Inc., сертифицированные образы, принадлежащие Docker Trusted Registry, и многие тысячи других образов.

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

Демон Docker

Демон Docker – это служба, работающая в вашей операционной системе, например Microsoft Windows, Apple MacOS или iOS.Эта служба создает образы Docker и управляет ими с помощью команд клиента, выступая в качестве центра управления вашей реализацией Docker.

Реестр Docker

Реестр Docker – это масштабируемая система хранения и распространения образов докеров с открытым исходным кодом. Реестр позволяет отслеживать версии образов в репозиториях, используя теги для идентификации. Это достигается с помощью git, инструмента контроля версий.

Развертывание и оркестровка Docker

Если вы используете всего несколько контейнеров, довольно просто управлять своим приложением в Docker Engine, де-факто промышленной среде выполнения.Но если ваше развертывание включает тысячи контейнеров и сотни сервисов, практически невозможно управлять этим рабочим процессом без помощи этих специализированных инструментов.

Docker Compose

Если вы создаете приложение из процессов в нескольких контейнерах, которые находятся на одном хосте, вы можете использовать Docker Compose для управления архитектурой приложения. Docker Compose создает файл YAML, который указывает, какие службы включены в приложение, и может развертывать и запускать контейнеры с помощью одной команды.Используя Docker Compose, вы также можете определять постоянные тома для хранения, указывать базовые узлы, а также документировать и настраивать зависимости служб.

Кубернетес

Чтобы отслеживать жизненные циклы контейнеров и управлять ими в более сложных средах, вам понадобится инструмент оркестровки контейнеров. Хотя Docker включает в себя собственный инструмент оркестровки (называемый Docker Swarm), большинство разработчиков вместо этого выбирают Kubernetes.

Kubernetes – это платформа оркестровки контейнеров с открытым исходным кодом, созданная на основе проекта, разработанного для внутреннего использования в Google.Kubernetes планирует и автоматизирует задачи, являющиеся неотъемлемой частью управления архитектурой на основе контейнеров, включая развертывание контейнеров, обновления, обнаружение служб, выделение ресурсов хранения, балансировку нагрузки, мониторинг работоспособности и многое другое. Кроме того, экосистема инструментов с открытым исходным кодом для Kubernetes, включая Istio и Knative, позволяет организациям развертывать высокопроизводительную платформу как услугу (PaaS) для контейнерных приложений и ускорять переход к бессерверным вычислениям.

Более подробные сведения о Kubernetes можно найти в видео «Объяснение Kubernetes»:

Объяснение Kubernetes (10:59)

Докер и IBM Cloud

Корпоративная контейнерная платформа обеспечивает оркестровку между несколькими общедоступными и частными облаками, чтобы унифицировать ваши среды для повышения производительности бизнеса и производительности.Это ключевой компонент стратегии открытого гибридного облака, который позволяет избежать привязки к поставщику, согласованно создавать и запускать рабочие нагрузки в любом месте, а также оптимизировать и модернизировать всю ИТ-инфраструктуру.

Сделайте следующий шаг:

  • Развертывайте высокодоступные, полностью управляемые кластеры Kubernetes с помощью Red Hat OpenShift в IBM Cloud, управляемой службы OpenShift, которая использует масштаб предприятия и безопасность IBM Cloud для автоматизации обновлений, масштабирования и выделения ресурсов.
  • Развертывайте и запускайте приложения в локальных средах, периферийных вычислениях и общедоступных облачных средах от любого поставщика с помощью IBM Cloud Satellite, управляемого распределенного облачного решения
  • Упростите и консолидируйте озера данных за счет беспрепятственного развертывания корпоративного хранилища с поддержкой контейнеров в локальных и общедоступных облачных средах с помощью решений IBM для гибридного облачного хранилища
  • Упростите сложное управление гибридной ИТ с помощью управляемых сервисов IBM Cloud.

Добавить комментарий

Ваш адрес email не будет опубликован.