Рубрики
Uncategorized

Почему докер?

Узнайте, как Docker преобразует способ кода с тех пор, как Docker выжил в начале 2013 года … Tagged с Docker, программированием, DevOps, CICD.

Узнайте, как Docker преобразует способ кода

С тех пор, как Docker прожил в начале 2013 года, у него были отношения любовной ненависти с программистами и системами. Хотя некоторые «опытные» разработчики, с которыми я говорил, испытывают сильную неприязнь к контейнеризации в целом (подробнее об этом позже), есть причина, по которой многие крупные компании, включая eBay, Twitter, Spotify и Lyft, по сообщениям, приняли Docker в их Производственная среда.

Вы когда -нибудь работали с VMware, VirtualBox, Parallels или любым другим программным обеспечением для виртуализации? Ну, докер почти такой же (хотя без причудливого графического интерфейса), где он создает виртуальную машину с операционной системой по вашему выбору, связанной только с вашим веб -приложением и ее зависимостями.

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

Но ваше право — типичные виртуальные машины медленные, а то, что делает Docker, не может быть полностью классифицировано при виртуализации. Вместо этого Docker обеспечивает абстракцию поверх поддержки ядра для различных пространств имен процессов, пространств имен устройств и т. Д., Используя runc (Поддерживается инициативой Open Containers ), которая позволяет ей поделиться большим количеством ресурсов хост -системы. Поскольку между контейнером Docker и ядром хост -машины нет дополнительного уровня виртуализации, контейнеру, контейнер удается обеспечить почти идентичную производительность вашему хосту.

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

Если вам нужно запустить систему, в которой вам абсолютно требуется полная изоляция с гарантированными ресурсами (например, игровой сервер), то виртуальная машина, основанная на KVM или OpenVZ, вероятно, является способом. Но если вы просто хотите изолировать отдельные процессы друг от друга и запустить их кучу на хосте разумного размера, не нарушая банк, то Docker для вас. Если вы хотите узнать больше о аспектах производительности запуска контейнерной системы, вот отличная исследовательская статья от IBM: Обновленное сравнение производительности виртуальных машин и контейнеров Linux (2014, Felter et. Al) Это делает звуковое сравнение виртуальных машин и контейнеров.

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

Представьте, что на мгновение следующий сценарий: вы управляете дюжиной Java Services и развертываете их на отдельных серверах, управляющих Ubuntu с Java 8 для вашей среды Dev, QA, постановки и производства. Даже если вы не сделали свои приложения очень доступными, это минимум 48 серверов, которые вам необходимы для управления (12 Services x 4 среда).

А теперь представьте, что ваша команда возглавляет политику смены организации, требующую от вас обновления вашего времени на Java 11. Это 48 серверов, на которые вам нужно войти в систему и обновить вручную. Даже используя такие инструменты, как шеф -повар или марионетка, это много работы.

Docker позволяет создать снимок операционной системы, которая вам нужна, и устанавливает только необходимые зависимости от нее. Одна сторона этого, которую я люблю, заключается в том, что вы можете управлять всеми «раздутыми» или их отсутствием. Вы можете использовать минимальную установку Linux (я рекомендую Alpine Linux, хотя для целей этой статьи я продолжу с Ubuntu) и только установите на нее Java 8.

Когда придет время обновлять, просто отредактируйте DockerFile на Java Image, чтобы использовать Java 11, построить и построить в хранилище контейнера (например, Docker Hub или Amazon ECR), после чего все, что вам нужно сделать, это изменить контейнеры приложения базовые Чтобы ссылаться на новый снимок и повторно развернуть их.

Вот Гист из образца контейнера Docker, построенного на вершине минимальной операционной системы Ubuntu 18.04.

Я бы построил и подтолкнул это изображение в учетную запись Docker Hub Дамиан Используя тег Oracle-jdk-ubuntu-18.04: 1.8.0_191 а затем используйте его, чтобы построить другой контейнер для моих служб для работы:

# Instructs Docker to build this container on top of this snapshot
FROM damian/oracle-jdk-ubuntu-18.04:1.8.0_191

# Copys the application JAR to the container
COPY build/hello-world.jar hello-world.jar

# Executes this command when the container starts
CMD java -jar hello-world.jar

Теперь, если мне нужно было обновить свои услуги на Java 11, все, что мне нужно сделать, это опубликовать новую версию моего моментального снимка Java с установленным совместимым JRE, и обновить тег в объявлении в контейнере для обслуживания, инструктируя контейнер новое базовое изображение. Вуаля, с вашим следующим развертыванием у вас будут все ваши услуги в курсе последних обновлений от Ubuntu и Java.

Хороший вопрос.

Недавно я начал использовать Docker в модульных тестах. Представьте, что у вас есть тысячи тестовых случаев (и если вы это сделаете, поверьте мне, я чувствую вашу боль), которые подключаются к базе данных, где каждый тестовый класс нуждается в новой копии базы данных и чьи отдельные тестовые примеры будут выполнять операции CRUD на данные. Обычно можно сбросить базу данных после каждого теста, используя что -то вроде Пролет Редгейтом, но это означает, что ваши тесты должны будут работать последовательно и займет много времени (я видел модульные тестовые люксы, которые зайдут до 20 минут из -за этого).

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

Другое место, где я использую Docker, — это кодирование в Golang (чьи конфигурации и управление зависимостями я считаю грязным) — вместо того, чтобы напрямую установку, перейдите на мою машину разработки, я следую методу, аналогичному Константин Даруткин В поддержании DockerFile с моей установкой GO + зависимостей, настроенной для Live-Reload My Project, когда я внесу изменения в исходный файл.

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

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

Последовательность

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

Отладка

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

Автоматизация

Большинство инструментов CI/CD, включая Jenkins, Circleci, Travisci и т. Д. В настоящее время полностью интегрированы с Docker, что делает пропагандирование ваших изменений от окружающей среды в окружающую среду.

Облачная поддержка

Контейнеры необходимо контролировать и контролировать, иначе вы не будете иметь представления о том, что работает на ваших серверах и Datadog, компания по мониторингу облака имела это на Docker:

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

Решение этого чудовищного усилия доступно в инструментах самоуправляемой облачной оркестровки, таких как Docker Swarm и Kubernetes а также инструменты, управляемые поставщиком, такие как AWS Упругая контейнерная служба и Google Kubernetes Engine которые отслеживают и управляют кластеризацией и планированием контейнеров.

Благодаря широкому использованию Docker и его жесткой интеграции с поставщиками облачных услуг, такими как AWS и Google Cloud, он быстро становится легким для того, чтобы докеризировать ваше новое или существующее приложение.

Оригинал: «https://dev.to/damianperera/why-docker-ggd»