- PVSM.RU - https://www.pvsm.ru -
Источник: 'Nova typis transacta navigatio' (Linz: s.n., 1621), p.12 (British Library, G.7237).
Часто во время разговоров о Docker я слышу мнения, с которыми не совсем согласен.
«Docker по своей сути предназначен для крупных компаний»
«под OSx у него экспериментальная поддержка, под Windows работает еле-еле»
«Я не уверен, что смогу быстро развернуть его локально»
… и еще много всякого.
В этих утверждениях есть доля истины (см. ниже мифы 3 и 5), но она мала, и по большей части реальная картина получается искаженной.
А есть еще и наполненные жаргоном статьи о том, как при использовании немалого количества фреймворков обрабатывать 10к миллионов запросов в секунду. И это с помощью всего лишь 30к контейнеров при автоматизации 5к микросервисов, размещенных на шести сотнях облачных виртуальных машин…
Что ж, нетрудно догадаться, почему Docker окружен таким количеством мифов.
К сожалению, эти мифы очень живучи. И главное их достижение заключается в том, что они пугают разработчиков и не дают им решиться на использование Docker.
Давайте поговорим о самых распространенных мифах – тех, с которыми я сталкивался и в которые верил, – и попробуем найти в них истину, а также решения, если таковые имеются.
Для разработки мне нужны специальные инструменты и настройки окружения. При этом мне вполне справедливо указали, что редактировать используемый в промышленной эксплуатации Dockerfile нельзя.
Боевой Docker-образ должен быть сконфигурирован только для нужд промышленной эксплуатации и не более.
Как же быть? Если я не могу добавить в Dockerfile мои инструменты и настройки, как мне тогда вообще разрабатывать в Docker?
Я могу скопипастить боевой Dockerfile в собственный и внести в копию необходимые изменения. Но дублирование может привести к неприятным последствиям.
Вместо копирования Dockerfile, которое может привести к дополнительным трудностям, лучше использовать функциональность Docker по созданию одних образов на основе других.
Я и так создаю production-образ со своим приложением на основе другого образа (что-то типа “node:6”). Так почему бы мне не сделать “dev.dockerfile”, который будет создавать нужный образ на его основе?
FROM node:6
# ... production configuration
$ docker build -t myapp .
FROM myapp
# ... development configuration
$ docker build -t myapp:dev -f dev.dockerfile .
Теперь я могу модифицировать dev.dockerfile по своему усмотрению, зная, что в нем используется точно такая же конфигурация, как и в production-образе.
Посмотрите эпизод Creating a Development Container [1], который является частью Guide to Building Node.js Apps in Docker [2].
Docker — это виртуализация приложений [3] (контейнеризация), здесь нет полноценных виртуальных машин.
Но разработчику часто необходимо взаимодействовать с контейнером так, как будто это виртуальная машина.
Мне нужны логи (помимо консольного вывода моего приложения), отладочные сообщения и общая уверенность в том, что все изменения образа отработали корректно.
Если контейнер — это не виртуальная машина, как мне понять, что происходит? Как я увижу файлы, переменные окружения и другие необходимые вещи?
Хотя Docker-контейнер и не является полноценной виртуальной машиной, под его капотом работает дистрибутив Linux.
Да, этот дистрибутив может быть очень сильно обрезан (например, как Alpine Linux), но в нем все равно есть как минимум доступ к простейшей командной оболочке, что дает возможность заглянуть внутрь контейнера.
В общем случае есть два способа это сделать.
Если контейнер уже запущен, для получения полного доступа к нему я могу выполнить команду “docker exec”.
$ docker exec -it mycontainer /bin/sh
Это дает доступ к содержимому контейнера, аналогичный тому, что я получаю при входе в систему под управлением обычного дистрибутива Linux.
Если у меня нет работающего контейнера, я могу запустить новый с командной оболочкой в качестве стартовой команды.
$ docker run -it myapp /bin/sh
Теперь у меня есть новый контейнер с командной оболочкой, которая позволяет посмотреть, что там внутри.
Посмотрите эпизоды из Guide to Learning Docker [4] и Guide to Building Node.js Apps in Docker [2].
Когда я в первый раз увидел Docker-контейнер, в котором выполнялся мой Node.js-код, меня очень заинтересовали и обрадовали его возможности.
Но радость быстро улетучилась, когда я начал думать, как переместить измененный код внутрь контейнера уже после создания образа.
Нужно каждый раз пересоздавать образ? Но это будет занимать слишком много времени, поэтому такой вариант отпадает.
Может быть, нужно подключаться к командной оболочке контейнера и кодить в vim? Возможно, при этом придется использовать не ту версию, которая мне нужна.
Допустим, это работает. А если мне нужна IDE или редактор получше?
Если у меня есть доступ только к консоли контейнера, как использовать мой любимый текстовый редактор?
В контейнерах Docker с помощью опции "volume mount" можно монтировать директории из хост-системы.
$ docker run -v /dev/my-app:/var/app myapp
С этой командой “/var/app” будет указывать на локальную директорию “/dev/my-app”. Изменения, внесенные на хост системе в “/dev/my-app”(конечно же, с помощью моего любимого редактора), будут сразу видны в контейнере.
Посмотрите эпизод editing code in a container [7], который является частью Guide to Building Node.js Apps in Docker [2].
Мы уже можем редактировать код внутри контейнера и подключаться к его командной оболочке. До отладки остался один шаг.
Я должен запускать отладчик внутри контейнера, так?
Безусловно, внутри Docker-контейнера можно использовать консольный отладчик для выбранного языка программирования, но это не единственная опция.
Как же тогда в контейнере запустить отладчик из моей IDE или любимого редактора?
Короткий ответ: «удаленная отладка».
Развернутый ответ очень сильно зависит от языка и рабочего окружения.
С Node.js, например, я могу использовать удаленную отладку по TCP/IP (порт 5858). Чтобы настроить отладку кода внутри Docker-контейнера, мне нужно открыть соответствующий порт в образе, создаваемом с помощью “dev.dockerfile”.
# ...
EXPOSE 5858
# ...
Теперь я могу подключиться к командной оболочке контейнера и запустить сервис отладки Node.js, а затем использовать его с моим любимым отладчиком.
Посмотрите эпизод debugging in a container with Visual Studio Code [8], который является частью Guide to Building Node.js apps in Docker [2].
Без сомнения, у Docker огромное количество опций командной строки. Листание его справки напоминает чтение ветхого тома по мифологии исчезнувшей цивилизации.
Когда наступает время запустить (run) контейнер, я, что не удивительно, частенько путаюсь и даже начинаю злиться, поскольку с первого раза не могу подобрать нужные опции.
Более того, каждый запуск “docker run” создает из образа новый экземпляр контейнера.
Это замечательно, если мне нужен новый контейнер.
Но когда я захочу запустить ранее созданный контейнер, результат выполнения “docker run” мне совсем не понравится.
Нет нужды выполнять “docker run” каждый раз, когда нужен контейнер.
Вместо этого контейнеры можно останавливать (stop) и запускать (start).
Этим также достигается сохранение состояния контейнера между запусками. Если в нем были изменены какие-то файлы, эти изменения сохранятся после остановки и повторного запуска.
На WatchMeCode есть много эпизодов Guide to Learning Docker [4] и Guide to Building Node.js Apps in Docker [2], в которых используется эта техника.
Но если идея для вас в новинку, рекомендую посмотреть basic image and container management [9], в котором рассказывается об остановке и запуске одного экземпляра контейнера.
Еще несколько месяцев назад это, в общем-то, было правдой.
В прошлом Docker под Mac и Windows требовал использования полноценной виртуальной машины с утилитой “docker-machine” и дополнительным программным обеспечением для обмена данными с виртуальным окружением.
Это работало, но с очень большими потерями производительности и ограниченным набором функций.
К счастью, разработчики Docker прекрасно понимают необходимость поддержки не только Linux в качестве базовой ОС.
Во второй половине 2016 года были выпущены официальные релизы Docker для Mac и Windows.
Теперь установка Docker на эти платформы не составляет труда. Регулярно выпускаются обновления, а функциональность находится практически на уровне версии под Linux, и я не помню, когда в последний раз мне нужна была опция, недоступная в Docker под Mac или Windows.
На WatchMeCode можно найти бесплатные эпизоды по установке на обе платформы (а также на Ubuntu Linux!)
Поскольку Docker родом из мира Linux, не удивительно, что командная строка — это основной его интерфейс.
Однако изобилие команд и опций порой обескураживает. Для разработчика, который пользуется консолью нерегулярно, это может стать причиной снижения продуктивности.
По мере роста Docker-сообщества появляется все больше инструментов, удовлетворяющих разнообразные запросы пользователей, включая утилиты с графическим интерфейсом.
В Docker для Mac и Windows есть базовые средства интеграции с Kitematic, например, GUI для управления образами и контейнерами на локальной машине.
Kitematic позволяет с легкостью находить образы в репозиториях Docker, создавать контейнеры, а также управлять настройками установленных и работающих контейнеров.
Посмотрите эпизод о Kitematic [13] в Guide to Learning Docker [4].
Контейнеры по своей природе являются эфемерными: они должны без колебаний уничтожаться и создаваться заново по мере необходимости. Но если данные моей базы хранятся внутри контейнера, его удаление приведет к их потере.
Более того, системы управления базами данных имеют свои особенности при масштабировании: вертикально (более мощный сервер) и горизонтально (больше серверов).
Docker, похоже, специализируется на горизонтальном масштабировании: когда нужно увеличить мощность, создается больше контейнеров. С другой стороны, большинство СУБД требуют специфических настроек при масштабировании.
Да, все так. Боевую базу в Docker лучше не разворачивать.
Тем не менее мой первый удачный опыт работы с Docker был связан именно с базой данных.
Oracle, если быть точным.
Для нужд разработки мне понадобился Oracle, но у меня не получилось развернуть его в виртуальной машине. Я урывками занимался этим вопросом около двух недель, но к успеху даже не приблизился.
А через 30 минут после того, как я узнал, что существует образ Oracle XE для Docker, у меня была рабочая база.
В моем окружении для разработки.
Docker может быть не лучшим решением для размещения боевой БД, но для разработчиков он может творить чудеса.
У меня работали MongoDB, MySQL, Oracle, Redis, а также другие системы, требующие сохранения состояния между перезапусками, и меня все устраивало.
Ну а если говорить об «эфемерности» контейнеров Docker, то не следует забывать о возможности подключения внешних томов.
Аналогично истории с редактированием кода: подключение томов предоставляет удобный инструмент для хранения данных на локальной машине и их использования в контейнере.
Теперь я могу в любое время создавать и удалять контейнеры, зная, что продолжу с того же места, на котором остановился.
Когда я впервые увидел Docker, то подумал: или разрабатывать, дебажить, деплоить и «девопсить» все с Docker (и двумя сотнями дополнительных инструментов и фреймворков, чтобы оно все работало автоматически), или не использовать Docker совсем.
Случай с Oracle XE доказал обратное.
Любой инструмент или технологию, на первый взгляд требующие подхода «все или ничего», не будет лишним переоценить. В крайне редких случаях «все или ничего» на самом деле оказывается правдой. А если все-таки оказывается, возможно, вкладываться в такой продукт не стоит.
Docker, как и большинство инструментов разработчика, можно начинать использовать постепенно.
Начните с малого.
Запустите в контейнере базу данных разработки.
Затем создайте в контейнере библиотеку и выясните, как она работает.
Далее создайте микросервис, но такой, чтобы требовал лишь нескольких строк кода.
Переходите к более серьезным проектам, уже вовлекающим небольшую команду специалистов.
Не нужно бросаться в омут с головой.
Этот был самый серьезный ментальный барьер, который мне нужно было преодолеть после знакомства с Docker.
В моем понимании Docker был инструментом, предназначенным для самых продвинутых команд, решающих такие вопросы масштабируемости, с которыми я никогда в своей жизни не столкнусь.
И совсем не удивительно, что я так думал.
В блогах и на конференциях то и дело возникает шумиха типа «Такая-то корпорация автоматизировала 10 000 000 микросервисов с помощью Docker и Kubernetes» и т. д. и т. п.
Docker может быть отличным инструментом для “enterprise” и “devops”, но и обычный разработчик – как вы и я – может использовать его преимущества.
Попробуйте Docker.
Опять же, начните с малого.
У меня запущена одна виртуальная машина с 12 Гб ОЗУ, на которой размещены 3 веб-проекта для одного из клиентов. По нынешним меркам это весьма скромный сервер. Но я рассматриваю Docker – чистый Docker сам по себе – как способ использовать этот сервер более эффективно.
У меня есть второй клиент, у которого частично заняты пять разработчиков (все вместе не отрабатывающие 40 часов в неделю). Эта небольшая команда также использует Docker для автоматизации процессов сборки и развертывания.
В настоящее время большинство своих open source-библиотек я пишу на Node.js под Docker.
Каждый день с помощью Docker я нахожу новые и зачастую более удобные способы управления программным обеспечением, установленным на моем ноутбуке.
Помните:
Docker-мифология появилась благодаря веским причинам. Но она не помогает разработчикам.
Если вы, прочитав эту статью, все еще сомневаетесь, прошу вас выделить немного времени и попробовать пересмотреть свое отношение к Docker.
Если у вас есть вопросы по поводу того, каким образом разработчик может эффективно использовать Docker, свяжитесь со мной [14]. Буду рад постараться вам помочь.
При желании изучить основы Docker и методы разработки приложений с его использованием можно начать с просмотра Guide to Learning Docker [4] (с нуля) и Guide to Building Node.js Apps in Docker [2] на WatchMeCode.
Автор: Centos-admin.ru
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/node-js/249363
Ссылки в тексте:
[1] Creating a Development Container: https://sub.watchmecode.net/episode/creating-dev-container/
[2] Guide to Building Node.js Apps in Docker: https://sub.watchmecode.net/guides/build-node-apps-in-docker/
[3] виртуализация приложений: https://derickbailey.com/2016/08/29/so-youre-saying-docker-isnt-a-virtual-machine/
[4] Guide to Learning Docker: https://sub.watchmecode.net/guides/learn-docker/
[5] Docker Exec Commands in a Container: https://sub.watchmecode.net/episode/docker-exec/
[6] Start an App w/ a Debugger Attached: https://sub.watchmecode.net/episode/start-app-w-debugger/
[7] editing code in a container: https://sub.watchmecode.net/episode/edit-code-container/
[8] debugging in a container with Visual Studio Code: https://sub.watchmecode.net/episode/debug-container-vs-code/
[9] basic image and container management: https://sub.watchmecode.net/episode/basic-image-and-container-management/
[10] Installing Docker for Mac: https://sub.watchmecode.net/episode/install-docker-for-mac/
[11] Installing Docker for Windows: https://sub.watchmecode.net/episode/install-docker-for-windows/
[12] Installing Docker on Ubuntu Linux: https://sub.watchmecode.net/episode/install-docker-on-ubuntu/
[13] Kitematic: https://sub.watchmecode.net/episode/management-with-kitematic/
[14] свяжитесь со мной: https://derickbailey.com/about/
[15] Источник: https://habrahabr.ru/post/323554/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.