Skip to content

warmike01/cs-lab-5-warmike01

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Лабораторная работа 5

Хочешь изменить цвет глаз на #f00 — ставь Gentoo. (ц)

Предыстория

В Лабораторной работе 6 вы познакомитесь с "докером".

Docker это программное обеспечение, которое позволяет «упаковать» приложение (вашу программу) со всем его окружением и зависимостями в контейнер, который может быть перенесён на почти любую Linux-систему.

Зачем это нужно

Проблема: вы пишите программу. Для реализации графического интерфейса вы установили в свою систему некоторую стороннюю библиотеку. Теперь, когда вы отдадите вашу прогрумму клиенту (другу, коллеге, заинтересованному в вашей программе лицу), вам нужно каким либо способом сообщить ему, какие зависимости в систему нужно установить, чтобы ваша программа работала корректно.

Способы реализовать это:

  1. Написать установочный скрипт (например, на bash), который установит все дополнительные библиотеки, пропишет необходимые переменные окружения.

Слабые места: Из-за частых обновлений ПО, бибилиотек, операционных систем рано или поздно этот скрипт перестанет корректно работать.

  1. Использовать облачные сервисы -- настроить необходимое окружение в облаке и распространить.

Слабые места: Облачных сервисов много -- вы не можете запускать ваше решение вне выбранного облака.

  1. Виртуальная машина -- устанавливаете операционную систему и зависимости.

Слабые места: Огромный размер образа. Любое изменение образа требует скачать ВЕСЬ образ занова.

  1. Контейнеризация в docker -- нечто среднее между физической и виртуальной машинами.
  • docker запускает все свои процессы в собственной заранее настроенной операционной системе (как и виртуальная машина).

  • все процессы работают на физическом host сервере деля все свои ресурсы с процессами физической системы.

Как работает

Три основные составные части

  • образы (images) (read-only шаблон)

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

  • реестр (registries)

Публичный Docker-реестр — это Docker Hub -- огромное хранилище готовых docker-образов.

  • контейнеры

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

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

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

https://docs.docker.com/engine/install/ubuntu/

Немного практики (пример)

Пишем свой Dockerfile

Допустим, вы нашли старый пыльный репозиторий с знаменитой компьютерной игрой Mega Mario.

https://sourceforge.net/projects/mmario/

Но вот незадача! Автор прекратил поддержку в 2008 году и запустить ее на современном компьютере не видится возможным. Что делать? Очень хочется сыграть в нее.

Запустим ее в Docker контейнере. Открывайте терминал!

  1. Создайте новую папку megamario (просто, чтобы был порядок) и перейдите в нее.

  2. Создайте файл с названием Dockerfile и откройте его на редактирование вашим любимым текстовым редактором.

  3. Перейдите на сайт https://hub.docker.com/_/ubuntu и во вкладке Tags найдите название образа для ubuntu 10.04 Lucid Lynx и запишите в созданом файле Dockerfile следующую строку

FROM ubuntu:licud

Этой строкой мы сообщаем Docker на основе какой версии операционной системы собирать образ.

Далее, используя директиву RUN, возможно запускать команды, которые поддерживает выбранный в FROM дистрибутив linux.

  1. Исправим путь до файла с репозиториями (так как необходимая нам версия ubuntu 10 давным-давно не поддерживается)
RUN sed -i 's/archive/old-releases/' /etc/apt/sources.list
  1. Установим некоторые вспомогательные утилиты (изучите следующую команду! умейте объяснить, что она делает)
RUN apt-get update && apt-get install -y \
    apt-utils \
    wget \
    unzip \
    nano \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

Warning! Команды внутри директивы RUN выполняются от имени суперпользователя.

  1. Установим необходимые зависимости для запуска графики
RUN mkdir /var/lib/apt/lists/partial && apt-get update && apt-get install -y libsdl-dev \
                        libsdl-image* \
                        libsdl-mixer* \
                        libsdl-ttf* \
                        libsdl-gfx* \
                        freetype*
  1. Скчайте в папку megamario ахрив с игрой (на host-машине)
wget -O MegaMario_v1.7_full.zip https://sourceforge.net/projects/mmario/files/Mega%20Mario%20Full%20Game/Mega%20Mario%20v1.7%20%28Full%20Game%2C%20high%20Quality%20music%29/MegaMario_v1.7_full.zip/download

и добавьте в Dockerfile строчку, которая скопирует этот архив внутрь Docker образа

COPY ./MegaMario_v1.7_full.zip /MegaMario_v1.7_full.zip

Hint! Найдите в документации docker директивы COPY и ADD. Знайте, в чем их отличия.

  1. Извлеките содержимое архива внтури образа
RUN unzip MegaMario_v1.7_full.zip -d MegaMario_v1.7_full
  1. Исправьте в исходниках игры кое-что потерявшееся в прошедших годах
sed -i "s/${PATH_MAX}/${1024}/g" /MegaMario_v1.7_full/src/Global.h
  1. Перейдите в папку с игрой и скомпилируйте игру (процедура компиляции может вызвать ужас, но вам не нужно думать об этом много, так как все произойдет в автоматическом режиме)
RUN cd MegaMario_v1.7_full && make PREFIX=/usr && make PREFIX=/usr install

Доп. вопрос! Что такое make и для чего используется?

Собираем Docker-образ и запускаем

Для сборки образа, выполнить команду

docker build -t mymario_image .

Для запуска контейнера из образа, напишите скрипт run.bash со следующим содержимым

#!/usr/bin/env bash

xhost +local:docker || true

docker run  -ti --rm \
            -e "DISPLAY" \
            -e "QT_X11_NO_MITSHM=1" \
            -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \
            --volume="$HOME/.Xauthority:/root/.Xauthority:rw" \
            -e XAUTHORITY \
            -v "/dev:/dev" \
            --net=host \
            --privileged \
            --name mymario_image mymario_image \
            bash

Все! Что бы запустить собранный контейнер, нужно вызвать скрипт run.bash. После запуска вы попадете в bash-сессию внутри контейнера. Запустите игру командой

megamario

Возможные проблемы, которые можно решить как доп. задание

  1. Нет звука.

  2. После выхода из игры разрешение экрана не восстанавливается.

Задача

  1. Откройте терминал, склонируйте этот репозиторий и создайт внутри папку web_server

  2. Создайте и заполните файл Dockerfile для сборки образа с web-сервером apache2

Hint! Для установки и настройки можно воспользоваться, например, этой инструкцией https://ubuntu.com/tutorials/install-and-configure-apache#2-installing-apache

  1. Замените все содержимое странциы /var/www/html/index.html (внутри docker) на следующий код
<html>
<head>
  <title> I love Docker! </title>
</head>
<body>
  <p> Hello world! I'm <yout-name> and I study at ITMO University! </p>
</body>
</html>
  1. Реализуйте скрипт build.bash, вызов которого повлечет за собой сборку docker-образа

  2. Реализуйте скрипт run.bash, для запуска контейнера на основе собранного образа

  3. Реализуйте скрипт exec.bash, для открытия новой bash сессии внутри запущенного ранее конейнера

Hint! https://docs.docker.com/engine/reference/commandline/exec/

В итоге, структура репозитория должна иметь вид

cs-lab-6/
├── mario
│   ├── Dockerfile
│   └── run.bash
├── web_server
│   ├── Dockerfile
│   ├── build.bash
│   ├── exec.bash
│   └── run.bash
└── README.md

Не забудьте "пушнуть" результаты работы на GH.

Проверка, что все работает корректно

  1. Запустить скрипт ./web_server/run.bash

  2. Выполнить команду (запустит ваш собственный web-server)

service apache2 start

Hint! Что бы узнать, что сервер запустился, вызовите команту service apache2 status.

  1. В браузере на вашей host-машине по адресу localhost должна открываться ваша html страница.

  2. Как сделать так, чтобы ваша собственная html страница не терялась при перезапуске контейнера?

Дополнительные источники

  1. Оффициальное введение в Docker

  2. Docker: Основы

  3. Docker: Термины и концепции

  4. Docker: Файлы Dockerfile

About

cs-lab-5-warmike01

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published