fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Самоучитель по докеру: Начало работы с нуля

Самоучитель по докеру: Начало работы с нуля

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

Контейнеризация – это технология, которая существует уже давно, но благодаря Docker она обрела новую жизнь. Он упаковывает приложения в образы, содержащие все необходимое для их запуска: код, среду выполнения, библиотеки и конфигурацию. Образы запускаются в контейнерах, которые представляют собой дискретные процессы, занимающие столько же ресурсов, сколько и любой другой исполняемый файл.

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

Однако для работы Docker требуется среда выполнения Linux. Реализации на не-Linux платформах, таких как macOS и Windows 10, используют одну виртуальную машину Linux. Контейнеры используют эту систему совместно.

Контейнеризация получила широкое распространение благодаря следующим преимуществам

  • Согласованная тестовая среда для разработки и QA.
  • Кросс-платформенные пакеты, называемые образами.
  • Изоляция и инкапсуляция зависимостей приложений.
  • Способность эффективно, легко и в реальном времени масштабироваться.
  • Повышение эффективности за счет простого повторного использования образов.

Мы рассмотрим эти базовые понятия в процессе установки инструментов Docker, создания образов и контейнеров.

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

вывод docker p s-a с 2 контейнерами

Начало работы с Docker

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

Попробуйте бесплатный профилировщик кода Prefix от Stackify, чтобы писать более качественный код на вашей рабочей станции. Prefix работает с .NET, Java, PHP, Node.js, Ruby и Python.

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

После установки инструментов мы можем запустить образ Docker:

docker run hello-world делает именно то, что звучит. Он запускает образ с именем “hello-world”.

Docker ищет этот образ в нашей локальной системе. Если он не может найти образ, Docker загружает его из Docker Hub.

Hello-world выводит сообщение о том, что все работает. Затем он объясняет нам суть процесса и рекомендует некоторые дополнительные шаги.

Под обложкой

Давайте посмотрим еще на несколько команд Docker, которые расскажут нам больше об окружающей среде.

docker p s-a выводит список контейнеров в нашей системе:

вывод из контейнера Ubuntu

Отсюда видно, что контейнер hello-world все еще находится в памяти. Колонка status говорит нам о том, что он вышел из системы. В столбце names есть имя kind_bose, которое Docker присвоил контейнеру для нас. Мы рассмотрим имена контейнеров ниже.

Давайте снова запустим этот образ с помощью docker run hello-world. Результат почти такой же…

…только на этот раз мы не видим информации о загрузке образа. Он уже был доступен в нашей системе.

Но что же теперь показывает нам docker p s-a?

Контейнер Ubuntu

Мы видим два остановленных экземпляра hello-world с двумя разными именами. Docker создал дополнительный контейнер. Он не использовал первый. Когда мы сказали Docker запустить образ с именем hello-world, он сделал именно это; он запустил новый экземпляр образа. Если мы хотим повторно использовать контейнер, мы обращаемся к нему по имени.

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

Давайте попробуем запустить один из остановленных контейнеров:

На этот раз мы использовали команду docker star t-attach вместо docker run . Мы используем команду start, и вместо того, чтобы называть образ, мы указываем имя уже загруженного контейнера. Парамет р-attach указывает Docker на подключение к выходу контейнера, чтобы мы могли видеть результаты.

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

Если мы снова проверим docker ps, то по-прежнему увидим два контейнера.

Давайте запустим контейнер, который не завершает работу немедленно. Инструкции Hello-world дали нам интересный пример:

С помощью одной команды Docker, docker ru n-it ubuntu bash, мы загрузили образ Ubuntu Linux и запустили в нем оболочку входа в систему от имени root. Флаг и-it позволяют нам взаимодействовать с оболочкой.

Когда мы открываем другое окно и выводим список контейнеров, мы видим другую картину:

список контейнеров docker

Статус контейнера Ubuntu – Up . Давайте посмотрим, что происходит внутри:

docker top заглядывает внутрь контейнера и показывает нам запущенные процессы. В контейнере Ubuntu запущен один процесс – корневая оболочка.

Давайте посмотрим на последнюю команду Docker перед созданием собственного контейнера:

Docker image ls выдает список образов в нашей системе. Мы видим Ubuntu и единственный образ hello-world, поскольку нам нужен только один образ для запуска двух контейнеров.

Совместное использование системных ресурсов с контейнером

До сих пор мы запускали несколько автономных образов. Что произойдет, если мы захотим поделиться с контейнером локальными ресурсами нашей хост-системы? В Docker предусмотрена возможность совместного использования контейнерами файловой системы и сетевого стека.

Давайте создадим веб-сервер, который будет обслуживать веб-страницу из локальной файловой системы. Мы будем использовать публичный образ Nginx.

Во-первых, нам нужен HTML-файл, который будет отображаться при подключении к веб-серверу. Начните с пустого каталога, который мы назовем my-nginx, и создайте один подкаталог с именем html . Внутри html создайте файл index.html:

Hello, World!

Мы готовы к работе. Вот наша командная строка:

При выполнении этой командной строки мы видим, как Docker загружает образ Nginx, а затем запускает контейнер.

Для запуска контейнера мы использовали четыре параметра командной строки:

  • -v /full/path/to/html/directory:/usr/share/nginx/html:ro сопоставляет каталог, содержащий нашу веб-страницу, с нужным местом в образе. Поле ro указывает Docker монтировать его в режиме только для чтения. Лучше всего передавать Docker полные пути при указании каталогов хостов.
  • -p 8080:80 сопоставляет порт сетевой службы 80 в контейнере с портом 8080 на нашей хост-системе.
  • -d отсоединяет контейнер от нашей сессии командной строки. В отличие от двух предыдущих примеров, мы не хотим взаимодействовать с этим контейнером.
  • nginx – это имя образа.

После выполнения этой команды мы должны получить доступ к веб-серверу на порту 8080:

Мы видим нашу тестовую страницу! Вы также можете получить доступ к странице с наших устройств в вашей сети, используя IP-адрес вашей хост-системы.

Когда мы запустили образ Nginx, нам нужно было указать ему, где взять веб-файлы. Мы сделали это, смонтировав каталог на нашей хост-системе в каталог внутри контейнера, переопределив файлы, которые уже находятся внутри образа. Docker также поддерживает тома, которые могут содержать файловые системы и быть общими для контейнеров.

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

Это упражнение иллюстрирует одно из ключевых преимуществ Docker: простое повторное использование существующих ресурсов. Мы смогли создать веб-сервер за несколько минут практически без конфигурации.

Остановка и удаление контейнера

Наш веб-сервер все еще работает:

Веб-страница Python в Chrome

Мы можем остановить его с помощью docker stop …

…и удалить контейнер с помощью docker rm.

После выполнения этих двух команд контейнер исчезнет:

веб-страница с различными приветствиями

Создание образа Docker

Теперь давайте на основе этого примера создадим собственный образ. Мы упакуем образ Nginx с нашим html-файлом.

Образы создаются с помощью Dockerfile, в котором перечислены компоненты и команды, составляющие образ.

В папке my-nginx создайте Dockerfile:

Этот Dockerfile содержит две инструкции:

  1. Во-первых, создайте этот образ из существующего образа, который называется nginx. Инструкция FROM является обязательной для всех Dockerфайлов и устанавливает базовый образ. Последующие инструкции выполняются на базовом образе.
  2. Вторая инструкция, COPY, указывает Docker скопировать наше дерево файлов в базовый образ, переопределяя содержимое /usr/share/nginx/html в базовом образе.

Далее выполните сборку образа:

Мы передали два аргумента для сборки:

  • -t mynginx задал Docker тег для образа. Поскольку мы передали только имя, мы видим, что Docker пометил эту сборку как последнюю в последней строке вывода сборки. Более подробно мы рассмотрим теги ниже.
  • Последний аргумент, точка ( или “.”), говорит Docker искать Dockerfile в текущем рабочем каталоге.

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

В списке образов мы видим mynginx:

Запуск пользовательского образа

Далее мы запускаем наш новый образ:

Давайте разберем эту команду на части.

  • -name foo дает контейнеру имя, а не одно из случайно присвоенных имен, которые мы видели до сих пор.
  • -d отделяется от контейнера, запуская его в фоновом режиме, как мы это делали при предыдущем запуске Nginx.
  • -p 8080:80 сопоставляет сетевые порты, как мы делали в первом примере.
  • Наконец, имя образа всегда стоит последним.

Теперь направьте браузер на , и вы снова увидите тестовую веб-страницу.

Пока веб-сервер работает, давайте посмотрим на docker ps :

Мы видим, что в столбце ports отображается связка, которую мы использовали для запуска контейнера, а names отображает имя контейнера, которое мы использовали.

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

Создание более настраиваемого образа

Каждый образ Docker при запуске выполняет определенную команду. В нашем Dockerfile для Nginx мы не указали команду, поэтому Docker использовал команду, указанную в базовом образе.

Давайте

Этот Dockerfile начинается с образа, содержащего среду выполнения Python. Из названия видно, что он предоставляет версию 2.7 в тонкой конфигурации, содержащей минимальное количество пакетов Python.

Далее он создает WORKDIR (рабочий каталог) с именем /app и добавляет в него текущий рабочий каталог.

После добавления скрипта в образ нам нужно установить пакет Flask Python, библиотеку, которую мы используем для веб-сервера. Для этого инструкция RUN выполняет команду pip install. Dockerfiles может выполнять команды как часть процесса сборки образа.

Далее устанавливается переменная окружения NAME, которая используется в HTML-странице, возвращаемой app.py.

И наконец, Dockerfile задает команду, которая будет выполняться при запуске образа. CMD принимает команду и список аргументов для передачи команде. Этот образ запускает интерпретатор Python, передавая ему app.py .

Давайте соберем этот образ:

Запуск нашего образа Python

Давайте снова перейдем на 8080 с помощью браузера:

Мы видим нашу новую веб-страницу. Мы создали еще один портативный веб-сервер с помощью всего нескольких строк Python!

Передача переменных окружения

Наш Dockerfile задал переменную окружения…

…которую сценарий Python использует в этом приветствии:

Затем снова посмотрите на веб-страницу:

Поделиться образом

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

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

Первым шагом будет создание учетной записи на Docker Cloud. Если у вас еще нет учетной записи, перейдите и создайте ее.

Далее мы войдем в реестр Docker:

Перед загрузкой mypyweb в Docker Hub его необходимо пометить. Формат тегов Docker – имя пользователя/репозиторий:тег. Теги и имена хранилищ являются фактически свободной формой.

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

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

Теперь мы можем отправить образ в Docker Hub:

docker push принимает имя тега и отправляет его в репозиторий по умолчанию, которым является Docker Hub.

Теперь, если мы посетим наш аккаунт на hub.docker.com, мы увидим новый репозиторий, образ и тег:

Если вы присмотритесь, то заметите несоответствие размеров. Это потому, что образ на Docker Hub содержит только изменения из образа Python:2.7-slim, на котором он основан.

Мы можем извлечь образ Docker и запустить его с любой системы:

Это результат запуска на системе, отличной от первоначально собранной. Аналогично тому, как мы запускали hello-world, мы передали тег image в docker run. И поскольку образ не был доступен локально, Docker взял его из Docker Hub и Python:2.7-slim, собрал образ и запустил его.

Мы опубликовали образ, и теперь он общедоступен на Docker Hub.

Заключение

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

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

Однако вам не обязательно делать это в одиночку. Всем супергероям нужен помощник, и разработчики не являются исключением. Компания Stackify by Netreo прилагает все усилия, чтобы разработчики получали всю необходимую помощь. Мы разработали такие инструменты, как Prefix, который помогает вам писать более качественный код путем профилирования и тестирования в процессе написания. Если вам нужен контроль качества для крупных моментов, используйте Retrace, который поможет вам проактивно и постоянно улучшать и наблюдать за работой приложений в производственных средах.

Не уверены, что вам нужна помощь? Эй, нет смелости – нет славы, верно? Попробуйте бесплатно в течение 14 дней!

Об Эрике Гебельбекере

Эрик Гебельбекер 25 лет проработал на финансовых рынках в Нью-Йорке, разрабатывая инфраструктуру для рыночных данных и сетей протокола обмена финансовой информацией (FIX). Он любит говорить о том, что делает команды эффективными (или не очень эффективными!).

Попробуйте сегодня бесплатно

вывод изображения docker hello-world

вывод изображения docker p s-a

вывод изображения docker hello world

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

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