Мониторинг докер-хостов, контейнеров и контейнерных служб

Добавление контейнера MySQL

Как и многие другие продукты и услуги, MySQL имеет общедоступные образы контейнеров, доступные в реестре Docker. Как и мой собственный контейнер Микроблог, MySQL полагается на переменные среды, которые должны быть переданы в . Это настройки типа пароля, имени базы данных и т.д. Не смотря на то, что есть много образов MySQL в реестре, я решил использовать тот, который официально поддерживается командой MySQL. Вы можете найти подробную информацию об образе контейнера MySQL на его странице реестра: https://hub.docker.com/r/mysql/mysql-server/.

Если вы помните трудоемкий процесс настройки MySQL в главе 17, то вы оцените Docker, увидев, как легко развернуть MySQL. Вот команда , которая запускает сервер MySQL:

Вот и все! На любой машине, на которой установлен Docker, вы можете выполнить приведенную выше команду и получить полностью установленный сервер MySQL со случайно сгенерированным паролем root, совершенно новую базу данных под названием и пользователя с тем же именем и настройками полного доступа к базе данных

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

Теперь на стороне приложения, как и для традиционного развертывания на Ubuntu, мне нужно добавить клиентский пакет MySQL. Я снова буду использовать , который я могу добавить в Dockerfile:

При каждом изменении приложения или файла Dockerfile образ контейнера необходимо перестроить:

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

Параметр указывает Docker сделать еще один контейнер доступным. Аргумент содержит два имени, разделенных двоеточием. Первая часть-это имя или идентификатор контейнера для связи, в данном случае , который я создал выше. Вторая часть определяет имя хоста, которое может использоваться в этом контейнере для ссылок (link-ов). Здесь я использую в качестве универсального имени, которое представляет сервер баз данных.

Когда связь между двумя контейнерами установлена, я могу установить переменную окружения , для направления SQLAlchemy на использование базы данных MySQL в другом контейнере. URL-адрес базы данных будет использовать -в качестве имени хоста базы данных, -как имена базы данных и пользователя, и -который вы выбрали при запуске MySQL.

Я заметил одну особенность, когда экспериментировал с контейнером MySQL, которая заключается в том, что запуск этого контейнера занимает несколько секунд до готовности принять соединения с базой данных. Если вы запустите подряд контейнер MySQL и контейнер приложения сразу после попытки скрипта boot.sh запустить может произойти сбой из-за того, что база данных не готова принимать подключения. Чтобы сделать мое решение более надежным, я решил добавить цикл повтора в boot.sh:

Этот цикл проверки кода выхода команды , и если он не равен нулю, значит, что что-то пошло не так, поэтому он делает паузу пять секунд, а затем повторяет попытку.

Платформы для хостинга контейнеров

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

Своё железо (bare metal)

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

Облачные решения (SaaS)

Крупные облачные провайдеры предоставляют своим клиентам сервисы для запуска контейнеров — готовые среды, обёрнутые удобным интерфейсом управления. Построенные по такому принципу решения называются Software as a Service (SaaS). Они не требуют никаких капитальных затрат, поскольку вся инфраструктура арендуется, а конфигурация создаётся в минимальном объёме, относящемуся исключительно к запускаемому приложению. Сами же кластеры настраиваются провайдером по указанному пользователем небольшому объему параметров. SaaS-решения — оптимальный вариант для стартап-компаний, небольших и развивающихся проектов. Самым большим минусом этого решения можно назвать повышенную в сравнении с bare metal стоимость при условии многолетнего использования.

Тремя наиболее популярными облачными платформами на сегодня являются Amazon Web Services, Microsoft Azure и Google Cloud. Все три провайдера имеют доступный в виде сервиса Kubernetes, и все три из них предлагают пробный период пользования сервисами, выдавая депозит на сумму 200–300 $. Чтобы оценить удобство и качество облачных решений и сравнить друг с другом их поставщиков, вам даже не придется тратить свои деньги.

Быстрое выкладывание ваших приложений

Docker прекрасно подходит для организации цикла разработки. Docker позволяет разработчикам использовать локальные контейнеры с приложениями и сервисами. Что в последствии позволяет интегрироваться с процессом постоянной интеграции и выкладывания (continuous integration and deployment workflow).

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

На что это похоже?

Контейнер

Обычный контейнер

Как и обычный пластиковый контейнер, Docker-контейнер обладает следующими характеристиками:

  1. Хранит вещи.
  2. Портативен — вы можете пользоваться им и на вашем компьютере, и на компьютере коллеги, и в облачных сервисах, таких как Amazon Web Services.
  3. Имеет удобный интерфейс — у нашего пластикового контейнера есть крышка, разделяющая вещи внутри него и снаружи. У Docker’а точно так же есть некоторые механизмы, позволяющие взаимодействовать с внешним миром. У него есть порты для взаимодействия через браузер. Вы можете настроить его для работы с данными через консоль.
  4. Может быть создан повторно — вы можете взять другой пустой пластиковый контейнер, если он вам понадобится, поскольку есть фабрики, которые выпускают их тысячами. В случае с Docker-контейнером сервисы и пользователи хранят образы контейнеров, которые позволяют быстро развернуть необходимую среду.

ПО

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

Пока Docker-контейнер работает, действует некая программа, запущенная внутри него. Например, код в Docker может отправлять вам содержимое страницы, которую вы просматриваете прямо сейчас. Или брать вашу голосовую команду для Amazon Alexa и декодировать её, чтобы использовать в другой программе в другом Docker.

Интенсив «Мессенджер на Python за 3 дня»

7–9 сентября, онлайн, беcплатно

tproger.ru

События и курсы на tproger.ru

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

Запуск контейнера

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

Параметр предоставляет имя для нового контейнера. Параметр указывает Docker запускать контейнер в фоновом режиме. Без ключа контейнер выполняется как приложение переднего плана, блокируя командную строку. Параметр сопоставляет порты контейнера с портами хоста. Первый порт-это порт на хост-компьютере, а порт справа-это порт внутри контейнера. Приведенный выше пример предоставляет порт 5000 в контейнере на порту 8000 в узле, таким образом, вы будете обращаться к приложению на 8000, даже при том, что внутренне контейнер использует 5000. Параметр удаляет контейнер после его завершения. Хотя это не требуется, контейнеры, которые заканчиваются или прерываются, обычно больше не нужны, поэтому их можно автоматически удалить. Последним аргументом является имя образа контейнера и тег, используемый для контейнера. После выполнения приведенной выше команды, вы можете получить доступ к приложению на http://localhost:8000.

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

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

Как видите, даже команда сокращает идентификаторы контейнеров. Если теперь необходимо остановить контейнер, используйте :

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

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

Таким образом, переменные среды build-time могут быть полезны, но также необходимо иметь переменные среды run-time, которые можно задать с помощью команды , и для этих переменных используется ключ . Следующий пример задает secret-key и электронную почту для аккаунта Gmail:

Такая длина для в командной строке не редкость из-за наличия множества определений переменных среды.

Собственный DinD контейнер и новые эксперименты

Чтобы не повторять вышеописанные шаги снова и снова я создал собственный DinD контейнер:

Рабочее DinD решение дало мне возможность запускать Докер внутри Докера рекурсивно и проводить более смелые эксперименты.
Один такой (удачный) эксперимент с запуском MySQL и Nodejs я собираюсь сейчас описать.
Самые нетерпеливые могут посмотреть как это было здесь

Итак, начнем:

Запускаем DinD в интерактивном режиме. В данной версии DinD нам нужно вручную замапить все порты которые могут использовать наши дочерние контейнеры (я над этим уже работаю)

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

Запускаем MySQL:

Подключаемся к базе данных так же как мы бы подключались к ней локально

Убеждаемся что все работает.

Запускаем второй контейнер:

Обратите внимание, что порт мапинг здесь будет именно 8080:8080, так как мы уже замапили порт 80 из хоста в родительский контейнер на порт 8080.

Идем на localhost в браузере, убеждаемся что сервер отвечает «Hello World!».

В моем случае эксперимент с вложенными Докер контейнерами оказался довольно положительным и я продолжу развивать проект и использовать его для стейджинга. Мне кажется, что это гораздо более легковесное решение чем тот же Kubernetes и Jenkins X. Но это мое субъективное мнение.

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

P.S. Если вы считаете данный проект полезным, то пожалуйста поставьте ему звездочку на ГитХабе, сделайте форк и расскажите друзьям.

Edit1 Исправил ошибки, сделал фокус на 2 видео

Суть и возможности Docker

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

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


Грузовые контейнеры в морском порту. Источник

Так и Docker позволяет операционной системе запускать программы изолированно друг от друга — каждую в собственном окружении. Основа его работы — функции linux namespaces, благодаря которым можно виртуализировать и изолировать ресурсы системы. Сегодня уже существуют версии Docker для Windows и macOS. Несмотря на то что лежащие в основе Docker технологии придумали давно, именно он стал идеальной реализацией для решения сложных задач разработки.

Docker — программное обеспечение с открытым исходным кодом на базе Linux, но есть два варианта: бесплатное решение для свободного пользования и платное для корпоративного сегмента.

Docker — это не только для админов

Теперь немножко вольных аналогий для фронтенд-разработчиков, чтобы показать, что этот инструмент имеет много общего с привычными для нас, фронтендеров, вещами, такими как Node.js и NPM.

Не путать с другим популярным хабом. Это реестр docker-образов. У нас есть свой реестр — .

Проект начат как проприетарная разработка

Проект Docker начат в 2008 году как внутренняя собственническая разработка компании dotCloud и лишь в марте 2013 был опубликован в open source.

У нас есть Node.js, который хоть и был изначально open source, но до февраля 2015 года и скандальной истории с io.js находился под управлением компании Joyent.

Используется для всего подряд

Все мы знаем, что NPM — это Node Package Manager. Раньше так и было, но сейчас там лежат пакеты не только для Node.js, но и для браузера.

А ещё там могут лежать не пакеты. При желании туда можно положить набор шрифтов или даже фильм.

Тоже самое с DockerHub. Туда можно опубликовать что угодно. Никакой премодерации нет.

#10. docker volume ls — список томов

Данная команда показывает список томов, которые являются основным механизмом для хранения данных, генерируемых контейнерами Docker.

С остальными командами ты можешь ознакомиться в документации по Docker https://docs.docker.com/engine/reference/commandline/docker/.

Популярные услуги

Услуги Iaas Paas Saas
Облачные технологии внедряются в разные сфера бизнеса. Они позволяют сэкономить деньги на покупке софта, компьютеров, модернизации ИТ-инфраструктуры предприятия.

Размещение серверов (colocation)
Дата-центр Xelent — все условия для размещения отдельных серверов и для аренды автономных ячеек под готовый к эксплуатации корпоративный ЦОД или удалённую точку присутствия оператора связи.

Аренда сервера для 1С
Аренда сервера для 1С — это реальный шанс для средних и крупных организаций сэкономить на приобретении и поддержке ПО.

Загрузка образов Docker из удалённого реестра

Docker Hub

Docker Hub — это служба Docker для нахождения и совместного использования образов контейнеров.

Если вы хотите извлечь оттуда образы для локального реестра, то это так же просто, как выполнение команды , сопровождаемой путём образа. Нижеприведённая команда демонстрирует извлечение и запуск стабильной версии образа R Rocker.

Docker сперва проверит, доступен ли этот образ на вашей локальной машине. Если нет, он приступит к его загрузке с репозитория Docker Hub. Такое поведение предусмотрено изначально.

Если вы хотите просто извлечь образ и не запускать контейнер, тогда подойдёт команда .

Для входа на Docker Hub вы можете запустить вышеприведённую команду, которая предложит ввести пароль.

Пользовательский реестр Docker

Если вы извлекаете образ из обобщённого пользовательского реестра Docker, требующего авторизацию, то команда позволят произвести извлечение из любого реестра Docker, как показано выше. Имейте в виду, что при использовании приведённого подхода, будет создана запись в файле . Присоедините для изменения деталей авторизации.

Реестр Elastic-контейнеров Amazon

Реестр Elastic-контейнеров (ECS) —  это полноценно поддерживаемый реестр контейнеров Docker, позволяющий разработчикам хранить, поддерживать и разворачивать образы контейнеров Docker. Amazon ECS отлично работает с Amazon ECR. Если вам вдруг понадобится извлечь образы из реестра ECR, следуйте следующим инструкциям.

Вам нужно настроить AWS CLI так, чтобы пользователь IAM имел доступ к AWS и секретный ключ. 

Amazon ECR требует, чтобы ключи пользователя IAM имели разрешения () через политику IAM, только тогда вы сможете авторизоваться и извлечь образы. В качестве альтернативы вы можете использовать утилиту Amazon ECR Docker Credential Helper. Ниже представлен подход, предполагающий использование вами AWS CLI и корректную настройку всех разрешений.

Команда генерирует длинную команду входа Docker. Скопируйте её и выполните. Авторизация необходима, чтобы получить возможность извлекать образы из AWS ECR.

Экспорт и импорт физических образов Docker

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

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

Всех вам благ и удачного кодинга!

Сканируем образы Docker на уязвимости
Docker для разработки Go с горячей перезагрузкой
Почему вы должны обратить внимание на Docker?

Перевод статьи Timothy Mugayi: The Ultimate Docker Command List.

Сборка нового образа

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

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

mkdir -p /opt/docker/mynginx

* где /opt/docker/mynginx — полный путь до каталога, где будем создавать образ.

… переходим в данный каталог:

cd /opt/docker/mynginx

… и создаем Dockerfile:

vi Dockerfile

FROM centos:7
MAINTAINER Dmitriy Mosk <master@dmosk.ru>
RUN yum install -y epel-release && yum install -y nginx
RUN yum clean all
RUN echo «daemon off;» >> /etc/nginx/nginx.conf
RUN sed -i «0,/nginx/s/nginx/docker-nginx/i» /usr/share/nginx/html/index.html
CMD

* в данном файле мы:

  1. используем базовый образ centos 7;
  2. в качестве автора образа указываем Dmitriy Mosk;
  3. устанавливаем epel-release и nginx;
  4. чистим систему от метаданных и кэша пакетов после установки;
  5. указываем nginx запускаться на переднем плане (daemon off); 
  6. в индексном файле меняем первое вхождение nginx на docker-nginx;
  7. запускаем nginx.

* подробное описание инструкций Dockerfile смотрите .

Запускаем сборку:

docker build -t dmosk/nginx:v1 .

* где dmosk — имя автора; nginx — название для сборки; v1 — тег с указанием версии. Точка на конце указывает, что поиск Dockerfile выполняем в текущей директории.

… начнется процесс сборки образа — после его завершения мы должны увидеть что-то на подобие:

Successfully built eae801eaeff2
Successfully tagged dmosk/nginx:v1

Посмотреть список образов можно командой:

docker images

Создаем и запускаем контейнер из образа:

docker run -d -p 8080:80 dmosk/nginx:v1

* в данном примере мы запустим контейнер из образа dmosk/nginx:v1 и укажем, что необходимо опубликовать внешний порт 8080, который будет перенаправлять трафик на порт 80 внутри контейнера.

Открываем браузер и переходим по адресу http://<IP-адрес нашего докера>:8080 — мы должны увидеть страницу приветствия с нашим docker-nginx:

Посмотреть созданные контейнеры можно командой:

docker ps -a

Запустить или остановить контейнеры можно командами:

docker stop 5fe78aca2e1d

docker start 5fe78aca2e1d

* где 5fe78aca2e1d — идентификатор контейнера.

#3. docker build — собирает образ

Данная команда собирает образ Docker из файла докера (dockerfile) и контекста сборки. Контекст сборки — это набор файлов, расположенных по определенному пути. Для задания имени образа используйте параметр -t, например, «docker build -t my.». Собирает образ из текущего каталога (».«) — последний параметр это имя каталога, в нашем случае точка указывает, что каталог — текущий.

Если облака для вас
не просто теория

Широкий спектр услуг
по выделенным северам
и мультиклауд-решениям

Конфигурация VPS и бесплатный тест уже через 2 минуты

Сконфигурировать VPS

Организация вашей IT-инфраструктуры на основе мультиклауд-решения

Запросить КП

Преимущества и недостатки

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

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

Плюсы Docker

  1. Абстрагирование приложения. Приложение в контейнере не зависит от архитектуры или ресурсов хоста.
  2. Быстрота и простота масштабирования. Если приложение грамотно спроектировано, то масштабирование становится очень прямолинейным и легким для разработчиков процессом.
  3. Простота контроля версий и управления зависимостями. Вы можете соединить свое приложение со всеми зависимостями и работать с ним как с одним целым. Зависимости содержатся в одном контейнере, и хост-системы больше не отвечают за управление ими.
  4. Изолированная среда. Уровень изолированности не сравнится с виртуализацией, однако благодаря легкой среде выполнения можно мгновенно запускать приложения в любом количестве контейнеров.

У инструмента есть недостатки, перечислим их:

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

Однако плюсы применения Docker в проектах с лихвой перекрывают все это.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *