Введение в докер. Разработка простого докер образа для собственного сервера.
- Chapter I
- Chapter II
2.1. nginx
2.2. Docker
2.3. Dockle - Chapter III
3.1. Готовый докер
3.2. Операции с контейнером
3.3. Мини веб-сервер
3.4. Свой докер
3.5. Dockle
3.6. Базовый Docker Compose
Планета Земля, Атлантический океан, Корабль Её Величества "Hood", курс на город Лондон, Великобритания, наши дни.
Вам никогда не нравилось переезжать. Много суматохи, мало дела. Но что поделаешь, на туманном Альбионе удалось найти отличную вакансию, чтобы углубиться в мир DevOps’а. И вы не из тех, кто позволяет мелким трудностям испортить планы.
Пока из-за окна каюты слышится шум морских волн, и вас мирно покачивает на волнах, вы вспоминаете ваш любимый роман о море – “Моби Дик”. И хотя течение сюжета в романе далеко не прямолинейно, он переполнен лирическими отступлениями и философскими размышлениям, все же вы, как и любой другой, в первую очередь ассоциируете эту книгу именно с самим Моби Диком – белым китом.
“Хм... Белый кит...” – тут вы вспоминаете, что во время длительного путешествия собирались не терять время зря и познакомиться с докером.
nginx (произносится как "engine-x") - это обратный прокси-сервер с открытым исходным кодом для протоколов HTTP, HTTPS и т.д. nginx также используется, как балансировщик нагрузки, веб-сервер и для кеширования HTTP. В проекте nginx уделяется особое внимание высокому параллелизму, высокой производительности и низкому использованию памяти.
У nginx есть один главный и несколько рабочих процессов. Основная задача главного процесса — чтение и проверка конфигурации и управление рабочими процессами. Рабочие процессы выполняют фактическую обработку запросов.
Как работают nginx и его модули, определяется в конфигурационном файле. По умолчанию, конфигурационный файл называется nginx.conf
Контейнер – новый "исполняемый файл", включающий в себя все необходимые продукту зависимости.
Главное преимущество контейнеризации – изоляция зависимостей и единая простая точка запуска ПО.
Основные понятия:
- Докер образ – "упаковка" для приложения и зависимостей (в том числе системных).
- Контейнер – экземпляр образа, то есть "оживший" образ.
Docker — это платформа, которая предназначена для разработки, развёртывания и запуска приложений в контейнерах. Docker – «де-факто» стандарт инструмента контейнеризации в индустрии, но он не является первым или последним среди технологий контейнеризации.
Предшественниками контейнеров Docker были виртуальные машины. Виртуальная машина, как и контейнер, изолирует приложение и его зависимости от внешней среды. Однако контейнеры Docker обладают преимуществами перед виртуальными машинами. Так, они потребляют меньше ресурсов, их очень легко переносить, они быстрее запускаются и приходят в работоспособное состояние.
Докер образ состоит из слоев. Каждый слой описывает какое-то изменение, которое должно быть выполнено с данными на запущенном контейнере. Структура связей между слоями — иерархическая. Имеется базовый слой, на который «накладываются» остальные слои. Для создания образа используется Dockerfile. Каждая инструкция в нем создает новый слой.
Dockle — это инструмент для проверки безопасности образов контейнеров, который можно использовать для поиска уязвимостей.
Основные функции и преимущества Dockle:
- поиск уязвимостей в образах,
- помощь в создании правильного Dockerfile,
- простота в использовании, нужно указать только имя образа,
- поддержка CIS Benchmarks.
Docker Compose — это инструментальное средство, которое предназначено для решения задач, связанных с развёртыванием проектов. Docker Compose может пригодиться, если для обеспечения функционирования проекта используется несколько сервисов.
Docker Compose используется для одновременного управления несколькими контейнерами, входящими в состав приложения. Этот инструмент предлагает те же возможности, что и Docker, но позволяет работать с более сложными распределенными приложениями, например микросервисными.
В качестве результата работы по первым двум задачам должен быть предоставлен отчет. В каждой части задания указано, что должно быть помещено в отчёт, после её выполнения. Это могут быть ответы на вопросы, скриншоты и т.д.
В качестве результата работы по третьей задаче должны быть предоставлены исходные файлы для запуска веб-сервера.
В качестве результата работы по четвёртой и пятой задачам должны быть предоставлены докерфайлы.
В качестве результата работы по шестой задаче должен быть предоставлен файл docker-compose.yml и нужные для его запуска докерфайлы (если они не были предоставлены ранее).
- В репозиторий, в папку src, должен быть загружен отчёт с расширением .md.
- В отчёте должны быть выделены все части задания, как заголовки 2-го уровня.
- В рамках одной части задания всё, что помещается в отчёт, должно быть оформлено в виде списка.
- Каждый скриншот в отчёте должен быть кратко подписан (что показано на скриншоте).
- Все скриншоты обрезаны так, чтобы была видна только нужная часть экрана.
- На одном скриншоте допускается отображение сразу нескольких пунктов задания, но они все должны быть описаны в подписи к скриншоту.
- В репозиторий, в папку src/server, должны быть загружены исходные файлы для запуска веб-сервера из третьего задания.
- В репозиторий, в папку src, должны быть загружены итоговые докерфайлы для запуска образов из четвёртого и пятого заданий.
- В репозиторий, в папку src, должен быть загружен docker-compose.yml шестого задания.
- Необходимо быть готовым продемонстрировать решение вживую при необходимости.
В качестве конечной цели своей небольшой практики вы сразу выбрали написание докер образа для собственного веб сервера, а потому в начале вам нужно разобраться с уже готовым докер образом для сервера. Ваш выбор пал на довольно простой nginx.
== Задание ==
По выводу команды определить и поместить в отчёт размер контейнера, список замапленных портов и ip контейнера
Запустить докер с портами 80 и 443 в контейнере, замапленными на такие же порты на локальной машине, через команду run
- В отчёт поместить скрины:
- вызова и вывода всех использованных в этой части задания команд;
- стартовой страницы nginx по адресу localhost:80 (адрес должен быть виден).
Замечание: Не загружайте тяжелые файлы (>10 мб) в гит.
Докер образ и контейнер готовы. Теперь можно покопаться в конфигурации nginx и отобразить статус страницы.
== Задание ==
- В отчёт поместить скрины:
- вызова и вывода всех использованных в этой части задания команд;
- содержимое созданного файла nginx.conf;
- страницы со статусом сервера nginx по адресу localhost:80/status.
Настало время немного оторваться от докера, чтобы подготовиться к последнему этапу. Настало время написать свой сервер.
== Задание ==
Написать мини сервер на C и FastCgi, который будет возвращать простейшую страничку с надписью Hello World!
Теперь всё готово. Можно приступать к написанию докер образа для созданного сервера.
== Задание ==
При написании докер образа избегайте множественных вызовов команд RUN
1) собирает исходники мини сервера на FastCgi из Части 3
nginx можно установить внутрь докера самостоятельно, а можно воспользоваться готовым образом с nginx'ом, как базовым.
Запустить собранный докер образ с маппингом 81 порта на 80 на локальной машине и маппингом папки ./nginx внутрь контейнера по адресу, где лежат конфигурационные файлы nginx'а (см. Часть 2)
Дописать в ./nginx/nginx.conf проксирование странички /status, по которой надо отдавать статус сервера nginx
Если всё сделано верно, то, после сохранения файла и перезапуска контейнера, конфигурационный файл внутри докер образа должен обновиться самостоятельно без лишних действий
После написания образа никогда не будет лишним проверить его на безопасность.
== Задание ==
Вот вы и закончили вашу разминку. А хотя погодите... Почему бы не поэкспериментировать с развёртыванием проекта, состоящего сразу из нескольких докер образов?
== Задание ==
1) Поднять докер контейнер из Части 5 (он должен работать в локальной сети, т.е. не нужно использовать инструкцию EXPOSE и мапить порты на локальную машину)
2) Поднять докер контейнер с nginx, который будет проксировать все запросы с 8080 порта на 81 порт первого контейнера
💡 Нажми тут, чтобы поделиться с нами обратной связью на этот проект. Это анонимно и поможет команде Педаго сделать твоё обучение лучше.
