Skip to content

codswort/SimpleDocker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Simple Docker

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

Contents

  1. Chapter I
  2. Chapter II
    2.1. nginx
    2.2. Docker
    2.3. Dockle
  3. Chapter III
    3.1. Готовый докер
    3.2. Операции с контейнером
    3.3. Мини веб-сервер
    3.4. Свой докер
    3.5. Dockle
    3.6. Базовый Docker Compose

Chapter I

simple_docker

Планета Земля, Атлантический океан, Корабль Её Величества "Hood", курс на город Лондон, Великобритания, наши дни.

Вам никогда не нравилось переезжать. Много суматохи, мало дела. Но что поделаешь, на туманном Альбионе удалось найти отличную вакансию, чтобы углубиться в мир DevOps’а. И вы не из тех, кто позволяет мелким трудностям испортить планы.

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

“Хм... Белый кит...” – тут вы вспоминаете, что во время длительного путешествия собирались не терять время зря и познакомиться с докером.

Chapter II

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 III

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

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

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

В качестве результата работы по шестой задаче должен быть предоставлен файл 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 (адрес должен быть виден).

Замечание: Не загружайте тяжелые файлы (>10 мб) в гит.

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

Introduction to docker. Developing a simple docker image for your own server.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published