Хочешь изменить цвет глаз на
#f00
— ставь Gentoo. (ц)
В Лабораторной работе 6 вы познакомитесь с "докером".
Docker это программное обеспечение, которое позволяет «упаковать» приложение (вашу программу) со всем его окружением и зависимостями в контейнер, который может быть перенесён на почти любую Linux-систему.
Проблема: вы пишите программу. Для реализации графического интерфейса вы установили в свою систему некоторую стороннюю библиотеку. Теперь, когда вы отдадите вашу прогрумму клиенту (другу, коллеге, заинтересованному в вашей программе лицу), вам нужно каким либо способом сообщить ему, какие зависимости в систему нужно установить, чтобы ваша программа работала корректно.
Способы реализовать это:
- Написать установочный скрипт (например, на bash), который установит все дополнительные библиотеки, пропишет необходимые переменные окружения.
Слабые места: Из-за частых обновлений ПО, бибилиотек, операционных систем рано или поздно этот скрипт перестанет корректно работать.
- Использовать облачные сервисы -- настроить необходимое окружение в облаке и распространить.
Слабые места: Облачных сервисов много -- вы не можете запускать ваше решение вне выбранного облака.
- Виртуальная машина -- устанавливаете операционную систему и зависимости.
Слабые места: Огромный размер образа. Любое изменение образа требует скачать ВЕСЬ образ занова.
- Контейнеризация в docker -- нечто среднее между физической и виртуальной машинами.
-
docker запускает все свои процессы в собственной заранее настроенной операционной системе (как и виртуальная машина).
-
все процессы работают на физическом host сервере деля все свои ресурсы с процессами физической системы.
Три основные составные части
- образы (images) (read-only шаблон)
Может содержать в себе операционную систему и все установленные зависимости. Используется для создания контейнеров. Легко создаются новые образы, обновляются существующие и скачиваются созданные сообществом.
- реестр (registries)
Публичный Docker-реестр — это Docker Hub -- огромное хранилище готовых docker-образов.
- контейнеры
Контейнер похож на папку, которая создана по образу и подобию другой папки-шаблона. Контейнеры могут быть созданы, запущены, остановлены, перенесены или удалены. Каждый контейнер изолирован и является безопасной платформой для приложения.
Что бы установить Docker на вашу систему, перейдите по ссылке и выполните указанные там шаги.
https://docs.docker.com/engine/install/ubuntu/
Допустим, вы нашли старый пыльный репозиторий с знаменитой компьютерной игрой Mega Mario.
https://sourceforge.net/projects/mmario/
Но вот незадача! Автор прекратил поддержку в 2008 году и запустить ее на современном компьютере не видится возможным. Что делать? Очень хочется сыграть в нее.
Запустим ее в Docker контейнере. Открывайте терминал!
-
Создайте новую папку
megamario
(просто, чтобы был порядок) и перейдите в нее. -
Создайте файл с названием
Dockerfile
и откройте его на редактирование вашим любимым текстовым редактором. -
Перейдите на сайт https://hub.docker.com/_/ubuntu и во вкладке
Tags
найдите название образа дляubuntu 10.04 Lucid Lynx
и запишите в созданом файлеDockerfile
следующую строку
FROM ubuntu:licud
Этой строкой мы сообщаем Docker на основе какой версии операционной системы собирать образ.
Далее, используя директиву RUN
, возможно запускать команды, которые поддерживает выбранный в FROM
дистрибутив linux.
- Исправим путь до файла с репозиториями (так как необходимая нам версия ubuntu 10 давным-давно не поддерживается)
RUN sed -i 's/archive/old-releases/' /etc/apt/sources.list
- Установим некоторые вспомогательные утилиты (изучите следующую команду! умейте объяснить, что она делает)
RUN apt-get update && apt-get install -y \
apt-utils \
wget \
unzip \
nano \
build-essential \
&& rm -rf /var/lib/apt/lists/*
Warning! Команды внутри директивы RUN
выполняются от имени суперпользователя.
- Установим необходимые зависимости для запуска графики
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*
- Скчайте в папку 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. Знайте, в чем их отличия.
- Извлеките содержимое архива внтури образа
RUN unzip MegaMario_v1.7_full.zip -d MegaMario_v1.7_full
- Исправьте в исходниках игры кое-что потерявшееся в прошедших годах
sed -i "s/${PATH_MAX}/${1024}/g" /MegaMario_v1.7_full/src/Global.h
- Перейдите в папку с игрой и скомпилируйте игру (процедура компиляции может вызвать ужас, но вам не нужно думать об этом много, так как все произойдет в автоматическом режиме)
RUN cd MegaMario_v1.7_full && make PREFIX=/usr && make PREFIX=/usr install
Доп. вопрос! Что такое make и для чего используется?
Для сборки образа, выполнить команду
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
Возможные проблемы, которые можно решить как доп. задание
-
Нет звука.
-
После выхода из игры разрешение экрана не восстанавливается.
-
Откройте терминал, склонируйте этот репозиторий и создайт внутри папку web_server
-
Создайте и заполните файл Dockerfile для сборки образа с web-сервером apache2
Hint! Для установки и настройки можно воспользоваться, например, этой инструкцией https://ubuntu.com/tutorials/install-and-configure-apache#2-installing-apache
- Замените все содержимое странциы
/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>
-
Реализуйте скрипт build.bash, вызов которого повлечет за собой сборку docker-образа
-
Реализуйте скрипт run.bash, для запуска контейнера на основе собранного образа
-
Реализуйте скрипт 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.
-
Запустить скрипт
./web_server/run.bash
-
Выполнить команду (запустит ваш собственный web-server)
service apache2 start
Hint! Что бы узнать, что сервер запустился, вызовите команту service apache2 status
.
-
В браузере на вашей host-машине по адресу
localhost
должна открываться ваша html страница. -
Как сделать так, чтобы ваша собственная html страница не терялась при перезапуске контейнера?