Резюме
Я начал новый проект на Github под названием «Направляющие» Отказ Это репозиторий технологических гидов, которые будут написаны мной. Причина, по которой я создал этот проект, заключается в том, что я узнаю больше, когда пишу о теме. Это также помогает затвердеть или уточнить концепции. Я буду постоянно обновлять эти руководства, и они никогда не будут завершены. Цель состоит в том, чтобы сделать гидами как можно точнее. Тем не менее, я не всегда буду получать его на 100% и полагаться на обратную связь от сообщества, чтобы улучшить или исправить, где это применимо.
Первое руководство, которое я начал, это Руководство по доке Отказ Я выбрал Docker в качестве моего первого руководства, потому что я думаю, что из всех Trending Technologies Circa 2018, Docker является одним из самых интересных, важных и применимых технологий для любого участия в разработке/развертывании программного обеспечения. Следовательно, будьте ли вы писать программное обеспечение (Freeend или Backend) или управлять оперативной стороной развертывания программного обеспечения, Docker может помочь вам сделать все лучше.
В этом посте я представляю первую часть моего Docker Guide Обзор. В этой первой части я обсуждаю фон докера и ассоциированные технологии.
Пожалуйста, найдите оригинальную работу в следующих местах:
Все будущие обновления будут в репозитории проекта GitHub.
Обзор
Важно понимать на фоне и что в конечном итоге приведет к докере и успешно. Поэтому в этом руководстве я собираюсь объяснить несколько тем, которые связаны с проблемами жизненного цикла приложений и того, как Docker может помочь решить эти задачи. Во-первых, я буду обсуждать некоторые проблемы, связанные с жизненным циклом приложения, и почему нам нужен лучший способ запуска приложений. Во-вторых, я буду обсуждать Docker, связанные с ними технологиями, и как Docker помогает нам лучше работать и управлять приложениями.
Проблемы развертывания программного обеспечения
В этом разделе я обсудим некоторые проблемы, связанные с развертыванием и эксплуатацией приложений.
Весь смысл компьютера должен быть в состоянии запустить приложения на нем. Перед виртуализацией обычно будет физическая компьютерная система, такая как сервер, на которой можно установить все приложения. Каждая физическая компьютерная система будет иметь свою собственную операционную систему (ОС). Все приложения должны быть совместимы с ОС что они устанавливаются на. ОС необходимо будет поддерживать несколько приложений, имея несколько runtimes, Frameworks, библиотек, конфигураций и реализаций безопасности. Кроме того, ОС также должна быть определенной версии, которую поддерживает все приложения. Любой патч, обновление или установка на ОС, имеет возможность разбить другие приложения. Хотя все приложения работают в своих собственных процессах, выделение по умолчанию, связанная с каждым процессом, недостаточно, чтобы помочь обеспечить целостность и надежность ОС и в основном приложениях. Вместо того, чтобы быть твердым и чистым временем выполнения, поддерживающие работу всех приложений, ОС становится a большой мяч грязи . Это в основном означает, что ОС становится менее сплоченным и все более связана с другими зависимостями, которые приводят к системе, напоминающей «спагетти» Там, где нет четкого разделения проблем. Поэтому, когда каждый считает, что на самом деле попадает в получение приложения в производство, то человек начинает осознавать, насколько сложно это на самом деле. Это еще более сложное при поддержке нескольких сред развертывания (разработчика, тестирование, постановка). Следовательно, проблема, с которой мы сталкиваемся, заключается в том, как получить заявку на всю дорогу от разработки в различные среды развертывания в автоматизированном, последовательном и безошибочном способе. Эта проблема может быть дополнительно деконструирована в более конкретные проблемы, а именно распределение, монтаж и управление. Я называю это «DIM (распространение, монтаж, управление)» модель. В следующих параграфах я буду обсуждать Тусклый и любые связанные с ними проблемы.
Я хотел бы отметить, что следующие проблемы пропорциональны масштабам. Как небольшая команда с несколькими небольшими приложениями, следующие проблемы могут не казаться проблемой вообще. Однако, как архитектура развертывания растет в сложности, так что сложность связана с Тусклый Отказ Сложность либо по дизайну, либо случайно. И если это по дизайну, то это потому, что вы не поняли проблему достаточно хорошо. Найдя лучшие способы сделать Смущать Мы помогаем уменьшить общую сложность благодаря лучшей практике и дизайну.
Распределение
Распределение приложений сложно и сложно. Существует целый процесс или рабочий процесс, который нужно определить с точки зрения того, как доставлять заявку от разработки в тесте, постановку и производство. Процесс будет отличаться для каждой среды разработки и операций по разработке программного обеспечения. Вот несколько вопросов, которые нужно спросить:
- Как будет упаковано приложение?
- Будет ли применение должна быть обнаружена?
- Заявка должна быть загружена?
- Распределение простой материи копирования файлов в следующем пункте назначения?
- Какие значения безопасности связаны с распределением? Например, есть ли какие-либо конфиденциальные данные, которые необходимо распределиться как часть распространения приложения? Должны ли приложение и/или конфигурацию быть зашифрованы? Требуется ли коды Hash Hash, чтобы обеспечить распределение целостности приложения?
- Как обновления и патчи для разных приложений распространяются?
- Сколько сред не должно развернуть приложение?
- Может использоваться непрерывную интеграцию (CI) и непрерывную доставку (CD)? Если так, как это выглядит, и какие навыки требуются?
- Как мы можем менять контроль? Как мы вносите меры управления проще и проще?
Со всеми рассматриваемыми, простая задача получения приложения с машины разработчиков (на самом деле это должно быть из вашей системы управления распределенной версией) в тест или добычу, может оказаться пугающим. Проблема становится только более сложным, чем больше организации и количества приложений.
Установка
Даже в качестве разработчика мне пришлось выдержать свободное количество времени в траншеях установки программного обеспечения/приложения. Излишне говорить, установка приложений может быть медленной, погрешностью, утомительной и разочаровывающей задачей. В кругах разработки программного обеспечения есть аналогия гориллы, держащего банан и обычно используется для объяснения «N + 1» Проблема, связанная с ORM (реляционные материалы объекта). Я собираюсь использовать эту аналогию здесь, потому что я думаю, что это также относится. Подумайте о приложении как банана. Для установки все, что мы хотим, это «банан». Но мы не получаем банан. Вместо этого, то, что мы получаем, это банан, огромный злой горилла, держа ее, все племени Гориллы, и все джунгли, в которых она живет. Я думаю, что вы получите точку зрения. Это по сути «N + 1» Проблема установки. Большинство приложений поставляются с ведром нагрузки зависимостей (и у каждого есть собственный набор зависимостей).
Вот несколько проблем, связанных с установкой:
Не все приложения являются кроссплатформой, что означает, что не все приложения могут работать на всех или нескольких операционных системах. Это приводит к необходимости нескольких физических компьютерных систем с различными операционными системами для запуска соответствующих приложений.
Часто приложения должны будут работать на подобных портах, приводящих к конфликтам порта. Эти конфликты также будут обнаружены только после установки приложений и запущены.
После развертывания приложений обычно должна быть некоторая конфигурация, которая должна состояться, чтобы обеспечить правильное функционирование установленного приложения. Этот дополнительный шаг конфигурации подвержен ошибке (например, отсутствует шаг или неправильная настройка) и проблемы безопасности (например, простой текстовые пароли).
Все приложения имеют разные требования с точки зрения их зависимостей. Следовательно, нужно будет установить многочисленные библиотеки и рамки для приложения для установки и выполнения правильно. Это обычно привело к библиотеке и рамочным конфликтам, где часто единственное решение было бы установить приложение на свою собственную физическую компьютерную систему со своим собственным набором библиотек и каркасов.
Безопасность в этой модели полно уязвимостей (что угодно с возможностью повреждения или убытка). Одним из примеров является то, что часто требуется конфиденциальная информация, которая требуется в качестве переменных среды, будет храниться в простом тексте, и это будет доступно для тех, кто будет видеть, что удалось получить доступ к компьютеру.
Когда новые приложения развертываются, или когда компьютерная система должна быть исправлена (обновления программного обеспечения и безопасности), почти всегда будет просто простоя, связанные с ним.
Кроме того, одна из самых больших проблем, с которыми сталкиваются с установкой, состоит в том, что все приложения поставляются с багажом и требованиями, которые часто находятся в шансах с назначением развертывания. Вот почему мы все слишком знакомы с Но это работало на моей машине «Извините. Кроме того, приложения имеют тенденцию быть фрагментированы вместо сплоченного. Также почему установочные документы/руководства должны детализировать каждый шаг пути. Но эти установочные документы часто часто пишутся и/или неполны. Документация также редко обновляется.
Управление (операция)
На данный момент мы распределили и установили наше приложение. Но как мы управляем нашим приложением, и это все больше требований к ресурсам? Можно ли написать книги на этом материале. Тем не менее, я собираюсь упомянуть только некоторые из проблем, которые я считаю наиболее распространенными, когда дело доходит до управления приложением. Они также являются проблемами, что технологии виртуализации могут помочь адресу.
Вот некоторые эксплуатационные проблемы, которые могут столкнуться с управлением приложениями в различных средах, таких как тест, постановка и производство.
Требования к приложениям ресурсов растут со временем. Это означает, что приложение может потребоваться дополнительная мощность обработки, дополнительная память (RAM) или более жесткого места для жесткого диска. Поэтому можно масштабировать систему, используя либо Вертикальная масштабируемость или Горизонтальная масштабируемость ( Масштабируемость ). По большей части было легче использовать Вертикальная масштабируемость Из-за большинства приложений неспособность работать в распределенной моде. Результат будет добавлять либо слишком много, либо слишком мало ресурсов, которые в конечном итоге приводят к потрачению денег и/или вычислительных ресурсах.
Проблема горизонтального масштабирования (без виртуализации) заключается в том, что требуется для создания отдельной физической машины. Это требует времени (часто изнурительное время задержки) и большие суммы денег для выполнения. И часто приложение может потребоваться только дополнительные вычислительные мощности в пиковые времена (например, черная пятница). Тогда, когда трафик уменьшается, вы остались с Uber вычислительной машиной, не делая ничего, кроме потратительных ресурсов и денег.
Простые приложения жизненные операции, такие как начать, пауза, остановка и перезапуск приложения, либо очень сложно, либо невозможно вообще.
Иногда приложение может стать мошенником в результате одного из них, например, в бесконечную петлю. Мошенничество может принести целую компьютерную систему в остановку, если оставить не проверять.
Избыточность может быть достигнута с помощью физических машин, но она очень дорогая и снова страдает от использования. И даже если кто-то использовал виртуальные машины, время, необходимое для раскрутки новой виртуальной машины, может занять довольно долго. Быть в автономном режиме для чего-либо более чем за несколько секунд не является приемлемым и в некоторых случаях, жизненный вариант.
Все упомянутые выше проблем усугубляются, когда он требуется для настройки нескольких средов, таких как Dev, Test, постановка, производство. И еще хуже, если у вас есть многорегулируемая среда, где каждый клиент требует собственной настройки. Пара, что для множества приложений с множеством различных зависимостей, и у вас есть идеальный шторм.
Теперь, когда мы понимаем некоторые проблемы, связанные с жизненным циклом развертывания приложений, в следующем разделе я собираюсь обсудить Docker и как он появился, чтобы стать одной из самых горячих технологий нашего времени.
Докер
Решение преодоления представленных выше проблем было использование технологии виртуализации, такие как виртуальные машины (стало возможным через гипервизоры). Однако виртуальные машины были первым шагом на пути к развертыванию утопии. Контейнеры — это следующий шаг эволюции развертывания. Это также точка, на которой появился Докер и изменил, как мы работаем с контейнерами навсегда.
Часто условия Докер и Контейнеры используются взаимозаменяемыми, как будто они одинаковы. Тем не менее, докер не является контейнером, и докер придумал концепцию контейнеров. Контейнеры были вокруг более десяти лет, и идея контейнеров намного дольше ( история контейнеров ). Docker — это классический пример «Стоя на плече гигантов» Отказ Контейнеры по своей природе трудно работать и управлять. Поэтому Докер Пришел и затруднился понять (и работать с) технологиями и добраться до простых смертных. Docker — это система управления контейнерами, которая облегчает управление контейнером.
Для дальнейшего понять, что заключается докер, важно понимать следующие ключевые темы:
- Виртуальная машина
- Изображение
- Контейнер
- Виртуальная машина/Сравнение контейнера
- Реестр
- Репозиторий
Виртуальная машина
В предыдущем разделе я обсудил некоторые из проблем, связанных с жизненным циклом приложения. Большая часть проблемы была на необходимости работать в пределах физических компьютерных ограничений. Эти проблемы породили технологию гипервизора, которые позволяют нам создавать виртуальные машины. Поскольку контейнеры часто сравниваются с виртуальными машинами, я хотел бы объяснить, какие различия должны помочь уменьшить или избежать каких-либо путаницы между двумя.
Что, если можно создать своего рода «вертикальный ломтик» физической машины. Каждый кусочек будет выделен процентных ресурсов физических машин. Следовательно, можно затем установить конкретную операционную систему для каждого среза для удовлетворения требований приложений/с. Это звучит великолепно в теории, но нельзя очень хорошо брать нож на физическую машину, разделить его в биты и ожидаю, что он все еще работает. Не в физическом мире в любом случае. Введите виртуализацию и гипервизор. Гипервизор помогает нам разделить наши физические машины на виртуальные вычисления «ломтики». И хотя технология гипервизора ни в коем случае не является панацеей, она проходит долгий путь, чтобы помочь решить некоторые проблемы, упомянутые выше. Гипервизор помогает нам создавать виртуальные машины. Виртуальная машина — это эмуляция физической компьютерной системы в том, что она виртуализирует физические вычисленные ресурсы, такие как CPU, RAM, Network и диск.
Давайте посмотрим на концептуальную диаграмму технологии виртуальной машины.
Диаграмма виртуальной машины
Как видно из диаграммы выше, у нас есть 3 «ломтика» физической машины, где каждый ломтик является виртуальной машиной. Важным выносным положением является то, что виртуальные машины требуют собственной гостевой операционной системы. На диаграмме я также иллюстрирую «Hype-2 Hyster Hypervisor» Отказ Это означает, что гипервизор работает на обычной операционной системе. Другой тип гипервизора — «Hype-1 голый металлический гипервизор» Отказ Эти гипервизоры бегают непосредственно на Hosts Hardware без необходимости в операционной системе хоста.
Изображение
Изображение — это файл (двоичное представление того, как должен выглядеть контейнер). Концептуально изображение — это шаблон (план) для создания контейнеров. На самом деле, много времени, когда упоминаются контейнеры, это на самом деле изображения, к которым называются. Тем не менее, контейнеры — это «время выполнения», тогда как изображения являются «вещью постройки». Аналогия, которую я люблю использовать, — это концепция, взятая из объектно-ориентированного программирования (OOP). В Оопе два из самых важных концепций для понимания — это классы и объекты. Класс — это шаблон (чертеж), и они используются для создания объектов во время выполнения. Объект демонстрирует все свойства и поведение класса, за исключением того, что он существует только во время выполнения. Как и класс, изображение используется для создания контейнеров, которые представляют собой запущенный экземпляр этого изображения.
Поэтому, если кто-то хотел запустить экземпляр MongoDB или Elasticsearch на вашем хостом. Почему не вместо этого не используйте один из готовых изображений, которые доступны через официальный реестр Docker (подробнее о регистрации реестра). Изображения могут быть расположены в следующих местах:
Помните, что изображения используются для запуска контейнеров. Поэтому, а Монгодб Изображение будет использоваться для запуска Монгодб Контейнер, например.
Контейнер
Подумайте о операционной системе с целой кучей процессов, работающих в нем. Эти процессы имеют почти все (процессор, память, сеть и т. Д.), И каждый процесс знает о любом другом процессе. Но что, если вы хотите запустить один или несколько процессов в изолированной среде «песочница»? Песочница обеспечивает изоляцию и позволит каждому процессу иметь собственный процесс пространства имен процесса. Кроме того, песочница сможет контролировать и ограничивать возможности с точки зрения того, сколько ресурсов могут использоваться процессом.
Это понятие изолированного процесса в «песочнице», который породил контейнерную технологию. «Песочница», которую я обсуждал, это то, что мы узнали как контейнер. Контейнеры являются изолированными процессами, которые виртуализируют операционную систему. Механизмы, которые делают это возможными, известны как «Пространства имен» и «Контрольные группы (CGGOUP)» Отказ
Обзор контейнера
Как можно видеть из изображения выше, мы первоначально начали с помощью ОС Linux. Я использую Linux, потому что генез технологии контейнера все произошло на ОС Linux. У каждого процесса нет (или очень мало) изоляции. Благодаря использованию namepsaces и Контрольные группы Теперь мы можем запустить каждый процесс как изолированный процесс в собственном контейнере.
Пространства имен
Официальная документация для пространства имен утверждают следующее:
Пространство имен обернутся глобальный системный ресурс в абстракции, который делает его в процессах в пространстве имен на то, что у них есть собственный изолированный экземпляр глобального ресурса. Изменения в глобальном ресурсе видны для других процессов, которые являются членами пространства имен, но невидимы для других процессов. Одним из употреблений пространств имен является реализация контейнеров.
Поэтому пространства имен Обеспечить процессу изоляции, позволяя каждому процессу работать в собственном изолированном рабочем пространстве. Следовательно, когда один запускает контейнер, следующее пространства имен создаются для различных аспектов контейнера.
- IPC — изолирует и управляет доступом к IPC
- Сеть — изолирует и управляет сетевыми устройствами, стеками, портами и т. Д.
- Mount — изолирует точки монтирования файловой системы
- Пространство имен PID — предоставляет процессу изоляции
- Пространство пользователя — IDOTATE пользователя и идентификатор группы
- Именное пространство UTS — Издное имя хоста и доменное имя NIS
Контрольные группы (CGUP)
Официальная документация для cgroups утверждают следующее:
Контрольные CGroups, обычно называемые CGroups, представляют собой функцию ядра Linux, которые позволяют организовать процессы в иерархические группы, использование которых различные типы ресурсов могут быть ограничены и контролироваться. Интерфейс CGroup Cgroup предоставляется через псевдофайловую систему под названием CGroups. Группировка реализована в ядном коде ядра Cgroup, в то время как отслеживание ресурсов и пределы реализованы в наборе подсистем типа PER-ресурса (память, CPU и т. Д.)
Поэтому cgroups Все о организации процессов, чтобы затем ресурсы могли быть выделены им.
Виртуальная машина/Сравнение контейнера
Контейнеры не являются мини-виртуальными машинами, и они не похожи на виртуальные машины. Это должно быть ясно из моего обсуждения выше. Однако, чтобы помочь дальнейшему уточнению значения контейнеров, я даю дальнейшее сравнение между виртуальными машинами и контейнерами, как можно увидеть ниже.
VM/Сравнение контейнера
С диаграммы выше различия между виртуальными машинами и контейнерами могут быть обобщены следующим образом:
- Там, где гипервизор виртуализирует физическую вычислительную систему (оборудование), контейнеры виртуализируют операционную систему.
- Там, где гипервизору тезируют операционную систему от аппаратного обеспечения, контейнеры абстрактны приложение из операционной системы.
- Там, где виртуальные машины нуждаются в собственной гостевой операционной системе, контейнеры разделяют операционную систему хоста. Вот почему, чтобы запустить контейнеры Linux, вам нужен операционная система хоста Linux. И вам понадобится операционная система Windows для запуска контейнеров Windows.
Кроме того, виртуальные машины и контейнеры также не являются противодействующими технологиями. На самом деле они могут использоваться в качестве бесплатных технологий. Вот как Windows и Apple удалось предложить контейнеры Linux на своих платформах. Оконые операционные системы Windows и Apple требуют гипервизора для выполнения виртуальной машины с помощью операционной системы Linux (Alpine), чтобы использовать технологию, такую как Docker для размещения контейнеров Linux. Хотя Windows добилась значительного прогресса с точки зрения их предлагаемого контейнера. По состоянию на время этого письма можно выбрать, следует ли использовать контейнеры Windows или Linux на операционной системе Windows (Windows 10 Pro).
Контейнеры также не заменяют виртуальные машины. Хотя существует много сценариев, где использование контейнеров было бы лучше (например, микросервисами). Как упоминалось выше, две технологии довольно разные. Помните, что виртуальные машины все о виртуализации оборудования, а контейнеры — это виртуализация операционной системы.
Реестр
Реестр на самом базовом уровне является местом, где можно хранить и получать изображения докера. Docker предоставляет как публичные, так и частные реестры и могут быть найдены здесь Отказ Если вы когда-нибудь работали с менеджерами пакета разработки программного обеспечения, как NPM или Ног . Или если вы работали с менеджерами по пакетам Linux, как Dpkg или RPM Отказ Тогда понятие работы с реестрами Docker должно чувствовать себя знакомым.
Docker — не единственная платформа, которая предлагает реестры Docker. Microsoft Azure, Amazon Web Services, Google Cloud Platform, цифровой океан, но несколько альтернативных реестров докеров, которые предлагаются. Можно также разместить на месте реестры, используя Докер Доверенный реестр Например.
Для получения дополнительной информации о реестре Docker, пожалуйста, просмотрите официальную документацию Docker здесь
Репозиторий
Репозиторий — это фактическое местоположение того, где конкретные изображения могут быть найдены в реестре Docker. Это дополнительно уточняется на диаграмме ниже.
Резюме
Я обсудил то, что я воспринимаю, чтобы быть основными проблемами, связанными с развертыванием программного обеспечения. Ключевой вынос от этого обсуждения в том, что нам нужен лучший способ развертывать программные приложения. И по развертыванию я ссылаюсь на все, относящиеся к распределению, установке и управлению (операции) программных приложений. Мы желаем желания программных приложений, которые являются более портативными, сплоченными, независимыми и изолированными от других приложений/процессов. Это позволяет нам уменьшить сложность и ошибки, связанные с развертыванием программного обеспечения. И это приводит к более надежному, безопасному и легче масштабировать программные приложения.
Технология HyperVisor позволяет нам создавать виртуальные машины (VM), в результате чего мы можем выделить наши приложения и управлять нашими приложениями самостоятельно. Одной из проблем, связанных с ВМ, является то, что они потребляют много волейных ресурсов. Это частично, потому что каждая виртуальная виртуальная система обязана иметь свою собственную гостевую операционную систему. Запуск виртуальной машины относительно быстрый по сравнению с запуск (или подготовкой) физической машины. Однако по сравнению с временем запуска контейнера, например, контейнеры экспоненциально быстрее. Одной из других проблем, связанных с виртуальными машинами, заключается в том, что они не такие портативные, как контейнеры.
Как я уже упоминал ранее в этом руководстве. Контейнеры — это следующий шаг в эволюции развертывания приложений. Однако контейнеры трудно понимать и работать. Следовательно, Docker появился как технология, чтобы упростить управление контейнерами. Контейнеры позволяют нам упаковать наши приложения в одиночную, изолированную и портативные пакеты, которые могут быть легко перемещены между различными средами развертывания.
Оригинал: «https://dev.to/drminnaar/docker-guide—part-1—57c8»