Skip to content

amanarbek/am_SimpleDocker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple Docker

Введение в докер. Разработка простого докер образа для собственного сервера.

  1. Chapter I
    1.1. nginx
    1.2. Docker
    1.3. Dockle
  2. Chapter II
    2.1. Готовый докер
    2.2. Операции с контейнером
    2.3. Мини веб-сервер
    2.4. Свой докер
    2.5. Dockle
    2.6. Базовый Docker Compose

Chapter I

nginx

nginx (произносится как "engine-x") - это обратный прокси-сервер с открытым исходным кодом для протоколов HTTP, HTTPS и т.д. nginx также используется, как балансировщик нагрузки, веб-сервер и для кеширования HTTP. В проекте nginx уделяется особое внимание высокому параллелизму, высокой производительности и низкому использованию памяти.

У nginx есть один главный и несколько рабочих процессов. Основная задача главного процесса — чтение и проверка конфигурации и управление рабочими процессами. Рабочие процессы выполняют фактическую обработку запросов.

Как работают nginx и его модули, определяется в конфигурационном файле. По умолчанию, конфигурационный файл называется nginx.conf

Docker

Контейнер – новый "исполняемый файл", включающий в себя все необходимые продукту зависимости.
Главное преимущество контейнеризации – изоляция зависимостей и единая простая точка запуска ПО.

Основные понятия:

  • Докер образ – "упаковка" для приложения и зависимостей (в том числе системных).
  • Контейнер – экземпляр образа, то есть "оживший" образ.

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

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

Докер образ состоит из слоев. Каждый слой описывает какое-то изменение, которое должно быть выполнено с данными на запущенном контейнере. Структура связей между слоями — иерархическая. Имеется базовый слой, на который «накладываются» остальные слои. Для создания образа используется Dockerfile. Каждая инструкция в нем создает новый слой.

Dockle

Dockle — это инструмент для проверки безопасности образов контейнеров, который можно использовать для поиска уязвимостей.

Основные функции и преимущества Dockle:

  • поиск уязвимостей в образах,
  • помощь в создании правильного Dockerfile,
  • простота в использовании, нужно указать только имя образа,
  • поддержка CIS Benchmarks.

Docker Compose

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

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

Chapter II

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

В качестве результата работы по третьей задаче должны быть предоставлены исходные файлы для запуска веб-сервера.

В качестве результата работы по четвёртой и пятой задачам должны быть предоставлены докерфайлы.

В качестве результата работы по шестой задаче должен быть предоставлен файл docker-compose.yml и нужные для его запуска докерфайлы (если они не были предоставлены ранее).

  • В репозиторий, в папку src, должен быть загружен отчёт с расширением .md.
  • В отчёте должны быть выделены все части задания, как заголовки 2-го уровня.
  • В рамках одной части задания всё, что помещается в отчёт, должно быть оформлено в виде списка.
  • Каждый скриншот в отчёте должен быть кратко подписан (что показано на скриншоте).
  • Все скриншоты обрезаны так, чтобы была видна только нужная часть экрана.
  • На одном скриншоте допускается отображение сразу нескольких пунктов задания, но они все должны быть описаны в подписи к скриншоту.
  • В репозиторий, в папку src/server, должны быть загружены исходные файлы для запуска веб-сервера из третьего задания.
  • В репозиторий, в папку src, должны быть загружены итоговые докерфайлы для запуска образов из четвёртого и пятого заданий.
  • В репозиторий, в папку src, должен быть загружен docker-compose.yml шестого задания.
  • Необходимо быть готовым продемонстрировать решение вживую при необходимости.

Part 1. Готовый докер

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

== Задание ==

Взять официальный докер образ с nginx и выкачать его при помощи docker pull
Проверить наличие докер образа через docker images
Запустить докер образ через docker run -d [image_id|repository]
Проверить, что образ запустился через docker ps
Посмотреть информацию о контейнере через docker inspect [container_id|container_name]
По выводу команды определить и поместить в отчёт размер контейнера, список замапленных портов и ip контейнера
Остановить докер образ через docker stop [container_id|container_name]
Проверить, что образ остановился через docker ps
Запустить докер с замапленными портами 80 и 443 на локальную машину через команду run
Проверить, что в браузере по адресу localhost:80 доступна стартовая страница nginx
Перезапустить докер контейнер через docker restart [container_id|container_name]
Проверить любым способом, что контейнер запустился
  • В отчёт поместить скрины:
    • вызова и вывода всех использованных в этой части задания команд;
    • стартовой страницы nginx по адресу localhost:80 (адрес должен быть виден).

Part 2. Операции с контейнером

Докер образ и контейнер готовы. Теперь можно покопаться в конфигурации nginx и отобразить статус страницы.

== Задание ==

Прочитать конфигурационный файл nginx.conf внутри докер образа через команду exec
Создать на локальной машине файл nginx.conf
Настроить в нем по пути /status отдачу страницы статуса сервера nginx
Скопировать созданный файл nginx.conf внутрь докер образа через команду docker cp
Перезапустить nginx внутри докер образа через команду exec
Проверить, что по адресу localhost:80/status отдается страничка со статусом сервера nginx
Экспортировать контейнер в файл container.tar через команду export
Остановить контейнер
Удалить образ через docker rmi [image_id|repository], не удаляя перед этим контейнеры
Удалить остановленный контейнер
Импортировать контейнер обратно через команду import
Запустить импортированный контейнер
Проверить, что по адресу localhost:80/status отдается страничка со статусом сервера nginx
  • В отчёт поместить скрины:
    • вызова и вывода всех использованных в этой части задания команд;
    • содержимое созданного файла nginx.conf;
    • страницы со статусом сервера nginx по адресу localhost:80/status.

Part 3. Мини веб-сервер

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

== Задание ==

Написать мини сервер на C и FastCgi, который будет возвращать простейшую страничку с надписью Hello World!
Запустить написанный мини сервер через spawn-fcgi на порту 8080
Написать свой nginx.conf, который будет проксировать все запросы с 81 порта на 127.0.0.1:8080
Проверить, что в браузере по localhost:81 отдается написанная вами страничка
Положить файл nginx.conf по пути ./nginx/nginx.conf (это понадобится позже)

Part 4. Свой докер

Теперь всё готово. Можно приступать к написанию докер образа для созданного сервера.

== Задание ==

При написании докер образа избегайте множественных вызовов команд RUN

Написать свой докер образ, который:

1) собирает исходники мини сервера на FastCgi из Части 3
2) запускает его на 8080 порту
3) копирует внутрь образа написанный ./nginx/nginx.conf
4) запускает nginx.

nginx можно установить внутрь докера самостоятельно, а можно воспользоваться готовым образом с nginx'ом, как базовым.

Собрать написанный докер образ через docker build при этом указав имя и тег
Проверить через docker images, что все собралось корректно
Запустить собранный докер образ с маппингом 81 порта на 80 на локальной машине и маппингом папки ./nginx внутрь контейнера по адресу, где лежат конфигурационные файлы nginx'а (см. Часть 2)
Проверить, что по localhost:80 доступна страничка написанного мини сервера
Дописать в ./nginx/nginx.conf проксирование странички /status, по которой надо отдавать статус сервера nginx
Перезапустить докер образ

Если всё сделано верно, то, после сохранения файла и перезапуска контейнера, конфигурационный файл внутри докер образа должен обновиться самостоятельно без лишних действий

Проверить, что теперь по localhost:80/status отдается страничка со статусом nginx

Part 5. Dockle

После написания образа никогда не будет лишним проверить его на безопасность.

== Задание ==

Просканировать образ из предыдущего задания через dockle [image_id|repository]
Исправить образ так, чтобы при проверке через dockle не было ошибок и предупреждений

Part 6. Базовый Docker Compose

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

== Задание ==

Написать файл docker-compose.yml, с помощью которого:
1) Поднять докер контейнер из Части 5 (он должен работать в локальной сети, т.е. не нужно использовать инструкцию EXPOSE и мапить порты на локальную машину)
2) Поднять докер контейнер с nginx, который будет проксировать все запросы с 8080 порта на 81 порт первого контейнера
Замапить 8080 порт второго контейнера на 80 порт локальной машины
Остановить все запущенные контейнеры
Собрать и запустить проект с помощью команд docker-compose build и docker-compose up
Проверить, что в браузере по localhost:80 отдается написанная вами страничка, как и ранее

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published