Docker: различия между версиями

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску
(Порядок работы с IDE Lazarus)
(Порядок работы с IDE Lazarus)
Строка 366: Строка 366:
 
Получилось? Если да, то теперь нам не нужо все это тяжёлое окружение в виде MATE и сервера с noVNC. Выключите его. Для этого нужно зайти в терминал контейнера:
 
Получилось? Если да, то теперь нам не нужо все это тяжёлое окружение в виде MATE и сервера с noVNC. Выключите его. Для этого нужно зайти в терминал контейнера:
  
  docket attach lazarus_dev
+
  docker attach lazarus_dev
  
 
и завершить выполнение сценария, который до этого стартовали, сочетанием клавиш:
 
и завершить выполнение сценария, который до этого стартовали, сочетанием клавиш:

Версия 00:30, 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/project_name/mypr


Вот примерно такой командой его и можно запустить отдельно от IDE Lazarus. Проверим?


Откройте эмулятор терминала из окружения MATE контейнера и введите там полный путь до исполняемого файла получившейся программы:

/home/ubuntu/lazarus/project_name/mypr

В результате внутри окружения MATE контейнера должно запуститься ваше приложение, написанное на Lazarus.


Получилось? Если да, то теперь нам не нужо все это тяжёлое окружение в виде MATE и сервера с noVNC. Выключите его. Для этого нужно зайти в терминал контейнера:

docker attach lazarus_dev

и завершить выполнение сценария, который до этого стартовали, сочетанием клавиш:

Ctrl + C

вам должно будет вернуться приглашение командной строки контейнера - это признак того что окружение и сервер с noVNC завершены (можете проверить -- в браузере уже ничего не загрузится).


Теперь наша задача - запустить приложение прямо на хостовой машине (но выполняться оно будет в контейнере).

Создание контейнера для запуска приложения на Lazarus