Рубрики
Uncategorized

Docker Demystied

С момента запуска открытого исхода в 2013 году Докер стал одним из самых популярных технологий. В этом блоге мы хотим погрузиться глубже в внутренние внутренние докер, чтобы понять, как это работает. Помечено Linux, Docker, Nowizers, Devops.

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

Первая часть этого поста даст быстрый обзор о основных архитектурных концепциях. Во второй части мы введем четыре основных функционала, которые формируют основу для изоляции в докеровских контейнерах: 1) CGGOUPS, 2) пространства имен, 3) Степенные слои и копировальные слои и копировальные мосты и 4) виртуальные сетевые мосты. В третьем участке будет обсуждение возможностей и проблем при использовании контейнеров и докера. Мы заключаем, отвечая на некоторые часто задаваемые вопросы о Docker.

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

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

Docker запускает контейнеры, основанные на Изображения Отказ Изображение похоже на план, определяющий, что должно быть внутри контейнера, когда оно создано. Обычный способ определить изображение через Dockerfile Отказ DockerFile содержит инструкции о том, как создать свой образ шаг за шагом (не волнуйтесь, вы поймете больше о том, что происходит внутри страны). Например, следующий DockerFile начнется с изображения, содержащего OpenJDK, установите Python 3 там, скопируйте требования .txt Внутри изображения, а затем установите все пакеты Python из файла требований.

FROM openjdk:8u212-jdk-slim

RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    Python3=3.5.3-1 \
    Python3-pip=9.0.1-2+deb9u1 \
  && rm -rf /var/lib/apt/lists/*

COPY requirements.txt requirements.txt
RUN pip3 install --upgrade -r requirements.txt

Изображения обычно хранятся в репозиториях изображений под названием Docker Реестры Отказ Dockerhub является публичным документом Docker. Для того, чтобы загружать изображения и начать контейнеры, вам нужно иметь докер хозяин Отказ Host Docker — это машина Linux, которая управляет Docker демон (Демон — это фоновый процесс, который всегда работает, ожидание работы работы).

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

Важно уже отметить, что сам Docker не предоставляет фактической контейнеризации, но просто использует то, что доступно в Linux. Давайте погрузимся в технические детали.

Докер достигает изоляции разных контейнеров через сочетание четырех основных концепций: 1) cgroups , 2) пространства имен 3) Стекируемые Image-Layers и Копировать на писать и 4) Виртуальные сетевые мосты Отказ В следующих подразделах мы собираемся объяснить эти концепции подробно.

Контрольные группы (CGUP)

Операционная система Linux управляет доступными аппаратными ресурсами (память, процессор, диск ввода/вывода, сетью ввода/вывода, …) и обеспечивает удобный способ для процессов доступа и их использования. Например, планировщик ЦП Linux, например, заботится о том, чтобы каждый нить в конечном итоге получит некоторое время на сердечном центре CPU, чтобы никакие приложения не застряли в ожидании времени процессора.

Контрольные группы (CGroups) — это способ назначить подмножество ресурсов для конкретной группы процессов. Это может быть использовано для, например, убедитесь, что даже если ваш ЦП является супер занятым с помощью сценариев Python, ваша база данных PostgreSQL по-прежнему получает выделенный CPU и RAM. Следующая картина иллюстрирует это в примерном сценарии с 4 ядрами процессорами и 16 ГБ ОЗУ.

Все тетради Zeppelin, запущенные в Zeppelin-GRP, будут использовать только ядро 1 и 2, а процессы PostgreSQL обмениваются ядром 3 и 4. Так же относится к памяти. CGroups являются одним важным строительным блоком в контейнерной изоляции, поскольку они позволяют оптимизировать оборудование ресурс.

Пространства имен

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

Пространства имен PID

Операционная система Linux организует процессы в так называемом дереве процесса. Корень дерева — первый процесс, который начинается после загрузки операционной системы, и она имеет PID 1. Как можно существовать только одно технологическое дерево, и все другие процессы (например, Firefox, эмуляторы терминала, серверы SSH) должны быть (напрямую или косвенно), созданные по этому процессу. Из-за того, что этот процесс инициализирует все другие процессы, которые часто называют init процесс.

На следующем рисунке иллюстрирует части типичного дерева процесса, где процесс INIT запустил службу регистрации ( Syslogd ), планировщик ( Cron ) и входной оболочку ( Bash ):

1 /sbin/init
+-- 196 /usr/sbin/syslogd -s
+-- 354 /usr/sbin/cron -s
+-- 391 login
    +-- 400 bash
        +-- 701 /usr/local/bin/pstree

Внутри этого дерева каждый процесс может видеть каждый другой процесс и отправлять сигналы (например, запросить процесс остановки), если они пожелают. Использование пространств имен PID виртуализирует PID для конкретного процесса и все его субпроцессы, что делает его думать, что он имеет PID 1. Затем он также не сможет увидеть какие-либо другие процессы, кроме своих собственных детей. На следующем рисунке иллюстрирует, как различные пространства имен PID изолируют процедуры под деревьями двух процессов Zeppelin.

1 /sbin/init
|
+ ...
|
+-- 506 /usr/local/zeppelin
    1 /usr/local/zeppelin
    +-- 2 interpreter.sh
    +-- 3 interpreter.sh
+-- 511 /usr/local/zeppelin
    1 /usr/local/zeppelin
    +-- 2 java

Пространства имен файловой системы

Другой корпус использования для пространств имен — это файловая система Linux. Похоже на пространства имен PID, пространства имен файловой системы виртуализируют и изолируют части дерева — в этом случае дерево файловой системы. Файловая система Linux организована как дерево, и у него есть корня, как правило, называется / Отказ

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

Другие пространства имен

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

Штабелируемые слои изображения и копирование в записи

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

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

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

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

Виртуальный сетевой мост

Теперь мы знаем способы изолировать аппаратные ресурсы (CGroups) и системных ресурсов (пространства имен) и как предоставить каждому контейнеру предопределенным набором зависимостей, чтобы быть независимыми от хост-системы (слои изображения). Последний строительный блок, Виртуальный сетевой мост , помогает нам изолировать стек сети внутри контейнера.

Сетевой мост — это компьютерное сетевое устройство, которое создает единую совокупную сеть из нескольких сетей связи или сегментов сети. Давайте посмотрим на типичную настройку физического сетевого моста, соединяющего две сегменты сети (LAN 1 и LAN 2):

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

Две контейнеры в этом примере имеют свои eth0 Сетевой интерфейс внутри их пространства имен сети. Он сопоставлен с соответствующими виртуальными сетевыми интерфейсами veth0. и veth1 на доке докера. Виртуальный сетевой мост Docker0 Подключает интерфейс Host Network eth0 Для всех интерфейсов контейнерных сетей.

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

Соединение точек

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

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

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

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

Возможности

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

Контейнеры увеличивают предсказуемость вашего развертывания. Нет больше «бежит на моей машине». Больше нет развертывания приложения, потому что одна машина установлена другая версия Java. Вы создаете изображение один раз, и вы можете запустить его где угодно (дано есть установлена ядра Linux и Docker).

Высокая скорость усыновления и хорошая интеграция со многими выдающимисямительными менеджерами кластера. Одна большая часть об использовании Docker — это программная экосистема вокруг него. Если вы планируете работать в масштабе, вы не будете получать использование одного или другого диспетчера кластера. Неважно, если вы решите позволить кому-то другому управлять вашим развертыванием (например, облако Google, Docker Cloud, Heroku, AWS, …) или хочу сохранить свой собственный менеджер кластера (например, Kubernetes, Nomad, Mesos), есть Множество решений там.

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

Вызовы

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

Docker позволяет людям развернуть наполовину запеченные решения. Выберите свой любимый продукт программного обеспечения и введите его назовите его на панель поиска Google, добавляя «докер». Вы, вероятно, найдете хотя бы один, если не десятки уже общедоступных изображений, содержащих ваше программное обеспечение в Dockerhub. Так почему бы просто не выполнить его и отдать его? Что может пойти не так? Многие вещи могут пойти не так. Вещи выглядят блестящими и потрясающими, когда положить в контейнеры, и люди прекращают обращать внимание на фактическое программное обеспечение и конфигурацию внутри.

Анти-образцовая картина жира контейнера в большом количестве жестких артефактов развертывания. Я видел докеровские изображения, которые требуют от вас более 20 портов для различных приложений внутри, когда контейнер. Философия докера заключается в том, что один контейнер должен выполнять одну работу, и вы должны скорее сочинять их вместо того, чтобы сделать их тяжелее. Если вы в конечном итоге выкладываете все свои инструменты в один контейнер, вы теряете все преимущества, могут иметь разные версии Java или Python внутри и в конечном итоге с 20 ГБ, неуправляемым образом.

Знания глубокого Linux все еще могут потребоваться для отладки определенных ситуаций. Возможно, вы слышали, как ваш коллега говорит, что XXX не работает с Docker. Есть несколько причин, почему это может произойти. Некоторые приложения имеют проблемы, работающие внутри уздного пространства имен сети, если они не различают должным образом между сетевым интерфейсом, они связывают, и тот, который они рекламируют. Другая проблема может быть связана с CGroups и пространствами имен, в которых настройки по умолчанию с точки зрения общей памяти не совпадают с вашим любимым дистрибутивом Linux, приводя к ошибкам OOM при запуске внутри контейнеров. Тем не менее, большинство вопросов на самом деле не связаны с Docker, а к приложению, не предназначенной должным образом, и они не так частыми. Тем не менее, они требуют некоторого более глубокого понимания того, как работает Linux и Docker, которые не каждый пользователь Docker.

Q: В чем разница между контейнером и виртуальной машиной?

Без слишком много погружения в детали о архитектуре виртуальных машин (VMS), давайте посмотрим на главное отличие между двумя на концептуальном уровне. Контейнеры проходят внутри операционной системы, используя функции ядра для изоляции приложений. VMS с другой стороны требуют гипервизора, который проходит внутри операционной системы. Затем гипервизор создает виртуальное оборудование, которое может быть доступна еще одним набором операционных систем. Следующие иллюстрации сравнивают настроек приложения на основе виртуальной машины и настроек на основе контейнера.

Как вы можете видеть, настроек на основе контейнера имеет меньше над головой, поскольку она не требует дополнительной операционной системы для каждого приложения. Это возможно, потому что менеджер контейнера (E.G. Docker) использует функциональность операционной системы непосредственно для изоляции приложений более легкой моды.

Значит ли это, что контейнеры превосходят виртуальные машины? Это зависит. Обе технологии имеют свои случаи использования, и иногда даже имеет смысл объединить их, управляя менеджером контейнера внутри VM. Существует много сообщений в блоге там, что обсуждают плюсы и минусы обоих решений, поэтому мы не собираемся вносить в подробности прямо сейчас. Важно понимать разницу и не видеть контейнеров как какой-то «легкий виртуальный виртуальный виртуал», потому что внутренне они отличаются.

Q: Содержит ли контейнеры?

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

В конце концов ваша заявка каким-то образом необходимо иметь некоторый побочный эффект (сохраняющие данные на диск, отправляющие пакеты через сеть, …). Таким образом, вы в конечном итоге разбите изоляцию путем переадресации сетевого трафика или монтажа томов хоста в ваше пространство имен файловых систем. Также не требуется использовать все доступные функции пространства имен. Хотя функции пространства имен Network, PID и файловой системы включены по умолчанию, используя пространство имен идентификатора пользователя, требует, чтобы вы добавили дополнительные параметры конфигурации.

Так что ложно, чтобы предположить, что просто поместив что-то внутри контейнера, делает его безопасным. AWS, E.G., использует легкий двигатель VM, называемый Firecracker Для безопасного и мультиантанта выполнения короткоживущих рабочих нагрузок.

Q: Составляют ли контейнеры сделать мою продукцию более стабильной?

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

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

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

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

«Установка сломанного программного обеспечения в контейнер докеров не делает его менее сломанным». — @sadserver.

Оригинал: «https://dev.to/frosnerd/docker-demystified-27kl»