Docker: различия между версиями
Vovan (обсуждение | вклад) (→Запуск графической подсистемы и вход в неё посредством браузера) |
Vovan (обсуждение | вклад) (→Запуск графической подсистемы и вход в неё посредством браузера) |
||
Строка 325: | Строка 325: | ||
Внутри окружения MATE и в непосредственно IDE Lazarus работаем самостоятельно. Вы это умеете. | Внутри окружения MATE и в непосредственно IDE Lazarus работаем самостоятельно. Вы это умеете. | ||
+ | |||
+ | |||
+ | ===Порядок работы с IDE Lazarus=== | ||
+ | |||
+ | После запуска IDE Lazarus необходимо сразу сохранить проект так, чтобы он в итоге лежал в каталоге: | ||
+ | |||
+ | /home/ubuntu/lazarus/project_name | ||
+ | |||
+ | project_name - любое логичное имя вашего проекта. | ||
+ | |||
+ | Также есть вариант наоборот: загружаем в каталог lazarus (тот, который прибиндили в контейнер, см. выше, если непонятно) уже существующий проект, затем открываем его в IDE Lazarus из окружения MATE контейнера. | ||
+ | |||
+ | |||
+ | Работаем над проектом в IDE Lazarus, затем собираем его, сохраняем проект и закрываем IDE Lazarus | ||
+ | |||
+ | |||
+ | На этом этапе в | ||
+ | |||
+ | /home/ubuntu/lazarus/project_name | ||
+ | |||
+ | должен находиться исполняемый файл проекта. Например, если приект вы назвали | ||
+ | |||
+ | mypr.lpr | ||
+ | |||
+ | , то этот файл будет таким: | ||
+ | |||
+ | /home/ubuntu/lazarus/mypr | ||
+ | |||
+ | |||
+ | Вот примерно такой командой его и можно запустить отдельно от IDE Lazarus. Проверим? | ||
+ | |||
+ | |||
+ | Откройте эмулятор терминала из окружения MATE контейнера и введите там полный путь до исполняемого файла получившейся программы: | ||
+ | |||
+ | /home/ubuntu/lazarus/mypr | ||
+ | |||
+ | В результате внутри окружения MATE контейнера должно запуститься ваше приложение, написанное на Lazarus. | ||
+ | |||
+ | |||
+ | Получилось? Если да, то теперь нам не нужо все это тяжёлое окружение в виде MATE и сервера с noVNC. Выключите его. Для этого нужно зайти в терминал контейнера: | ||
+ | |||
+ | docket attach lazarus_dev | ||
+ | |||
+ | и завершить выполнение сценария, который до этого стартовали, сочетанием клавиш: | ||
+ | |||
+ | Ctrl + C | ||
+ | |||
+ | вам должно будет вернуться приглашение командной строки контейнера - это признак того что окружение и сервер с noVNC завершены (можете проверить -- в браузере уже ничего не загрузится). | ||
+ | |||
+ | |||
+ | Теперь наша задача - запустить приложение прямо на хостовой машине (но выполняться оно будет в контейнере). | ||
==Создание контейнера для запуска приложения на Lazarus== | ==Создание контейнера для запуска приложения на Lazarus== |
Версия 00:21, 14 октября 2020
Содержание
Лабораторные работы по Docker
Создание простого контейнера
fixme
Создание контейнера для разработки приложения на Lazarus
Откройте терминал хостовой машины и создайте рабочий каталог
mkdir docker
Перейдите в рабочий каталог
cd docker
Создание файлов
В рабочем каталоге создайте файл
Dockerfile_dev
по следующему шаблону (в файле нужно изменить имя и емэйл разработчика на собственное):
FROM ubuntu:16.04 MAINTAINER Vasya I Pupkin <vasya@pupkin.com> ENV DEBIAN_FRONTEND noninteractive ENV USER ubuntu ENV HOME /home/$USER # Create new user for vnc login. RUN adduser $USER --disabled-password # Install MATE and dependency component. RUN apt-get update \ && apt-get install -y \ tightvncserver \ mate-core mate-desktop-environment mate-notification-daemon \ supervisor \ net-tools \ curl \ git \ pwgen \ lazarus \ && apt-get autoclean \ && apt-get autoremove \ && rm -rf /var/lib/apt/lists/* # Clone noVNC. RUN git clone https://github.com/novnc/noVNC.git $HOME/noVNC # Clone websockify for noVNC Run git clone https://github.com/kanaka/websockify $HOME/noVNC/utils/websockify # Download ngrok. ADD https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip $HOME/ngrok/ngrok.zip RUN unzip -o $HOME/ngrok/ngrok.zip -d $HOME/ngrok && rm $HOME/ngrok/ngrok.zip # Copy supervisor config. COPY supervisor.conf /etc/supervisor/conf.d/ # Copy startup script. COPY startup.sh $HOME EXPOSE 6080 5901 4040
В рабочем каталоге создайте файл
supervisor.conf
со следующим содержимым:
[program:vncserver] command=vncserver -geometry 1600x900 :1 user=ubuntu [program:noVNC] command=/home/ubuntu/noVNC/utils/launch.sh --vnc localhost:5901 user=ubuntu stdout_logfile=/var/log/novnc.log redirect_stderr=true
В рабочем каталоге создайте файл
startup.sh
со следующим содержимым:
#!/bin/bash if [ ! -f $HOME/.vnc/passwd ] ; then if [ -z "$PASSWORD" ] ; then PASSWORD=`pwgen -c -n -1 12` echo -e "PASSWORD = $PASSWORD" > $HOME/password.txt fi echo "$USER:$PASSWORD" | chpasswd # Set up vncserver su $USER -c "mkdir $HOME/.vnc && echo '$PASSWORD' | vncpasswd -f > $HOME/.vnc/passwd && chmod 600 $HOME/.vnc/passwd && touch $HOME/.Xresources" chown -R $USER:$USER $HOME if [ ! -z "$SUDO" ]; then case "$SUDO" in [yY]|[yY][eE][sS]) adduser $USER sudo esac fi else VNC_PID=`find $HOME/.vnc -name '*.pid'` if [ ! -z "$VNC_PID" ] ; then vncserver -kill :1 rm -rf /tmp/.X1* fi fi if [ ! -z "$NGROK" ] ; then case "$NGROK" in [yY]|[yY][eE][sS]) su ubuntu -c "$HOME/ngrok/ngrok http 6080 --log $HOME/ngrok/ngrok.log --log-format json" & sleep 5 NGROK_URL=`curl -s http://127.0.0.1:4040/status | grep -P "http://.*?ngrok.io" -oh` su ubuntu -c "echo -e 'Ngrok URL = $NGROK_URL/vnc.html' > $HOME/ngrok/Ngrok_URL.txt" esac fi /usr/bin/supervisord -n
В конце этого этапа в рабочем каталоге должно быть три файла:
Dockerfile_dev supervisor.conf startup.sh
Создание каталогов
В рабочем каталоге создайте каталог
lazarus
командой
mkdir lazarus
В конце этого этапа в рабочем каталоге должно быть три файла:
Dockerfile_dev supervisor.conf startup.sh
и один каталог:
lazarus
Создание образа контейнера
Далее в этом разделе будем исходить из условия, что ваш логин на https://hub.docker.com/ будет
vpupkin
а пароль
ну, вы сами знаете...
! Также стоит помнить, что в эмуляторе терминала находиться нужно в рабочем каталоге !
Для создания Docker-образа (image) выполните команду:
docker build -t 'vpupkin/lazarus_dev:latest' -f Dockerfile_dev .
Для проверки существования созданного контейнера выполните команду:
docker images
Среди текста ответа должна появиться строчка с новым контейнером:
vpupkin/lazarus_dev latest fa1a63896356 9 seconds ago 2.42GB
Запуск контейнера на базе образа
На базе полученного образа запустите контейнер, пробросив внутрь контейнера локальный каталог хостовой машины и пробросив порт для взаимодействия с графической оболочкой контейнера посредством клиента noVNC:
docker run -it --mount source="$(pwd)"/lazarus,target=/home/ubuntu/lazarus,type=bind -p 6080:6080 -e PASSWORD=123456 --name=lazarus_dev --hostname=lazarus-dev vpupkin/lazarus_dev /bin/bash
Также в этой команде запуска задаются: имя контейнера, имя хоста, команда, которую выполнит контейнер при запуске и указаны ключи, которые автоматически подключают терминал к контейнеру. Для доступа по протоколу VNC посредством переменной окружения PASSWORD задаётся пароль.
В случае успешного создания контейнера в эмуляторе терминала приглашение должно смениться на такое:
root@lazarus-dev:/#
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать
exit
, то контейнер завершит свою работу и найти и запустить его можно таким образом:
Найти:
docker ps -a
в ответе среди возможных прочих контейнеров можно должен быть такой:
8e5f4fd0a99b vpupkin/lazarus_dev "/bin/bash" 3 minutes ago Exited (0) 6 seconds ago lazarus_dev
Имя его в данном случае:
lazarus_dev
Идентификатор его в данном случае:
8e5f4fd0a99b
Остальное пока не важно, однако можно догадаться за что отвечают остальные параметры...
Запустить:
docker start lazarus_dev
или:
docker start 8e5f4fd0a99b
Естественно, в конкретном случае идентификатор будет другой.
Подключиться к терминалу:
docker attach lazarus_dev
или
docker attach 8e5f4fd0a99b
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать
exit
, то контейнер завершит свою работу придётся опять читать выше по тексту как его запускать...
Однако есть способ отключиться от терминала и не завершить контейнер:
Для этого нужно последовательно нажать сочетания клавиш:
Ctrl + P
затем
Ctrl + Q
После этого приглашение командной строки контейнера должно заменить приглашение хостовой системы.
На этом этапе мы научились создавать образ контейнера и запускать контейнер на его базе.
Запуск графической подсистемы и вход в неё посредством браузера
Для запуска окружения рабочего стола и доступа в него по протоколу VNC в контейнере предусмотрен специальный сценарий запуска. Чтобы его запустить нужно зайти в терминал контейнера (см. предыдущие пункты)
И выполнить внутри контейнера команду:
/bin/bash /home/ubuntu/startup.sh
Далее можно либо оставить эмулятор терминала и открыть браузер (правда помни, что если случайно закрыть эмулятор терминала, то контейнер завершит выполнение), либо отключиться от терминала контейнера без его завершения (тоже см. выше - про горячие клавиши).
В любом случае, убедиться, что контейнер запущен можно выполнив команду в хостовой машине:
docker ps
и найдя свой контейнер среди списка, который вернёт команда.
Для работы с окружением рабочего стола зайдите браузером по адресу:
http://localhost:6080/vnc.html
мы же там порт забрасывали, при старте контейнера...
В окне, которое загрузится в браузере, ввести пароль. Какой? -- см. выше. Мы его там в переменной окружения задавали, при старте контейнера...
На этом этапе загрузится стандартное окружение рабочего стола MATE, в котором можно использовать файловый менеджер и непосредственно IDE Lazarus.
Внутри окружения в домашнем каталоге пользователя
ubuntu
есть каталог
lazarus
Он связан с хостовой системой. Зря мы чтоли создавали этот каталог и потом биндили его при старте контейнера?
Конечно не зря. Через этот каталог хостовая машина может обмениваться с контейнером файлами. А самое главное, что при уничтожении контейнера все ваши ценные файлы останутся на хостовой машине в каталоге
lazarus
, если вы, конечно, будете хранить ценные файлы именно в каталоге, который из окружения MATE контейнера имеет такой полный путь:
/home/ubuntu/lazarus
(а теперь внимательно смотрим на команду старта контейнера и смотрим где там встречается такая строчка...)
Внутри окружения MATE и в непосредственно IDE Lazarus работаем самостоятельно. Вы это умеете.
Порядок работы с IDE Lazarus
После запуска IDE Lazarus необходимо сразу сохранить проект так, чтобы он в итоге лежал в каталоге:
/home/ubuntu/lazarus/project_name
project_name - любое логичное имя вашего проекта.
Также есть вариант наоборот: загружаем в каталог lazarus (тот, который прибиндили в контейнер, см. выше, если непонятно) уже существующий проект, затем открываем его в IDE Lazarus из окружения MATE контейнера.
Работаем над проектом в IDE Lazarus, затем собираем его, сохраняем проект и закрываем IDE Lazarus
На этом этапе в
/home/ubuntu/lazarus/project_name
должен находиться исполняемый файл проекта. Например, если приект вы назвали
mypr.lpr
, то этот файл будет таким:
/home/ubuntu/lazarus/mypr
Вот примерно такой командой его и можно запустить отдельно от IDE Lazarus. Проверим?
Откройте эмулятор терминала из окружения MATE контейнера и введите там полный путь до исполняемого файла получившейся программы:
/home/ubuntu/lazarus/mypr
В результате внутри окружения MATE контейнера должно запуститься ваше приложение, написанное на Lazarus.
Получилось? Если да, то теперь нам не нужо все это тяжёлое окружение в виде MATE и сервера с noVNC. Выключите его. Для этого нужно зайти в терминал контейнера:
docket attach lazarus_dev
и завершить выполнение сценария, который до этого стартовали, сочетанием клавиш:
Ctrl + C
вам должно будет вернуться приглашение командной строки контейнера - это признак того что окружение и сервер с noVNC завершены (можете проверить -- в браузере уже ничего не загрузится).
Теперь наша задача - запустить приложение прямо на хостовой машине (но выполняться оно будет в контейнере).