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

От периферии до облака устройства и серверы работают под управлением различных операционных систем, включая Windows и широкий спектр дистрибутивов Linux. Даже в одной и той же ОС приложения запускаются на самых разных стеках программного обеспечения, таких как Java, .NET, Go, Ruby , Python и т. д. Следовательно, для развертывания любого приложения вам необходимы серверы, отвечающие следующим требованиям:

  • Определенная ОС
  • Конкретные библиотеки времени выполнения
  • Определенные стеки программного обеспечения
  • Конкретные версии всего вышеперечисленного

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

Даже если вы убедитесь, что ваш сервер соответствует всем вышеперечисленным требованиям, вы все равно столкнетесь с тем, что ваша среда разработки на вашем ноутбуке часто будет сильно отличаться от серверной. Вы, вероятно, используете Windows или Mac для разработки приложений, которые в конечном итоге будут развернуты на сервере Linux. Это несоответствие, нарушение руководства 12 факторов, часто приводит к тому, что приложения хорошо работают в разработке, но по необъяснимым причинам не работают в производственной среде.

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

Контейнеры были созданы для обеспечения такого типа изоляции, необходимой для создания масштабируемых современных приложений. Контейнеры упаковывают ваше приложение, конкретную ОС, которую оно требует, библиотеки времени выполнения и любые зависимости приложения в виде единого развертываемого модуля, называемого изображением. Это позволяет развернуть образ приложения на любом сервере, даже не спрашивая, какая операционная система, программный стек или среда выполнения существуют в целевой системе. Контейнеры позволяют вашему приложению работать в полной изоляции от остальной части операционной системы. Убедитесь, что образ вашего приложения будет работать на вашем сервере Linux точно так же, как и на вашем ПК с Windows для разработки. Это полностью освобождает вас от каких-либо проблем с развертыванием и позволяет изменять стеки, версии программного обеспечения и даже варианты ОС по своему желанию без какой-либо реконфигурации сервера.

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

В этой первой части мы узнаем, как установить докер и поместить в него базовое веб-приложение.

Установка Docker

В Linux

Запустить

sudo apt-get update
sudo apt-get install curl
curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh

В Windows

Изначально Docker создавался для Linux, однако теперь он поддерживается во всех версиях Windows 10.

В Windows 10 Pro или Enterprise загрузите и установите docker ce из



В Windows 10 Home Edition загрузите и установите docker ce из



В Mac OS X

Загрузите и установите docker ce из



Контейнероведение / докеризация вашего первого приложения

Теперь, когда у нас установлен докер. Чтобы изучить основы работы docker, мы создадим простое веб-приложение Flask на Python и поместим его в контейнер с помощью docker. Обратите внимание, что вам не обязательно быть программистом на Python, чтобы пройти этот пример.

Наше приложение состоит из трех файлов:

  • app.py
  • requirements.txt
  • Dockerfile

Клонируйте репозиторий devplanet:

git clone https://github.com/johnolafenwa/devplanet

Вы найдете файлы в samples / docker / intro.

app.py

requirements.txt

flask

Dockerfile

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

FROM python:3.6-slim

Каждый файл докеров начинается с ключевого слова FROM, за которым следует имя нашего базового образа. Здесь мы используем базовое изображение python: 3.6-slim. Этот образ содержит зависимости, необходимые для запуска python 3.6. В следующих главах мы узнаем, как создавать собственные базовые изображения.

WORKDIR /app

Эта команда создает каталог / приложение в нашем контейнере и устанавливает его в качестве текущего рабочего каталога.

COPY . /app

Команда COPY копирует все в текущий каталог, обозначенный как «.» в каталог / app внутри контейнера. По сути, это копирует наши app.py, requirements.txt и Dockerfile в каталог / app контейнера.

RUN pip3 install requirements.txt

Команда RUN предшествует всем инструкциям, которые необходимо выполнить в контейнере. Он действует как оболочка bash или powershell, через которую вы можете запускать команды в контейнере. Здесь мы просто устанавливаем все пакеты pip, указанные в файле requirements.txt, который был скопирован в каталог / app.

EXPOSE 5000

Поскольку наше веб-приложение работает на порте 5000 в контейнере, мы используем команду EXPOSE, чтобы сделать его доступным за пределами контейнера.

CMD [“python3”,”app.py”]

Точкой выполнения контейнера докеров является команда CMD. В вашем файле докеров может быть только одна команда CMD. Здесь мы выполняем app.py, запуская наше веб-приложение.

Объяснив это, мы теперь создадим наш образ докера.

sudo docker build -t myapp .

В Windows опустите команду sudo, так как она специфична для Linux.

Здесь команда docker build отвечает за создание образа вашего приложения в соответствии с инструкциями, которые вы указали в файле Dockerfile. Здесь -t myapp указывает, что сгенерированное изображение приложения должно быть помечено как myapp, вы можете использовать любой тег, который хотите. Также «.» помогает докеру искать Dockerfile в текущем каталоге.

Убедитесь, что эта команда запускается в том же каталоге, где находятся ваш app.py и другие файлы.

Теперь ваша сборка завершена, вы можете просмотреть созданные образы докеров с помощью команды

sudo docker image ls

Это покажет все образы докеров, которые вы создали или скачали.

Запуск вашего приложения Docker

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

sudo docker run -p 80:5000 myapp

Чтобы сломать это, команда run запускает ваше приложение, -p 80: 5000 сопоставляет порт 80 вашей хост-системы с портом 5000 в контейнере. Обратите внимание, что наше приложение Flask работает на порту 5000, который мы предоставили в нашем Dockerfile. При запуске мы можем выбрать запуск на любом другом порту с помощью шаблона сопоставления портов, приведенного выше.

Опять же, это идеально согласуется с принципом привязки портов двенадцати факторов. https://12factor.net/port-binding

Теперь откройте в браузере localhost: 80 и просмотрите результат.

Вот и все!

Теперь ты, может быть, думаешь.

Но не так быстро. Ваше приложение, отображающее «Hello From Flask», работает полностью изолированно, даже если вы удалите python из своей системы, это не имеет к этому никакого отношения. Опять же, это самодостаточный и самодостаточный пакет, который готов к развертыванию и запуску на любом сервере в помещении или в облаке, независимо от того, что установлено на целевом сервере. Таким образом вы можете создавать и упаковывать даже самые сложные приложения.

Образ Docker против контейнера Docker

В некоторых случаях вы могли запутаться в словах изображение и контейнер, что совершенно нормально, случается со всеми. Когда вы запускали «docker build», то, что было создано с именем myapp, называется изображением. Однако, когда вы запускали «docker run», из вашего образа был создан контейнер. Контейнер - это просто экземпляр изображения. Изображение аналогично классу в объектно-ориентированном программировании, в то время как контейнер аналогичен объекту.

У вас может быть одновременно запущено несколько контейнеров, так же как у вас может быть несколько объектов одного класса.

Развертывание образа Docker

Образы Docker распространяются и развертываются через реестры контейнеров, аналогичные git. Docker Hub похож на Github мира докеров, где вы можете отправлять свои изображения в частные и общедоступные репозитории, а также извлекать образы, созданные другими. Базовый образ python: 3.6-slim, который мы использовали в нашем приложении ранее, был извлечен из концентратора докеров при первом запуске сборки.

Первый шаг, перейдите в Docker Hub,



Создайте свою учетную запись и создайте новый репозиторий для своего приложения.

В этом случае вы можете просто назвать свое репо myapp, следовательно, как и в Github, ваше репо будет username / myapp.

С именем пользователя, замененным вашим фактическим именем пользователя

Затем в вашей системе войдите в Docker через командную строку.

Запустить

sudo docker login

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

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

Отметьте свое изображение

Во время сборки мы пометили наш образ как myapp, чтобы отправить образ в Docker Hub, вам нужно пометить его как username / myapp, вы можете сделать это вот так.

sudo docker tag my app username/myapp

Обратите внимание, что во избежание повторной маркировки после сборки в следующий раз вам следует использовать

sudo docker build -t username/myapp .

Продвиньте свое изображение

Наконец, запустите docker push

sudo docker push username/myapp

По завершении отправки ваше приложение будет успешно опубликовано в Docker Hub.

Запуск вашего приложения Docker на серверах

Теперь, когда ваше приложение опубликовано, вы можете запустить его на любом сервере.

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

Шаг 1:

Установите докер, как показано на предыдущих шагах. На сервере Linux это означает выполнение:

sudo apt-get update
sudo apt-get install curl
curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh

Шаг 2:

Войти в докер

sudo docker login

Шаг 3:

Вытащите свой образ докера. (Толкай и тяни, как Git)

sudo docker pull username/myapp

Наконец-то:

Запустите ваше приложение

sudo docker run -p 80:5000 username/myapp

Ваше приложение будет вести себя точно так же, как и в вашей системе разработки.

Заключение

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

Если вам понравилась эта статья, вы можете хлопнуть в ладоши и поделиться ею в твиттере.

Вы всегда можете связаться со мной по @johnolafenwa

Прочтите Часть 2 из серии Здесь.