Статьи

Понимание Docker, контейнеров и безопасной доставки программного обеспечения

Докер-контейнеры

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

Доставка программного обеспечения

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

Позже, с «стеком LAMP» (Linux, Apache, MySQL, PHP) — который широко поддерживался хостинговыми компаниями — все стало немного сложнее, но все же было управляемым. Вы можете создавать динамические сайты, связанные с базами данных, и настраивать все через панели управления.

Но в последнее время сценарий стал еще более разнообразным и требовательным, поскольку появились новые технологии. Базы данных NoSQL и Node.js, языки программирования, такие как Python и Ruby, приобрели заметное значение. Все это и многое другое открыло множество возможностей, но теперь поставлять программное обеспечение уже не так просто.

Реализация

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

Докер на помощь

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

Проблемы Докер Решает

Вот некоторые из проблем, с которыми вы столкнетесь в тот или иной момент при поставке программного обеспечения:

  • Приложение, которое вы тщательно разработали на своем любимом языке (Python, Ruby, PHP, C) , похоже, не работает в целевой системе , и вы не можете понять, почему.
  • Все работало просто отлично … пока кто-то не обновил что-то на сервере , а теперь это уже не работает.
  • В противном случае незначительная зависимость (например, модуль, который используется только изредка, или задание cron) вызывает проблемы, когда ваш клиент использует программное обеспечение… Но оно работало на вашем компьютере, когда вы его тестировали !
  • Служба, на которую опирается ваш продукт, например база данных или веб-сервер, имеет некоторые проблемы (например, высокий трафик для веб-сайта или некоторый проблемный код SQL) и действует как узкое место, замедляя работу всей системы .
  • Нарушение безопасности ставит под угрозу какой-то компонент системы, и в результате все идет не так.

Эти проблемы относятся к нечеткой территории «DevOps», причем некоторые из них связаны с проблемами обслуживания (обновления сервера), некоторыми проблемами тестирования (проверка версий модулей) и некоторыми проблемами развертывания (установка и настройка всего в другом месте). Это реальная боль, когда развертывание чего-то, что уже работает , не проходит гладко, а становится проблематичным и отнимает много времени.

Контейнеры программного обеспечения

Вы, вероятно, знакомы с теми крупными стандартизированными транспортными контейнерами, которые существуют для упрощения доставки по всему миру — интермодальные контейнеры:

транспортный контейнер

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

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

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

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

Примеры того, что вы можете поместить в программные контейнеры:

  • интерпретатор Python, Ruby или PHP, содержащий все необходимые модули
  • любые библиотеки времени выполнения
  • конкретные версии определенных модулей (потому что вы никогда не знаете, когда более новая версия вызовет некоторые проблемы)
  • обслуживает потребности вашего приложения, например, веб-сервер или базу данных
  • некоторые специфические настройки системы
  • вспомогательные инструменты для технического обслуживания, такие как задачи cron и другие средства автоматизации.

Упрощенные операции

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

Вы можете поместить ядро ​​вашего приложения с библиотеками в один контейнер и вызывать службы, такие как Apache, MySQL или MongoDB, из разных контейнеров. Все это может показаться странным и даже сложным, но потерпите меня, и вы увидите, как это не только имеет смысл, но и звучит намного проще.

Когда использовать программные контейнеры

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

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

Когда не использовать программные контейнеры

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

  • веб-сайт, который использует только клиентские технологии, такие как HTML, CSS и JavaScript
  • простое настольное приложение, которое в противном случае может распространяться вместе с установщиком программного обеспечения
  • среда разработки на основе Windows (например, .NET Framework или среды выполнения VisualBasic), которая не может быть реализована в Linux.

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

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

Логотип Docker

Докер: «Создайте, отправьте и запустите любое приложение. Куда угодно.»

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

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

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

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

Демо Docker

Вот как вы запускаете контейнер «hello-world»:

$ docker run hello-world

А вот вывод, сгенерированный из контейнера, с небольшим описанием внутренних компонентов Docker:

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

To generate this message, Docker took the following steps:
1. The Docker Engine CLI client contacted the Docker Engine daemon.
2. The Docker Engine daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker Engine daemon created a new container from that image which runs the
   executable that produces the output you are currently reading.
4. The Docker Engine daemon streamed that output to the Docker Engine CLI client, which sent it
   to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
https://hub.docker.com

For more examples and ideas, visit:
https://docs.docker.com/userguide/

Надеюсь, это было достаточно просто, но с контейнером «hello-world» мы мало что можем сделать, поэтому давайте пойдем дальше и запустим интерактивную оболочку в Ubuntu Linux:

 $ docker run -i -t ubuntu bash

# cat /etc/issue
Ubuntu 16.04 LTS \n \l

Первая команда запускает интерактивный ( -i-tubuntubash Вторая команда ( cat /etc/issue Для ясности: не важно, используете ли вы Windows, Mac или коробку Debian, для этого контейнера вы находитесь на машине с Ubuntu. И, к сведению, эта консоль была запущена за секунду !

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

 # rm -rf /etc
# cat /etc/issue
cat: /etc/issue: No such file or directory

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

 # exit
$ docker run -i -t ubuntu bash
# cat /etc/issue
Ubuntu 16.04 LTS \n \l

Это так просто!

Как работает Docker

Архитектура

Если вы знакомы с виртуальными машинами (ВМ), такими как гипервизор, возможно, вы уже начали замечать некоторые различия. Хотя они позволяют запускать разные операционные системы (ОС), виртуальные машины занимают много места на хост-компьютере, поскольку каждая новая ОС загружается с нуля в основную память. А поскольку для каждой ОС требуются все собственные двоичные файлы и библиотеки для всей системы, на нее обычно приходится несколько дополнительных ГБ дискового пространства. И последнее, но не менее важное: точно так же, как и при запуске реальной ОС, загрузка системы занимает несколько минут, прежде чем она начнет работать.

Программные контейнеры, с другой стороны, значительно сокращают большую часть этих накладных расходов, поскольку они напрямую используют ресурсы из хост-ОС, которые обрабатываются Docker Engine, что позволяет более непосредственно и эффективно управлять ресурсами. Вот почему примерно в 100 МБ у вас может быть минимальный, но полностью работающий дистрибутив Linux, такой как Ubuntu, который вы можете запустить буквально за 1 секунду.

Изображения и контейнеры

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

Изображение (иногда называемое «сборкой») — это файл, доступный только для чтения ресурс, который вы загружаете или создаете и который содержит все необходимое для рабочей среды. Создавать образы очень просто, потому что вы можете использовать уже имеющиеся образы в качестве основы (например, дистрибутив Debian) и сообщить Docker, что вы хотите поверх него, например, некоторые инструменты разработки, библиотеки, и даже поместить свое собственное приложение внутрь ,

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

Таким образом, вы запускаете контейнеры из изображений. Аналогия, которая может быть полезна — если вы работаете с объектно-ориентированным программированием, таким как C или Java, — это то, что изображение похоже на класс, тогда как контейнер будет экземпляром этого класса.

Рабочий процесс Docker

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

  1. Создайте образ, используя Dockerfile, простой текстовый файл, в котором вы задаете инструкции для того, что вы хотите объединить в сборке, такие как базовая ОС, библиотеки, приложения, переменные среды и локальные файлы. (См. Ссылку в Dockerfile .)
  2. Отправьте изображение через Docker Hub или ваш личный репозиторий. Теперь вы можете очень легко распространять это приложение или среду разработки с помощью Docker — и на самом деле, существуют десятки официальных, предварительно созданных образов, предлагаемых разработчиками программного обеспечения, готовых к использованию. (Узнайте больше о Docker Hub .)
  3. Запустите контейнер на хост-машине. Все, что вам нужно, это установить Docker, чтобы иметь возможность запускать контейнеры, развертывать микросервисы (то есть запускать разные контейнеры с разными сервисами) и иметь среду, необходимую для разработки или развертывания.

Что делать дальше

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

Требования для установки Docker несколько высоки:

  • Windows : 64-разрядная операционная система, Windows 7 или выше.
  • Mac : OS X 10.8 «Mountain Lion» или новее, с аппаратной поддержкой Intel для виртуализации модулей управления памятью (MMU) и не менее 4 ГБ ОЗУ.
  • Linux : 64-битная установка (независимо от вашего дистрибутива и версии Linux), с ядром 3.10 или выше. (В старых ядрах отсутствуют некоторые функции, необходимые для запуска контейнеров Docker.)

Поскольку Docker является технологией на основе Linux, для Windows и Mac вам сначала необходимо установить Docker Toolbox , который легко настроит на вашем компьютере среду Docker, включая виртуальную машину под управлением Linux и Docker Engine. За инструкциями по установке и настройке вы можете обратиться к специальным руководствам для ОС:

Для разных дистрибутивов Linux вы просто установите Docker Engine:

После установки Docker вы можете выполнить пошаговое руководство по запуску и созданию собственных образов, созданию репозитория в Docker Hub и многим другим:

Чтобы пойти дальше, вы найдете множество учебных пособий по Docker, ориентированных на технологии, таких как Ruby , WordPress и Node.js. (Вы также можете изучить все предложения Docker для SitePoint .)

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