<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.nntc.nnov.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Avolkov</id>
	<title>wiki.nntc.nnov.ru - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.nntc.nnov.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Avolkov"/>
	<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Avolkov"/>
	<updated>2026-10-17T20:39:52Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=ManalizAlt&amp;diff=9532</id>
		<title>ManalizAlt</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=ManalizAlt&amp;diff=9532"/>
		<updated>2021-06-15T06:43:34Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: /* Задать переменные для настройки сети согласно позиции машины в классе */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Настройка после клонирования образа на базе AltEduPve=&lt;br /&gt;
&lt;br /&gt;
==Задать переменную с именем диска==&lt;br /&gt;
&lt;br /&gt;
Имя диска зависит от аппаратной конфигурации (определяется через fdisk -l)&lt;br /&gt;
&lt;br /&gt;
Обычно&lt;br /&gt;
&lt;br /&gt;
 DISK='/dev/nvme0n1'&lt;br /&gt;
&lt;br /&gt;
==Задать переменную с именем сетевого интерфейса для моста==&lt;br /&gt;
&lt;br /&gt;
Зависит от аппаратной конфигурации (определяется через ip a)&lt;br /&gt;
&lt;br /&gt;
Обычно&lt;br /&gt;
&lt;br /&gt;
 MACHINE_ETH_DEVICE='eth0'&lt;br /&gt;
&lt;br /&gt;
==Задать переменные для настройки сети согласно позиции машины в классе==&lt;br /&gt;
&lt;br /&gt;
 MACHINE_NAME='alt-edu-pve-analiz-08'&lt;br /&gt;
 MACHINE_IP='172.16.87.8'&lt;br /&gt;
 MACHINE_MASK='16'&lt;br /&gt;
 MACHINE_GATEWAY='172.16.1.1'&lt;br /&gt;
 MACHINE_DNS='172.16.1.1'&lt;br /&gt;
&lt;br /&gt;
==Выполнить скрипт из partedmagic==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
partprobe $DISK&lt;br /&gt;
fdisk $DISK &amp;lt;&amp;lt;EOF&lt;br /&gt;
d&lt;br /&gt;
2&lt;br /&gt;
n&lt;br /&gt;
p&lt;br /&gt;
2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N&lt;br /&gt;
w&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 pvresize &amp;quot;${DISK}p2&amp;quot;&lt;br /&gt;
 vgchange -ay&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/d&lt;br /&gt;
 mount /dev/alt-vg/root /mnt/d&lt;br /&gt;
&lt;br /&gt;
 rm -f /mnt/d/etc/udev/rules.d/70-persistent-net.rules&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 IP=$MACHINE_IP&lt;br /&gt;
 HOST=$MACHINE_NAME&lt;br /&gt;
 echo &amp;quot;127.0.0.1 localhost&amp;quot; &amp;gt; /mnt/d/etc/hosts&lt;br /&gt;
 echo &amp;quot;$IP $HOST.nntc.nnov.ru $HOST&amp;quot; &amp;gt;&amp;gt; /mnt/d/etc/hosts&lt;br /&gt;
 echo &amp;quot;$HOST&amp;quot; &amp;gt; /mnt/d/etc/hostname&lt;br /&gt;
&lt;br /&gt;
 rm -rf /mnt/d/etc/net/ifaces/*&lt;br /&gt;
 mkdir /mnt/d/etc/net/ifaces/vmbr0&lt;br /&gt;
 cat &amp;lt;&amp;lt; EOF &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/options&lt;br /&gt;
 TYPE=bri&lt;br /&gt;
 VLAN_AWARE=yes&lt;br /&gt;
 VIDS=2-2048&lt;br /&gt;
 ONBOOT=yes&lt;br /&gt;
 DISABLED=no&lt;br /&gt;
 NM_CONTROLLED=no&lt;br /&gt;
 CONFIG_WIRELESS=no&lt;br /&gt;
 CONFIG_IPV4=yes&lt;br /&gt;
 CONFIG_IPV6=no&lt;br /&gt;
 BOOTPROTO=static&lt;br /&gt;
 HOST=&amp;quot;$MACHINE_ETH_DEVICE&amp;quot;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /mnt/d/etc/sysconfig/network&lt;br /&gt;
# When set to no, this may cause most daemons' initscripts skip starting.&lt;br /&gt;
NETWORKING=yes&lt;br /&gt;
&lt;br /&gt;
# Used by hotplug/pcmcia/ifplugd scripts to detect current network config&lt;br /&gt;
# subsystem.&lt;br /&gt;
CONFMETHOD=etcnet&lt;br /&gt;
&lt;br /&gt;
# Used by rc.sysinit to setup system hostname at boot.&lt;br /&gt;
HOSTNAME=$HOST&lt;br /&gt;
&lt;br /&gt;
# This is used by ALTLinux ppp-common to decide if we want to install&lt;br /&gt;
# nameserver lines into /etc/resolv.conf or not.&lt;br /&gt;
RESOLV_MODS=yes&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;$MACHINE_IP/$MACHINE_MASK&amp;quot; &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/ipv4address&lt;br /&gt;
 echo &amp;quot;default via $MACHINE_GATEWAY&amp;quot; &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/ipv4route&lt;br /&gt;
 echo &amp;quot;nameserver $MACHINE_GATEWAY&amp;quot; &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/resolve.conf&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
==Выполнить скрипт уже из pve, подключившись в рута по ssh==&lt;br /&gt;
&lt;br /&gt;
 apt-get install -y firefox&lt;br /&gt;
 rpm -e chromium-disable-webfonts&lt;br /&gt;
&lt;br /&gt;
 vgchange -ay&lt;br /&gt;
&lt;br /&gt;
 lvcreate -y alt-vg --name vmstorage -L 400g&lt;br /&gt;
 zpool create zfspool /dev/alt-vg/vmstorage -f&lt;br /&gt;
 zfs set compression=off zfspool&lt;br /&gt;
 zfs set sync=disabled zfspool&lt;br /&gt;
&lt;br /&gt;
 mkdir /zfspool/storage&lt;br /&gt;
 chown storage:storage /zfspool/storage -R&lt;br /&gt;
&lt;br /&gt;
 pvesm add zfspool vmstorage --pool zfspool --content images,rootdir&lt;br /&gt;
&lt;br /&gt;
 pvesm add cifs pveshare --server 172.16.254.123 --share mcluster1 --username mcluster1 --password --content iso,backup&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=ManalizAlt&amp;diff=9531</id>
		<title>ManalizAlt</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=ManalizAlt&amp;diff=9531"/>
		<updated>2021-06-15T06:38:47Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: Новая страница: «=Настройка после клонирования образа на базе AltEduPve=  ==Задать переменную с именем диска==…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Настройка после клонирования образа на базе AltEduPve=&lt;br /&gt;
&lt;br /&gt;
==Задать переменную с именем диска==&lt;br /&gt;
&lt;br /&gt;
Имя диска зависит от аппаратной конфигурации (определяется через fdisk -l)&lt;br /&gt;
&lt;br /&gt;
Обычно&lt;br /&gt;
&lt;br /&gt;
 DISK='/dev/nvme0n1'&lt;br /&gt;
&lt;br /&gt;
==Задать переменную с именем сетевого интерфейса для моста==&lt;br /&gt;
&lt;br /&gt;
Зависит от аппаратной конфигурации (определяется через ip a)&lt;br /&gt;
&lt;br /&gt;
Обычно&lt;br /&gt;
&lt;br /&gt;
 MACHINE_ETH_DEVICE='eth0'&lt;br /&gt;
&lt;br /&gt;
==Задать переменные для настройки сети согласно позиции машины в классе==&lt;br /&gt;
&lt;br /&gt;
 MACHINE_NAME='alt-edu-pve-analiz-08'&lt;br /&gt;
 MACHINE_IP='172.16.89.8'&lt;br /&gt;
 MACHINE_MASK='16'&lt;br /&gt;
 MACHINE_GATEWAY='172.16.1.1'&lt;br /&gt;
 MACHINE_DNS='172.16.1.1'&lt;br /&gt;
&lt;br /&gt;
==Выполнить скрипт из partedmagic==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
partprobe $DISK&lt;br /&gt;
fdisk $DISK &amp;lt;&amp;lt;EOF&lt;br /&gt;
d&lt;br /&gt;
2&lt;br /&gt;
n&lt;br /&gt;
p&lt;br /&gt;
2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
N&lt;br /&gt;
w&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 pvresize &amp;quot;${DISK}p2&amp;quot;&lt;br /&gt;
 vgchange -ay&lt;br /&gt;
&lt;br /&gt;
 mkdir /mnt/d&lt;br /&gt;
 mount /dev/alt-vg/root /mnt/d&lt;br /&gt;
&lt;br /&gt;
 rm -f /mnt/d/etc/udev/rules.d/70-persistent-net.rules&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 IP=$MACHINE_IP&lt;br /&gt;
 HOST=$MACHINE_NAME&lt;br /&gt;
 echo &amp;quot;127.0.0.1 localhost&amp;quot; &amp;gt; /mnt/d/etc/hosts&lt;br /&gt;
 echo &amp;quot;$IP $HOST.nntc.nnov.ru $HOST&amp;quot; &amp;gt;&amp;gt; /mnt/d/etc/hosts&lt;br /&gt;
 echo &amp;quot;$HOST&amp;quot; &amp;gt; /mnt/d/etc/hostname&lt;br /&gt;
&lt;br /&gt;
 rm -rf /mnt/d/etc/net/ifaces/*&lt;br /&gt;
 mkdir /mnt/d/etc/net/ifaces/vmbr0&lt;br /&gt;
 cat &amp;lt;&amp;lt; EOF &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/options&lt;br /&gt;
 TYPE=bri&lt;br /&gt;
 VLAN_AWARE=yes&lt;br /&gt;
 VIDS=2-2048&lt;br /&gt;
 ONBOOT=yes&lt;br /&gt;
 DISABLED=no&lt;br /&gt;
 NM_CONTROLLED=no&lt;br /&gt;
 CONFIG_WIRELESS=no&lt;br /&gt;
 CONFIG_IPV4=yes&lt;br /&gt;
 CONFIG_IPV6=no&lt;br /&gt;
 BOOTPROTO=static&lt;br /&gt;
 HOST=&amp;quot;$MACHINE_ETH_DEVICE&amp;quot;&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /mnt/d/etc/sysconfig/network&lt;br /&gt;
# When set to no, this may cause most daemons' initscripts skip starting.&lt;br /&gt;
NETWORKING=yes&lt;br /&gt;
&lt;br /&gt;
# Used by hotplug/pcmcia/ifplugd scripts to detect current network config&lt;br /&gt;
# subsystem.&lt;br /&gt;
CONFMETHOD=etcnet&lt;br /&gt;
&lt;br /&gt;
# Used by rc.sysinit to setup system hostname at boot.&lt;br /&gt;
HOSTNAME=$HOST&lt;br /&gt;
&lt;br /&gt;
# This is used by ALTLinux ppp-common to decide if we want to install&lt;br /&gt;
# nameserver lines into /etc/resolv.conf or not.&lt;br /&gt;
RESOLV_MODS=yes&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;$MACHINE_IP/$MACHINE_MASK&amp;quot; &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/ipv4address&lt;br /&gt;
 echo &amp;quot;default via $MACHINE_GATEWAY&amp;quot; &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/ipv4route&lt;br /&gt;
 echo &amp;quot;nameserver $MACHINE_GATEWAY&amp;quot; &amp;gt; /mnt/d/etc/net/ifaces/vmbr0/resolve.conf&lt;br /&gt;
 reboot&lt;br /&gt;
&lt;br /&gt;
==Выполнить скрипт уже из pve, подключившись в рута по ssh==&lt;br /&gt;
&lt;br /&gt;
 apt-get install -y firefox&lt;br /&gt;
 rpm -e chromium-disable-webfonts&lt;br /&gt;
&lt;br /&gt;
 vgchange -ay&lt;br /&gt;
&lt;br /&gt;
 lvcreate -y alt-vg --name vmstorage -L 400g&lt;br /&gt;
 zpool create zfspool /dev/alt-vg/vmstorage -f&lt;br /&gt;
 zfs set compression=off zfspool&lt;br /&gt;
 zfs set sync=disabled zfspool&lt;br /&gt;
&lt;br /&gt;
 mkdir /zfspool/storage&lt;br /&gt;
 chown storage:storage /zfspool/storage -R&lt;br /&gt;
&lt;br /&gt;
 pvesm add zfspool vmstorage --pool zfspool --content images,rootdir&lt;br /&gt;
&lt;br /&gt;
 pvesm add cifs pveshare --server 172.16.254.123 --share mcluster1 --username mcluster1 --password --content iso,backup&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Zfs&amp;diff=9345</id>
		<title>Zfs</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Zfs&amp;diff=9345"/>
		<updated>2021-04-09T13:04:16Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Полезные команды=&lt;br /&gt;
&lt;br /&gt;
==Затюнить основные моменты на PVE==&lt;br /&gt;
&lt;br /&gt;
Отключить сжатие&lt;br /&gt;
 zfs set compression=off rpool/data&lt;br /&gt;
&lt;br /&gt;
Отключить sync&lt;br /&gt;
 zfs set sync=disabled rpool/data&lt;br /&gt;
 &lt;br /&gt;
Просмотр параметров volume (внимание! - отсутствие слэша в начале - это важно)&lt;br /&gt;
&lt;br /&gt;
 zfs get all rpool/data/vm-100-disk-1&lt;br /&gt;
&lt;br /&gt;
Аналогично - просмотр параметров пула (внимание! - слэш в начале - это важно)&lt;br /&gt;
&lt;br /&gt;
 zfs get all /rpool/data/&lt;br /&gt;
&lt;br /&gt;
Создать volume с нужным размером блока (например, с размером блока равным размеру блока в ext4 гостевой машины по умолчанию)&lt;br /&gt;
&lt;br /&gt;
 zfs create -o volblocksize=4K -V 100g rpool/data/vm-100-disk-1&lt;br /&gt;
&lt;br /&gt;
Проверить за собой&lt;br /&gt;
&lt;br /&gt;
 zfs get all rpool/data/vm-100-disk-1 | grep volblocksize&lt;br /&gt;
&lt;br /&gt;
Создание дисков средствами вебинтерфейса проксмокс происходит с volblocksize=8K. Это не всегда удобно. Поэтому после создания виртмашины можно пересоздать так:&lt;br /&gt;
&lt;br /&gt;
Удаляем диск&lt;br /&gt;
&lt;br /&gt;
 zfs destroy rpool/data/vm-100-disk-1&lt;br /&gt;
&lt;br /&gt;
И создаём заново (как уже выше приводилась команда) - выключенная виртмашина ничего не заметит :-)&lt;br /&gt;
&lt;br /&gt;
 zfs create -o volblocksize=4K -V 100g rpool/data/vm-100-disk-1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Копирование данных через снапшоты==&lt;br /&gt;
&lt;br /&gt;
Просмотр списка&lt;br /&gt;
&lt;br /&gt;
 zfs list&lt;br /&gt;
&lt;br /&gt;
Копирование&lt;br /&gt;
&lt;br /&gt;
 ssh root@192.168.10.123 &amp;quot;zfs send rpool/data/vm-106-disk-0@backup-01&amp;quot; | pv --size 469457889480 | zfs receive -o compress=zle storage-zfs/backup/vm-106-disk-0--DO-NOT-DELETE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
создать снапшот&lt;br /&gt;
 zfs snapshot storage-zfs/vm-206-disk-0@backup&lt;br /&gt;
&lt;br /&gt;
список снапшотов&lt;br /&gt;
 zfs list -t snapshot&lt;br /&gt;
&lt;br /&gt;
посмотреть размер снапшота&lt;br /&gt;
 zfs send -nvP storage-zfs/vm-206-disk-0@backup&lt;br /&gt;
&lt;br /&gt;
должно быть на выходе что-то тпа того:&lt;br /&gt;
 full	storage-zfs/vm-206-disk-0@backup	654563209344&lt;br /&gt;
 size	654563209344&lt;br /&gt;
&lt;br /&gt;
установить размер для диска (обычно после копирования из снапшота)&lt;br /&gt;
 set volsize=999G rpool/data/vm-206-disk-0&lt;br /&gt;
&lt;br /&gt;
==Работа с томами==&lt;br /&gt;
&lt;br /&gt;
Изменить размер (помни о файловой системе внутри!)&lt;br /&gt;
&lt;br /&gt;
 zfs set volsize=1000G rpool/data/vm-201-disk-1&lt;br /&gt;
&lt;br /&gt;
=Дополнительные команды при вводе в кластер pve ноды=&lt;br /&gt;
&lt;br /&gt;
Запустить gparted и подвинуть раздел с lvm до конца физического диска -- вручную&lt;br /&gt;
&lt;br /&gt;
Далее из под рута дать команды:&lt;br /&gt;
&lt;br /&gt;
 lvcreate pve-vg --name vmstorage -L 400g&lt;br /&gt;
 zpool create zfspool /dev/mapper/pve--vg-vmstorage -f&lt;br /&gt;
 zfs set compression=off zfspool&lt;br /&gt;
 zfs set sync=disabled zfspool&lt;br /&gt;
&lt;br /&gt;
 /opt/node_template_config/apply_rename.sh ИМЯ_УЗЛА&lt;br /&gt;
&lt;br /&gt;
Пример&lt;br /&gt;
&lt;br /&gt;
 /opt/node_template_config/apply_rename.sh pve-analise-01&lt;br /&gt;
&lt;br /&gt;
Или&lt;br /&gt;
&lt;br /&gt;
 /opt/node_template_config/apply_rename.sh pve-ml-01&lt;br /&gt;
&lt;br /&gt;
Далее нужно ввести ноду в кластер. Для этого выполнить команду (тоже из под рута)&lt;br /&gt;
&lt;br /&gt;
 pvecm add 172.16.87.100 --force&lt;br /&gt;
&lt;br /&gt;
Или если не помогает команда выше:&lt;br /&gt;
&lt;br /&gt;
 pvecm add 172.16.87.100 -link0 IP_АДРЕС_ВВОДИМОЙ_НОДЫ --force&lt;br /&gt;
&lt;br /&gt;
==Disable NetworkManager==&lt;br /&gt;
&lt;br /&gt;
 systemctl stop NetworkManager&lt;br /&gt;
 systemctl disable NetworkManager&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9314</id>
		<title>Oracle Database Server Docker Image</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9314"/>
		<updated>2021-01-19T07:21:44Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Инструкция по настройке образа Oracle Database:==&lt;br /&gt;
&lt;br /&gt;
Переходим по ссылке https://hub.docker.com/_/oracle-database-enterprise-edition&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на использование образа&lt;br /&gt;
&lt;br /&gt;
Скачиваем образ к себе на машину командой: &lt;br /&gt;
  docker pull store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
&lt;br /&gt;
Запускаем новый контейнер docker на основе загруженного image. &lt;br /&gt;
Мы будем использовать режим «—net host» для того, чтобы публиковать порты базы данных в сети&lt;br /&gt;
   docker run --restart=always -d -it --name orcl-nntc --net host -h scdocker.ru.oracle.com -e DB_SID=cdb -e DB_PDB=osadb  -e DB_DOMAIN=ru.oracle.com store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
В результате будет создана контейнерная база cdb (instance будет называться cdb). Также будет создана pdb (pluggable database) с именем osa. Домены у обеих баз данных будут ru.oracle.com. Таким, образом в сервисах будут зарегистрированы 2 базы&lt;br /&gt;
  Service &amp;quot;cdb.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
  Service &amp;quot;osa.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
&lt;br /&gt;
Для того чтобы посмотреть на прогресс и следить за запуском базы данных в дайте команду&lt;br /&gt;
&lt;br /&gt;
  docker logs -f orcl-nntc&lt;br /&gt;
&lt;br /&gt;
Обратите, внимание, что запущенный контейнер разместит свою базу на отдельном volume. Это дает возможность базе данных существовать между запусками контейнера, а также монтировать базу к разным контейнерам&lt;br /&gt;
&lt;br /&gt;
Посмотреть список доступных баз данных можно вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/lsnrctl services&lt;br /&gt;
&lt;br /&gt;
Подключиться к базе данных можно под пользователем system с паролем Oradoc_db1. Например, вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus system/Oradoc_db1@localhost:1521/osadb.ru.oracle.com&lt;br /&gt;
&lt;br /&gt;
Либо тоже самое можно сделать снаружи&lt;br /&gt;
&lt;br /&gt;
  sqlplus system/Oradoc_db1@dockerhostname:1521/osadb.ru.oracle.com&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9313</id>
		<title>Oracle Database Server Docker Image</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9313"/>
		<updated>2021-01-19T07:13:46Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Инструкция по настройке образа Oracle Database:==&lt;br /&gt;
&lt;br /&gt;
Переходим по ссылке https://hub.docker.com/_/oracle-database-enterprise-edition&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на использование образа&lt;br /&gt;
&lt;br /&gt;
Скачиваем образ к себе на машину командой: &lt;br /&gt;
  docker pull store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
&lt;br /&gt;
Запускаем новый контейнер docker на основе загруженного image. &lt;br /&gt;
Мы будем использовать режим «—net host» для того, чтобы публиковать порты базы данных в сети&lt;br /&gt;
   docker run --restart=always -d -it --name orcl-nntc --net host -h scdocker.ru.oracle.com -e DB_SID=cdb -e DB_PDB=osadb  -e DB_DOMAIN=ru.oracle.com store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
В результате будет создана контейнерная база cdb (instance будет называться cdb). Также будет создана pdb (pluggable database) с именем osa. Домены у обеих баз данных будут ru.oracle.com. Таким, образом в сервисах будут зарегистрированы 2 базы&lt;br /&gt;
  Service &amp;quot;cdb.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
  Service &amp;quot;osa.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
&lt;br /&gt;
Для того чтобы посмотреть на прогресс и следить за запуском базы данных в дайте команду&lt;br /&gt;
&lt;br /&gt;
  docker logs -f oracl-nntc&lt;br /&gt;
&lt;br /&gt;
Обратите, внимание, что запущенный контейнер разместит свою базу на отдельном volume. Это дает возможность базе данных существовать между запусками контейнера, а также монтировать базу к разным контейнерам&lt;br /&gt;
&lt;br /&gt;
Посмотреть список доступных баз данных можно вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/lsnrctl services&lt;br /&gt;
&lt;br /&gt;
Подключиться к базе данных можно под пользователем system с паролем Oradoc_db1. Например, вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus system/Oradoc_db1@localhost:1521/osadb.ru.oracle.com&lt;br /&gt;
&lt;br /&gt;
Либо тоже самое можно сделать снаружи&lt;br /&gt;
&lt;br /&gt;
  sqlplus system/Oradoc_db1@dockerhostname:1521/osadb.ru.oracle.com&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9312</id>
		<title>Oracle Database Server Docker Image</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9312"/>
		<updated>2021-01-19T07:10:40Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Инструкция по настройке образа Oracle Database:==&lt;br /&gt;
&lt;br /&gt;
Переходим по ссылке https://hub.docker.com/_/oracle-database-enterprise-edition&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на использование образа&lt;br /&gt;
&lt;br /&gt;
Скачиваем образ к себе на машину командой: &lt;br /&gt;
  docker pull store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
&lt;br /&gt;
Запускаем новый контейнер docker на основе загруженного image. &lt;br /&gt;
Мы будем использовать режим «—net host» для того, чтобы публиковать порты базы данных в сети&lt;br /&gt;
   docker run --restart=always -d -it --name orcl-nntc --net host -h scdocker.ru.oracle.com -e DB_SID=cdb -e DB_PDB=osadb  -e DB_DOMAIN=ru.oracle.com store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
В результате будет создана контейнерная база cdb (instance будет называться cdb). Также будет создана pdb (pluggable database) с именем osa. Домены у обеих баз данных будут ru.oracle.com. Таким, образом в сервисах будут зарегистрированы 2 базы&lt;br /&gt;
  Service &amp;quot;cdb.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
  Service &amp;quot;osa.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
&lt;br /&gt;
Для того чтобы посмотреть на прогресс и следить за запуском базы данных в дайте команду&lt;br /&gt;
&lt;br /&gt;
  docker logs -f oracl_nntc&lt;br /&gt;
&lt;br /&gt;
Обратите, внимание, что запущенный контейнер разместит свою базу на отдельном volume. Это дает возможность базе данных существовать между запусками контейнера, а также монтировать базу к разным контейнерам&lt;br /&gt;
&lt;br /&gt;
Посмотреть список доступных баз данных можно вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/lsnrctl services&lt;br /&gt;
&lt;br /&gt;
Подключиться к базе данных можно под пользователем system с паролем Oradoc_db1. Например, вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus system/Oradoc_db1@localhost:1521/osadb.ru.oracle.com&lt;br /&gt;
&lt;br /&gt;
Либо тоже самое можно сделать снаружи&lt;br /&gt;
&lt;br /&gt;
  sqlplus system/Oradoc_db1@dockerhostname:1521/osadb.ru.oracle.com&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9311</id>
		<title>Oracle Database Server Docker Image</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9311"/>
		<updated>2021-01-19T06:40:03Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Инструкция по настройке образа Oracle Database:==&lt;br /&gt;
&lt;br /&gt;
Переходим по ссылке https://hub.docker.com/_/oracle-database-enterprise-edition&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на использование образа&lt;br /&gt;
&lt;br /&gt;
Скачиваем образ к себе на машину командой: &lt;br /&gt;
  docker pull store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
&lt;br /&gt;
Запускаем новый контейнер docker на основе загруженного image. &lt;br /&gt;
Мы будем использовать режим «—net host» для того, чтобы публиковать порты базы данных в сети&lt;br /&gt;
   docker run --restart=always -d -it --name orcl-nntc --net host -h scdocker.ru.oracle.com -e DB_SID=cdb -e DB_PDB=osadb  -e DB_DOMAIN=ru.oracle.com store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
В результате будет создана контейнерная база cdb (instance будет называться cdb). Также будет создана pdb (pluggable database) с именем osa. Домены у обеих баз данных будут ru.oracle.com. Таким, образом в сервисах будут зарегистрированы 2 базы&lt;br /&gt;
  Service &amp;quot;cdb.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
  Service &amp;quot;osa.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
&lt;br /&gt;
Для того чтобы посмотреть на прогресс и следить за запуском базы данных в дайте команду&lt;br /&gt;
&lt;br /&gt;
  docker logs -f orcl-nntc&lt;br /&gt;
&lt;br /&gt;
Обратите, внимание, что запущенный контейнер разместит свою базу на отдельном volume. Это дает возможность базе данных существовать между запусками контейнера, а также монтировать базу к разным контейнерам&lt;br /&gt;
&lt;br /&gt;
Посмотреть список доступных баз данных можно вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/lsnrctl services&lt;br /&gt;
&lt;br /&gt;
Подключиться к базе данных можно под пользователем system с паролем Oradoc_db1. Например, вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus system/Oradoc_db1@localhost:1521/osadb.ru.oracle.com&lt;br /&gt;
&lt;br /&gt;
Либо тоже самое можно сделать снаружи&lt;br /&gt;
&lt;br /&gt;
  sqlplus system/Oradoc_db1@dockerhostname:1521/osadb.ru.oracle.com&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9310</id>
		<title>Oracle Database Server Docker Image</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Oracle_Database_Server_Docker_Image&amp;diff=9310"/>
		<updated>2021-01-15T10:16:36Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: Новая страница: «==Инструкция по настройке образа Oracle Database:==  Переходим по ссылке https://hub.docker.com/_/oracle-database-ente…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Инструкция по настройке образа Oracle Database:==&lt;br /&gt;
&lt;br /&gt;
Переходим по ссылке https://hub.docker.com/_/oracle-database-enterprise-edition&lt;br /&gt;
&lt;br /&gt;
Регистрируемся на использование образа&lt;br /&gt;
&lt;br /&gt;
Скачиваем образ к себе на машину командой: &lt;br /&gt;
  docker pull store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
&lt;br /&gt;
Запускаем новый контейнер docker на основе загруженного image. &lt;br /&gt;
Мы будем использовать режим «—net host» для того, чтобы публиковать порты базы данных в сети&lt;br /&gt;
   docker run -d -it --name orcl-nntc --net host -h scdocker.ru.oracle.com -e DB_SID=cdb -e DB_PDB=osadb  -e DB_DOMAIN=ru.oracle.com store/oracle/database-enterprise:12.2.0.1&lt;br /&gt;
В результате будет создана контейнерная база cdb (instance будет называться cdb). Также будет создана pdb (pluggable database) с именем osa. Домены у обеих баз данных будут ru.oracle.com. Таким, образом в сервисах будут зарегистрированы 2 базы&lt;br /&gt;
  Service &amp;quot;cdb.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
  Service &amp;quot;osa.ru.oracle.com&amp;quot; has 1 instance(s).&lt;br /&gt;
  Instance &amp;quot;cdb&amp;quot;, status READY, has 1 handler(s) for this service...&lt;br /&gt;
  Handler(s):&lt;br /&gt;
  &amp;quot;DEDICATED&amp;quot; established:2 refused:0 state:ready&lt;br /&gt;
  LOCAL SERVER&lt;br /&gt;
&lt;br /&gt;
Для того чтобы посмотреть на прогресс и следить за запуском базы данных в дайте команду&lt;br /&gt;
&lt;br /&gt;
  docker logs -f orcl-nntc&lt;br /&gt;
&lt;br /&gt;
Обратите, внимание, что запущенный контейнер разместит свою базу на отдельном volume. Это дает возможность базе данных существовать между запусками контейнера, а также монтировать базу к разным контейнерам&lt;br /&gt;
&lt;br /&gt;
Посмотреть список доступных баз данных можно вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/lsnrctl services&lt;br /&gt;
&lt;br /&gt;
Подключиться к базе данных можно под пользователем system с паролем Oradoc_db1. Например, вот так&lt;br /&gt;
&lt;br /&gt;
  docker exec -ti orcl-nntc /u01/app/oracle/product/12.2.0/dbhome_1/bin/sqlplus system/Oradoc_db1@localhost:1521/osadb.ru.oracle.com&lt;br /&gt;
&lt;br /&gt;
Либо тоже самое можно сделать снаружи&lt;br /&gt;
&lt;br /&gt;
  sqlplus system/Oradoc_db1@dockerhostname:1521/osadb.ru.oracle.com&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Docker&amp;diff=9299</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Docker&amp;diff=9299"/>
		<updated>2020-12-22T07:09:46Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Лабораторные работы по Docker=&lt;br /&gt;
&lt;br /&gt;
==Подготовка рабочего места==&lt;br /&gt;
&lt;br /&gt;
Для выполнения всех работ достаточно установить в виртуальную машину &lt;br /&gt;
&lt;br /&gt;
 Ubuntu 20.04 LTS Desktop&lt;br /&gt;
&lt;br /&gt;
Ссылка на загрузку установочного образа: https://releases.ubuntu.com/20.04.1/ubuntu-20.04.1-desktop-amd64.iso&lt;br /&gt;
&lt;br /&gt;
После установки нужно открыть терминал и установить Docker командой&lt;br /&gt;
&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install docker.io&lt;br /&gt;
&lt;br /&gt;
Затем добавить текущего пользователя в группу &lt;br /&gt;
&lt;br /&gt;
 docker&lt;br /&gt;
&lt;br /&gt;
это можно сделать командой&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -Gdocker $USER&lt;br /&gt;
&lt;br /&gt;
затем перезагрузиться.&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №1] Создание простого контейнера==&lt;br /&gt;
&lt;br /&gt;
===Вручную===&lt;br /&gt;
&lt;br /&gt;
Откройте терминал хостовой машины&lt;br /&gt;
&lt;br /&gt;
На базе официального стандартного Docker-образа&lt;br /&gt;
&lt;br /&gt;
 ubuntu&lt;br /&gt;
&lt;br /&gt;
создайте и запустите Docker-контейнер:&lt;br /&gt;
&lt;br /&gt;
 docker run -it --name=my_first_container --hostname=my-first-container ubuntu /bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В случае успешного создания Docker-контейнера в эмуляторе терминала приглашение должно смениться на такое:&lt;br /&gt;
&lt;br /&gt;
 root@my-first-container:/#&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри Docker-контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу и найти и запустить его можно таким образом:&lt;br /&gt;
&lt;br /&gt;
Найти:&lt;br /&gt;
&lt;br /&gt;
 docker ps -a&lt;br /&gt;
&lt;br /&gt;
в ответе среди возможных прочих контейнеров должен быть такой:&lt;br /&gt;
&lt;br /&gt;
 f0a3cc6a8b63        ubuntu                 &amp;quot;/bin/bash&amp;quot;              15 seconds ago      Exited (0) 5 seconds ago                                my_first_container&lt;br /&gt;
&lt;br /&gt;
Имя его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 my_first_container&lt;br /&gt;
&lt;br /&gt;
Идентификатор его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 f0a3cc6a8b63&lt;br /&gt;
&lt;br /&gt;
Запустить:&lt;br /&gt;
&lt;br /&gt;
 docker start my_first_container&lt;br /&gt;
&lt;br /&gt;
или:&lt;br /&gt;
&lt;br /&gt;
 docker start f0a3cc6a8b63&lt;br /&gt;
&lt;br /&gt;
Естественно, в конкретном случае идентификатор будет другой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подключиться к терминалу Docker-контейнера:&lt;br /&gt;
&lt;br /&gt;
 docker attach my_first_container&lt;br /&gt;
&lt;br /&gt;
или &lt;br /&gt;
&lt;br /&gt;
 docker attach f0a3cc6a8b63&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу придётся опять читать выше по тексту как его запускать...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако есть способ отключиться от терминала и не завершить Docker-контейнер:&lt;br /&gt;
&lt;br /&gt;
Для этого нужно последовательно нажать сочетания клавиш:&lt;br /&gt;
&lt;br /&gt;
 Ctrl + P&lt;br /&gt;
&lt;br /&gt;
затем&lt;br /&gt;
&lt;br /&gt;
 Ctrl + Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После этого приглашение командной строки контейнера должно заменить приглашение хостовой системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе мы научились запускать контейнер на базе образа. Однако наша цель -- создать собственный образ, поведение контейнеров, запущенных на базе которого который будет отличаться от поведения только что созданного нами контейнера.&lt;br /&gt;
&lt;br /&gt;
Для создания собственного образа вручную необходимо внести изменения внутри нашего контейнера, а затем выполнить операцию по &amp;quot;превращению&amp;quot; нашего контейнера в образ.&lt;br /&gt;
&lt;br /&gt;
====Задача====&lt;br /&gt;
&lt;br /&gt;
 Создать образ, содержащий стартовый сценарий, который будет считывать переменную окружения с именем пользователя и приветствовать пользователя по имени.&lt;br /&gt;
&lt;br /&gt;
====Ход работы====&lt;br /&gt;
&lt;br /&gt;
Запустите контейнер my_first_container и подключитесь к его терминалу (как это сделать - описано выше)&lt;br /&gt;
&lt;br /&gt;
Установите внутри контейнера текстовый редактор&lt;br /&gt;
&lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install nano&lt;br /&gt;
&lt;br /&gt;
Создайте с помощью установленного редактора nano файл сценария&lt;br /&gt;
&lt;br /&gt;
 bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Hello, $USERNAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Сделайте файл исполняемым&lt;br /&gt;
&lt;br /&gt;
 chmod +x /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
Проверьте работоспособность командой:&lt;br /&gt;
&lt;br /&gt;
 USERNAME=Ivan /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
в результате в терминал должна быть выдана строка&lt;br /&gt;
&lt;br /&gt;
 Hello, Ivan&lt;br /&gt;
&lt;br /&gt;
Завершите контейнер, выйдя из него:&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Создайте новый образ на базе изменённого контейнера командой:&lt;br /&gt;
&lt;br /&gt;
 docker commit -a Vasya -m &amp;quot;My first own image&amp;quot; my_first_container my_first_image&lt;br /&gt;
 &lt;br /&gt;
Образ будет доступен в списке образов&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Выполните запуск контейнера с автоматическим удалением его после завершения, передавая в команду запуска различные значения переменной окружения&lt;br /&gt;
&lt;br /&gt;
 USERNAME&lt;br /&gt;
&lt;br /&gt;
Примеры команды:&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ivan -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Maria -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Petr -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ekaterina -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
===Автоматически (посредством файла Dockerfile)===&lt;br /&gt;
&lt;br /&gt;
Откройте терминал хостовой машины и создайте рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 mkdir docker&lt;br /&gt;
&lt;br /&gt;
Перейдите в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cd docker&lt;br /&gt;
&lt;br /&gt;
===Создание файлов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл &lt;br /&gt;
&lt;br /&gt;
 Dockerfile&lt;br /&gt;
&lt;br /&gt;
по следующему шаблону (в файле нужно изменить имя и емэйл разработчика на собственное):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM ubuntu&lt;br /&gt;
MAINTAINER Vasya I Pupkin &amp;lt;vasya@pupkin.com&amp;gt;&lt;br /&gt;
RUN echo '#!/bin/bash' &amp;gt; /bootstrap.sh&lt;br /&gt;
RUN echo 'echo &amp;quot;Hello, $USERNAME&amp;quot;' &amp;gt;&amp;gt; /bootstrap.sh&lt;br /&gt;
RUN chmod +x /bootstrap.sh&lt;br /&gt;
CMD /bootstrap.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должен быть один файл:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile&lt;br /&gt;
&lt;br /&gt;
===Создание образа контейнера===&lt;br /&gt;
&lt;br /&gt;
Для создания Docker-образа (image) выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker build -t 'my_second_image:latest' .&lt;br /&gt;
&lt;br /&gt;
Для проверки существования созданного контейнера выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Среди текста ответа должна появиться строчка с новым контейнером:&lt;br /&gt;
&lt;br /&gt;
 my_second_image        latest              add5d00c3dc0        7 seconds ago       72.9MB&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера на базе образа===&lt;br /&gt;
&lt;br /&gt;
Запуск контейнеров на базе созданного образа (за исключением имени образа и отсутствием необходимости указывать исполняемый скрипт (он указан непосредственно в Dockerfile)) ни чем не будет отличаться от запуска контейнеров в ходе создания образа вручную:&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ivan -it my_second_image&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Maria -it my_second_image&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Petr -it my_second_image&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ekaterina -it my_second_image&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №2] Создание контейнера для разработки приложения на Lazarus==&lt;br /&gt;
&lt;br /&gt;
Откройте терминал хостовой машины и создайте рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 mkdir docker&lt;br /&gt;
&lt;br /&gt;
Перейдите в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cd docker&lt;br /&gt;
&lt;br /&gt;
===Создание файлов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл &lt;br /&gt;
&lt;br /&gt;
 Dockerfile_dev&lt;br /&gt;
&lt;br /&gt;
по следующему шаблону (в файле нужно изменить имя и емэйл разработчика на собственное):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM ubuntu:20.04&lt;br /&gt;
MAINTAINER Vasya I Pupkin &amp;lt;vasya@pupkin.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ENV DEBIAN_FRONTEND noninteractive&lt;br /&gt;
ENV USER ubuntu&lt;br /&gt;
ENV HOME /home/$USER&lt;br /&gt;
&lt;br /&gt;
# Create new user for vnc login.&lt;br /&gt;
RUN adduser $USER --disabled-password&lt;br /&gt;
&lt;br /&gt;
# Install MATE and dependency component.&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
        tightvncserver \&lt;br /&gt;
        mate-core mate-desktop-environment mate-notification-daemon \&lt;br /&gt;
        supervisor \&lt;br /&gt;
        net-tools \&lt;br /&gt;
        curl \&lt;br /&gt;
        git \&lt;br /&gt;
        pwgen \&lt;br /&gt;
        lazarus \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoclean \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoremove \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
# Clone noVNC.&lt;br /&gt;
RUN git clone https://github.com/novnc/noVNC.git $HOME/noVNC&lt;br /&gt;
&lt;br /&gt;
# Clone websockify for noVNC&lt;br /&gt;
Run git clone https://github.com/kanaka/websockify $HOME/noVNC/utils/websockify&lt;br /&gt;
&lt;br /&gt;
# Download ngrok.&lt;br /&gt;
ADD https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip $HOME/ngrok/ngrok.zip&lt;br /&gt;
RUN unzip -o $HOME/ngrok/ngrok.zip -d $HOME/ngrok &amp;amp;&amp;amp; rm $HOME/ngrok/ngrok.zip&lt;br /&gt;
&lt;br /&gt;
# Copy supervisor config.&lt;br /&gt;
COPY supervisor.conf /etc/supervisor/conf.d/&lt;br /&gt;
&lt;br /&gt;
# Copy startup script.&lt;br /&gt;
COPY startup.sh $HOME&lt;br /&gt;
&lt;br /&gt;
EXPOSE 6080 5901 4040&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл&lt;br /&gt;
&lt;br /&gt;
 supervisor.conf&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[program:vncserver]&lt;br /&gt;
command=vncserver -geometry 1600x900 :1&lt;br /&gt;
user=ubuntu&lt;br /&gt;
&lt;br /&gt;
[program:noVNC]&lt;br /&gt;
command=/home/ubuntu/noVNC/utils/launch.sh --vnc localhost:5901&lt;br /&gt;
user=ubuntu&lt;br /&gt;
stdout_logfile=/var/log/novnc.log&lt;br /&gt;
redirect_stderr=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл&lt;br /&gt;
&lt;br /&gt;
 startup.sh&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [ ! -f $HOME/.vnc/passwd ] ; then&lt;br /&gt;
&lt;br /&gt;
    if  [ -z &amp;quot;$PASSWORD&amp;quot; ] ; then&lt;br /&gt;
        PASSWORD=`pwgen -c -n -1 12`&lt;br /&gt;
        echo -e &amp;quot;PASSWORD = $PASSWORD&amp;quot; &amp;gt; $HOME/password.txt&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;$USER:$PASSWORD&amp;quot; | chpasswd&lt;br /&gt;
&lt;br /&gt;
    # Set up vncserver&lt;br /&gt;
    su $USER -c &amp;quot;mkdir $HOME/.vnc &amp;amp;&amp;amp; echo '$PASSWORD' | vncpasswd -f &amp;gt; $HOME/.vnc/passwd &amp;amp;&amp;amp; chmod 600 $HOME/.vnc/passwd &amp;amp;&amp;amp; touch $HOME/.Xresources&amp;quot;&lt;br /&gt;
    chown -R $USER:$USER $HOME&lt;br /&gt;
&lt;br /&gt;
    if [ ! -z &amp;quot;$SUDO&amp;quot; ]; then&lt;br /&gt;
        case &amp;quot;$SUDO&amp;quot; in&lt;br /&gt;
            [yY]|[yY][eE][sS])&lt;br /&gt;
                adduser $USER sudo&lt;br /&gt;
        esac&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
    VNC_PID=`find $HOME/.vnc -name '*.pid'`&lt;br /&gt;
    if [ ! -z &amp;quot;$VNC_PID&amp;quot; ] ; then&lt;br /&gt;
        vncserver -kill :1&lt;br /&gt;
        rm -rf /tmp/.X1*&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -z &amp;quot;$NGROK&amp;quot; ] ; then&lt;br /&gt;
        case &amp;quot;$NGROK&amp;quot; in&lt;br /&gt;
            [yY]|[yY][eE][sS])&lt;br /&gt;
                su ubuntu -c &amp;quot;$HOME/ngrok/ngrok http 6080 --log $HOME/ngrok/ngrok.log --log-format json&amp;quot; &amp;amp;&lt;br /&gt;
                sleep 5&lt;br /&gt;
                NGROK_URL=`curl -s http://127.0.0.1:4040/status | grep -P &amp;quot;http://.*?ngrok.io&amp;quot; -oh`&lt;br /&gt;
                su ubuntu -c &amp;quot;echo -e 'Ngrok URL = $NGROK_URL/vnc.html' &amp;gt; $HOME/ngrok/Ngrok_URL.txt&amp;quot;&lt;br /&gt;
        esac&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
/usr/bin/supervisord -n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должно быть три файла:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_dev&lt;br /&gt;
 supervisor.conf&lt;br /&gt;
 startup.sh&lt;br /&gt;
&lt;br /&gt;
===Создание каталогов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте каталог&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
командой&lt;br /&gt;
&lt;br /&gt;
 mkdir lazarus&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должно быть три файла:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_dev&lt;br /&gt;
 supervisor.conf&lt;br /&gt;
 startup.sh&lt;br /&gt;
&lt;br /&gt;
и один каталог:&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Создание образа контейнера===&lt;br /&gt;
&lt;br /&gt;
Далее в этом разделе будем исходить из условия, что ваш логин на https://hub.docker.com/ будет&lt;br /&gt;
&lt;br /&gt;
 vpupkin&lt;br /&gt;
&lt;br /&gt;
а пароль&lt;br /&gt;
&lt;br /&gt;
 ну, вы сами знаете...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ! Также стоит помнить, что в эмуляторе терминала находиться нужно в рабочем каталоге !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для создания Docker-образа (image) выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker build -t 'vpupkin/lazarus_dev:latest' -f Dockerfile_dev .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для проверки существования созданного контейнера выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Среди текста ответа должна появиться строчка с новым контейнером:&lt;br /&gt;
&lt;br /&gt;
 vpupkin/lazarus_dev   latest              fa1a63896356        9 seconds ago       2.42GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера на базе образа===&lt;br /&gt;
&lt;br /&gt;
На базе полученного образа запустите контейнер, пробросив внутрь контейнера локальный каталог хостовой машины и пробросив порт для взаимодействия с графической оболочкой контейнера посредством клиента noVNC:&lt;br /&gt;
&lt;br /&gt;
 docker run -it --mount source=&amp;quot;$(pwd)&amp;quot;/lazarus,target=/home/ubuntu/lazarus,type=bind -p 6080:6080 -e PASSWORD=123456 --name=lazarus_dev --hostname=lazarus-dev vpupkin/lazarus_dev /bin/bash&lt;br /&gt;
&lt;br /&gt;
Также в этой команде запуска задаются: имя контейнера, имя хоста, команда, которую выполнит контейнер при запуске и указаны ключи, которые автоматически подключают терминал к контейнеру. Для доступа по протоколу VNC посредством переменной окружения PASSWORD задаётся пароль.&lt;br /&gt;
&lt;br /&gt;
В случае успешного создания контейнера в эмуляторе терминала приглашение должно смениться на такое:&lt;br /&gt;
&lt;br /&gt;
 root@lazarus-dev:/#&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу и найти и запустить его можно таким образом:&lt;br /&gt;
&lt;br /&gt;
Найти:&lt;br /&gt;
&lt;br /&gt;
 docker ps -a&lt;br /&gt;
&lt;br /&gt;
в ответе среди возможных прочих контейнеров должен быть такой:&lt;br /&gt;
&lt;br /&gt;
 8e5f4fd0a99b        vpupkin/lazarus_dev   &amp;quot;/bin/bash&amp;quot;         3 minutes ago       Exited (0) 6 seconds ago                       lazarus_dev&lt;br /&gt;
&lt;br /&gt;
Имя его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 lazarus_dev&lt;br /&gt;
&lt;br /&gt;
Идентификатор его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 8e5f4fd0a99b&lt;br /&gt;
&lt;br /&gt;
Остальное пока не важно, однако можно догадаться за что отвечают остальные параметры...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запустить:&lt;br /&gt;
&lt;br /&gt;
 docker start lazarus_dev&lt;br /&gt;
&lt;br /&gt;
или:&lt;br /&gt;
&lt;br /&gt;
 docker start 8e5f4fd0a99b&lt;br /&gt;
&lt;br /&gt;
Естественно, в конкретном случае идентификатор будет другой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подключиться к терминалу:&lt;br /&gt;
&lt;br /&gt;
 docker attach lazarus_dev&lt;br /&gt;
&lt;br /&gt;
или &lt;br /&gt;
&lt;br /&gt;
 docker attach 8e5f4fd0a99b&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу придётся опять читать выше по тексту как его запускать...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако есть способ отключиться от терминала и не завершить контейнер:&lt;br /&gt;
&lt;br /&gt;
Для этого нужно последовательно нажать сочетания клавиш:&lt;br /&gt;
&lt;br /&gt;
 Ctrl + P&lt;br /&gt;
&lt;br /&gt;
затем&lt;br /&gt;
&lt;br /&gt;
 Ctrl + Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После этого приглашение командной строки контейнера должно заменить приглашение хостовой системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе мы научились создавать образ контейнера и запускать контейнер на его базе.&lt;br /&gt;
&lt;br /&gt;
===Запуск графической подсистемы и вход в неё посредством браузера===&lt;br /&gt;
&lt;br /&gt;
Для запуска окружения рабочего стола и доступа в него по протоколу VNC в контейнере предусмотрен специальный сценарий запуска.&lt;br /&gt;
Чтобы его запустить нужно зайти в терминал контейнера (см. предыдущие пункты)&lt;br /&gt;
&lt;br /&gt;
И выполнить внутри контейнера команду:&lt;br /&gt;
&lt;br /&gt;
 /bin/bash /home/ubuntu/startup.sh&lt;br /&gt;
&lt;br /&gt;
Далее можно либо оставить эмулятор терминала и открыть браузер (правда помни, что если случайно закрыть эмулятор терминала, то контейнер завершит выполнение), либо отключиться от терминала контейнера без его завершения (тоже см. выше - про горячие клавиши).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В любом случае, убедиться, что контейнер запущен можно выполнив команду в хостовой машине:&lt;br /&gt;
&lt;br /&gt;
 docker ps&lt;br /&gt;
&lt;br /&gt;
и найдя свой контейнер среди списка, который вернёт команда.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для работы с окружением рабочего стола зайдите браузером по адресу:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:6080/vnc.html&lt;br /&gt;
&lt;br /&gt;
мы же там порт забрасывали, при старте контейнера...&lt;br /&gt;
&lt;br /&gt;
В окне, которое загрузится в браузере, ввести пароль. Какой? -- см. выше. Мы его там в переменной окружения задавали, при старте контейнера...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе загрузится стандартное окружение рабочего стола MATE, в котором можно использовать файловый менеджер и непосредственно IDE Lazarus.&lt;br /&gt;
&lt;br /&gt;
Внутри окружения в домашнем каталоге пользователя&lt;br /&gt;
&lt;br /&gt;
 ubuntu&lt;br /&gt;
&lt;br /&gt;
есть каталог&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
Он связан с хостовой системой. Зря мы чтоли создавали этот каталог и потом биндили его при старте контейнера?&lt;br /&gt;
&lt;br /&gt;
Конечно не зря. Через этот каталог хостовая машина может обмениваться с контейнером файлами. А самое главное, что при уничтожении контейнера все ваши ценные файлы останутся на хостовой машине в каталоге&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
, если вы, конечно, будете хранить ценные файлы именно в каталоге, который из окружения MATE контейнера имеет такой полный путь:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus&lt;br /&gt;
&lt;br /&gt;
(а теперь внимательно смотрим на команду старта контейнера и смотрим где там встречается такая строчка...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Внутри окружения MATE и в непосредственно IDE Lazarus работаем самостоятельно. Вы это умеете :-)&lt;br /&gt;
&lt;br /&gt;
===Порядок работы с IDE Lazarus===&lt;br /&gt;
&lt;br /&gt;
После запуска IDE Lazarus необходимо сразу сохранить проект так, чтобы он в итоге лежал в каталоге:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name&lt;br /&gt;
&lt;br /&gt;
project_name - любое логичное имя вашего проекта.&lt;br /&gt;
&lt;br /&gt;
Также есть вариант наоборот: загружаем в каталог lazarus (тот, который прибиндили в контейнер, см. выше, если непонятно) уже существующий проект, затем открываем его в IDE Lazarus из окружения MATE контейнера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Работаем над проектом в IDE Lazarus, затем собираем его, сохраняем проект и закрываем IDE Lazarus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе в &lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name&lt;br /&gt;
&lt;br /&gt;
должен находиться исполняемый файл проекта. Например, если проект вы назвали&lt;br /&gt;
&lt;br /&gt;
 mypr.lpr&lt;br /&gt;
&lt;br /&gt;
, то этот файл будет таким:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name/mypr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вот примерно такой командой его и можно запустить отдельно от IDE Lazarus. Проверим?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откройте эмулятор терминала из окружения MATE контейнера и введите там полный путь до исполняемого файла получившейся программы:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name/mypr&lt;br /&gt;
&lt;br /&gt;
В результате внутри окружения MATE контейнера должно запуститься ваше приложение, написанное на Lazarus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Получилось? Если да, то теперь нам не нужо все это тяжёлое окружение в виде MATE и сервера с noVNC. Выключите его. Для этого нужно зайти в терминал контейнера:&lt;br /&gt;
&lt;br /&gt;
 docker attach lazarus_dev&lt;br /&gt;
&lt;br /&gt;
и завершить выполнение сценария, который до этого стартовали, сочетанием клавиш:&lt;br /&gt;
&lt;br /&gt;
 Ctrl + C&lt;br /&gt;
&lt;br /&gt;
вам должно будет вернуться приглашение командной строки контейнера - это признак того что окружение и сервер с noVNC завершены (можете проверить -- в браузере уже ничего не загрузится).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача - запустить приложение прямо на хостовой машине (но выполняться оно будет в контейнере).&lt;br /&gt;
&lt;br /&gt;
===Делаем образ из контейнера с приложением на Lazarus===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы запустить получившееся приложение внутри контейнера, но графическую часть его иметь на хостовой машине, нужно запустить еще один контейнер. Однако, из какого образа?&lt;br /&gt;
&lt;br /&gt;
Вероятно, из такого, где оно (приложение на Lazarus) присутствует. У нас есть такой образ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Верно, нет. У нас есть лишь контейнер, который мы получили на базе подготовленного чистого образа.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Но мы можем теперь легко получить образ на базе нашего контейнера с приложением на Lazarus. Для этого нужно завершить контейнер и выполнить команду в хостовой систиеме:&lt;br /&gt;
&lt;br /&gt;
 docker commit -a Vasya lazarus_dev vpupkin/lazarus_test&lt;br /&gt;
&lt;br /&gt;
Убедиться, что образ создался, можно по прежнему командой:&lt;br /&gt;
 &lt;br /&gt;
 docker images&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
А вот теперь уже можно запустить контейнер на базе образа:&lt;br /&gt;
&lt;br /&gt;
 vpupkin/lazarus_test&lt;br /&gt;
&lt;br /&gt;
, который будет запускать приложение на Lazarus прямо на хостовой системе. Для этого нужно запустить контейнер такой командой:&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --mount source=&amp;quot;$(pwd)&amp;quot;/lazarus,target=/home/ubuntu/lazarus,type=bind --name=lazarus_test --hostname=lazarus-test vpupkin/lazarus_test /bin/su -c &amp;quot;/home/ubuntu/lazarus/project_name/mypr&amp;quot; ubuntu&lt;br /&gt;
&lt;br /&gt;
Для успешного запуска графического приложения, работающего в контейнере, с возможностью отображения графического интерфейса, в этой команде сделано две вещи:&lt;br /&gt;
&lt;br /&gt;
Первая: установлена (внутрь контейнера) переменная окружения &lt;br /&gt;
&lt;br /&gt;
 DISPLAY&lt;br /&gt;
&lt;br /&gt;
равная значению аналогичной переменной окружения хостовой системы.&lt;br /&gt;
&lt;br /&gt;
Вторая: проброшено устройство&lt;br /&gt;
&lt;br /&gt;
 /tmp/.X11-unix&lt;br /&gt;
&lt;br /&gt;
из хостовой системы в контейнер.&lt;br /&gt;
&lt;br /&gt;
Также добавлено монтирование каталога lazarus для обмена файлами межу контейнером и хостовой системой, а также добавлена опция&lt;br /&gt;
&lt;br /&gt;
 --rm&lt;br /&gt;
&lt;br /&gt;
которая уничтожает контейнер после его завершения (за данные мы не переживаем, они же лежат локально в каталоге lazarus, который каждый раз монтируется при старте в новый контейнер).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, возможно, не стоит каждый раз содавать контейнер из образа, если изменений в параметрах запуска не требуется?&lt;br /&gt;
&lt;br /&gt;
Достаточно убрать параметр&lt;br /&gt;
&lt;br /&gt;
 --rm&lt;br /&gt;
&lt;br /&gt;
из команды запуска контейнера, но следует помнить, что при завершении графического приложения контейнер будет завершён и запускать его уже нужно будет командой старта контейнера (в этом случае контейнер никуда не девается, а просто лежит на хостовой системе в выключенном состоянии).&lt;br /&gt;
&lt;br /&gt;
И включить его можно (т.е. запустить наше lazarus-приложение) так:&lt;br /&gt;
&lt;br /&gt;
 docker start lazarus_test&lt;br /&gt;
&lt;br /&gt;
===Отвечаем на главный вопрос?===&lt;br /&gt;
&lt;br /&gt;
Вопрос звучит так:&lt;br /&gt;
&lt;br /&gt;
 Если мы уже разработали приложение, то надо ли конечному пользователю все эти окружения MATE, сервер для запуска окружения noVNC и прочие скрипты инициализации, которые использовались для создания контейнера с инструментами разработки?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наверное нет. Они сильно загружают систему при том, что больше никогда не понадобятся пользователю.&lt;br /&gt;
&lt;br /&gt;
Поэтому для конечного пользователя целесообразно создать новый контейнер, исключив оттуда всё лишнее и оставив лишь непосредственно готовое приложение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как это сделать -- см. в лабораторной работе ниже.&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №3] Создание контейнера для запуска приложения на Lazarus==&lt;br /&gt;
Откройте терминал хостовой машины. Если в домашнем каталоге пользователя присутствует каталог&lt;br /&gt;
&lt;br /&gt;
 docker&lt;br /&gt;
&lt;br /&gt;
то переместите его в резервную копию командой:&lt;br /&gt;
&lt;br /&gt;
 mv docker docker_backup1&lt;br /&gt;
&lt;br /&gt;
затем заново создайте рабочий каталог командой:&lt;br /&gt;
&lt;br /&gt;
 mkdir docker&lt;br /&gt;
&lt;br /&gt;
Перейдите в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cd docker&lt;br /&gt;
&lt;br /&gt;
===Создание файлов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл &lt;br /&gt;
&lt;br /&gt;
 Dockerfile_prod&lt;br /&gt;
&lt;br /&gt;
по следующему шаблону (в файле нужно изменить имя и емэйл разработчика на собственное):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM ubuntu:20.04&lt;br /&gt;
MAINTAINER Vasya I Pupkin &amp;lt;vasya@pupkin.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ENV USER ubuntu&lt;br /&gt;
ENV HOME /home/$USER&lt;br /&gt;
&lt;br /&gt;
# Install dependencyes&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y libgtk2.0-0 \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoclean \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoremove \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
# Create new user for run app&lt;br /&gt;
RUN adduser $USER --disabled-password&lt;br /&gt;
&lt;br /&gt;
# Copy app to user homedir&lt;br /&gt;
COPY mypr /home/$USER/&lt;br /&gt;
CMD /bin/su -c &amp;quot;/home/ubuntu/mypr&amp;quot; ubuntu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скопируйте исполняемый файл, полученный в предыдущей работе в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cp ../docker_backup1/lazarus/project_name/mypr ./&lt;br /&gt;
&lt;br /&gt;
Мы находимся в новом рабочем каталоге хостовой машины:&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker&lt;br /&gt;
&lt;br /&gt;
В начале этой работы каталог предыдущей работы мы переместили сюда:&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker_backup1&lt;br /&gt;
&lt;br /&gt;
Следовательно, относительно каталога&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker&lt;br /&gt;
&lt;br /&gt;
команда копирования исполняемого файла требует подняться на уровень выше&lt;br /&gt;
&lt;br /&gt;
 ../&lt;br /&gt;
&lt;br /&gt;
и из каталога&lt;br /&gt;
&lt;br /&gt;
 docker_backup1&lt;br /&gt;
&lt;br /&gt;
уровнем выше относительно&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker&lt;br /&gt;
&lt;br /&gt;
скопировать необходимый файл в текущий каталог&lt;br /&gt;
&lt;br /&gt;
 ./&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должно быть два файла:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_prod&lt;br /&gt;
 mypr&lt;br /&gt;
&lt;br /&gt;
===Создание образа контейнера===&lt;br /&gt;
&lt;br /&gt;
Далее в этом разделе будем исходить из условия, что ваш логин на https://hub.docker.com/ будет&lt;br /&gt;
&lt;br /&gt;
 vpupkin&lt;br /&gt;
&lt;br /&gt;
а пароль&lt;br /&gt;
&lt;br /&gt;
 ну, вы сами знаете...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ! Также стоит помнить, что в эмуляторе терминала находиться нужно в рабочем каталоге !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для создания Docker-образа (image) выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker build -t 'vpupkin/lazarus_prod:latest' -f Dockerfile_prod .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для проверки существования созданного контейнера выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Среди текста ответа должна появиться строчка с новым контейнером:&lt;br /&gt;
&lt;br /&gt;
 vpupkin/lazarus_prod   latest              20bb2900074d        16 seconds ago      217MB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ! Обратите внимание на размер контейнера !&lt;br /&gt;
 Сравните размер контейнера с размером контейнера lazarus_dev из предыдущей работы&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера на базе образа===&lt;br /&gt;
&lt;br /&gt;
На базе полученного образа запустите контейнер, пробросив внутрь контейнера локальный каталог хостовой машины и пробросив порт для взаимодействия с графической оболочкой контейнера посредством клиента noVNC:&lt;br /&gt;
&lt;br /&gt;
 docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --name=lazarus_prod --hostname=lazarus-prod vpupkin/lazarus_prod&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При запуске контейнера таким образом не указывается команда, т.к. она задаётся в файле&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_prod&lt;br /&gt;
&lt;br /&gt;
строчкой&lt;br /&gt;
&lt;br /&gt;
 CMD /bin/su -c &amp;quot;/home/ubuntu/mypr&amp;quot; ubuntu&lt;br /&gt;
&lt;br /&gt;
Результатом запуска контейнера должно стать запущенное внутри контейнера графическое приложение с отображением графического интерфейса на хостовой машине.&lt;br /&gt;
&lt;br /&gt;
При закрытии окна графического приложения контейнер будет завершён и будет доступен среди списка контейнеров&lt;br /&gt;
&lt;br /&gt;
 docker ps -a&lt;br /&gt;
&lt;br /&gt;
Повторный запуск уже существующего контейнера можно осуществить по имени контейнера командой:&lt;br /&gt;
&lt;br /&gt;
 docker start lazarus_prod&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №4] Взаимодействие двух контейнеров по сети==&lt;br /&gt;
&lt;br /&gt;
Задача: Запустить ПО Moodle в контейнере с именем c2, который взаимодействует с базой данных Mariadb, запущенной в контейнере с именем c1&lt;br /&gt;
&lt;br /&gt;
===Загрузить образы контейнеров===&lt;br /&gt;
&lt;br /&gt;
 docker pull mariadb&lt;br /&gt;
 docker pull bitnami/moodle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Создание и подготовка контейнера C1===&lt;br /&gt;
Создать контейнер с базой данных Mariadb и задать пароль пользователя root через переменную окружения&lt;br /&gt;
&lt;br /&gt;
 docker run --name=c1 --hostname=c1 -e MYSQL_ROOT_PASSWORD=123321 --network bridge -d mariadb&lt;br /&gt;
&lt;br /&gt;
Создать временный контейнер с ПО Moodle и запустить его с доступом в командную оболочку&lt;br /&gt;
&lt;br /&gt;
 docker run -it --rm --name c2_tmp --network bridge bitnami/moodle:latest /bin/bash&lt;br /&gt;
&lt;br /&gt;
Установить во временный контейнер утилиты проверки состояния сети&lt;br /&gt;
&lt;br /&gt;
 apt update&lt;br /&gt;
 apt install net-tools iputils-ping&lt;br /&gt;
&lt;br /&gt;
Изнутри контейнера c2_tmp проверить доступ в базу данных (для этого нужно убедиться в корректности ip адреса контейнера c1):&lt;br /&gt;
&lt;br /&gt;
1. Посмотреть ip адрес конейнера c2_tmp (если контейнеры были запущены последовательно, то адрес контейнера c1 будет на единицу меньше)&lt;br /&gt;
&lt;br /&gt;
 ifconfig&lt;br /&gt;
&lt;br /&gt;
2. Выполнить&lt;br /&gt;
&lt;br /&gt;
 ping &amp;lt;предполагаемый адрес контейнера c1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в соседней консоли остановить контейнер c1&lt;br /&gt;
&lt;br /&gt;
 docker stop c1&lt;br /&gt;
&lt;br /&gt;
в предыдущей консоли убедиться что пинги прекратились. Вернуться в соседнюю консоль. Запустить контейнер c1&lt;br /&gt;
&lt;br /&gt;
 docker start c1&lt;br /&gt;
&lt;br /&gt;
в предыдущей консоли убедиться что пинги возобновились.&lt;br /&gt;
&lt;br /&gt;
3. Выполнить проверку подключения к Mariadb посредством клиента mysql в контейнере c2_tmp&lt;br /&gt;
&lt;br /&gt;
 mysql -u root -p&amp;lt;пароль, установленный в переменной окружения при запуске контейнера c1&amp;gt; -h &amp;lt;корректный ip адрес контейнера c1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Создать базу пользователя и базу данных Mariadb для работы Moodle (из консоли mysql, предварительно подключившись к ней под пользователем root)&lt;br /&gt;
&lt;br /&gt;
 CREATE DATABASE mdatabase;&lt;br /&gt;
 CREATE USER 'muser'@'%' IDENTIFIED BY '123456';&lt;br /&gt;
 GRANT ALL PRIVILEGES ON mdatabase.* to 'muser'@'%' WITH GRANT OPTION;&lt;br /&gt;
&lt;br /&gt;
5. Проверить корректность подключения к Mariadb с созданным пользователем к созданной базе данных&lt;br /&gt;
&lt;br /&gt;
 mysql -u muser -p123456 -h &amp;lt;корректный ip адрес контейнера c1&amp;gt; mdatabase&lt;br /&gt;
 &lt;br /&gt;
6. Выйти из временного контейнера c2_tmp&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера C2 с ПО Moodle===&lt;br /&gt;
&lt;br /&gt;
Поскольку в предыдущем пункте были подготовлены параметры доступа в базу данных Mariadb, используем их для запуска контейнера с ПО Moodle&lt;br /&gt;
&lt;br /&gt;
 docker run -d --name c2 -p 8080:8080 -p 8443:8443 --env ALLOW_EMPTY_PASSWORD=no --env MOODLE_DATABASE_USER=muser --env MOODLE_DATABASE_PASSWORD=123456 --env MOODLE_DATABASE_NAME=mdatabase --env MOODLE_DATABASE_HOST=&amp;lt;корректный ip адрес контейнера c1&amp;gt; --env MOODLE_USERNAME=user --env MOODLE_PASSWORD=123321 --env MOODLE_EMAIL=user@host.com --env MOODLE_SITE_NAME=user_moodle --network bridge bitnami/moodle:latest&lt;br /&gt;
&lt;br /&gt;
Проверка: Открыть в браузере адрес:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080&lt;br /&gt;
&lt;br /&gt;
Ввести логин и пароль от ПО Moodle, указанные ранее в переменных окружения при старте контейнера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание по контейнеру: https://hub.docker.com/r/bitnami/moodle&lt;br /&gt;
&lt;br /&gt;
 Важно! Первые несколько минут ПО Moodle не будет доступно по указанному адресу http://localhost:8080&lt;br /&gt;
 т.к. будет выполняться его первое развёртывание.&lt;br /&gt;
&lt;br /&gt;
Проследить процесс развёртывания можно внутри базы данных в контейнере c1, подключившись к ней с хостовой машины&lt;br /&gt;
&lt;br /&gt;
 mysql -u muser -p123456 -h &amp;lt;корректный ip адрес контейнера c1&amp;gt; mdatabase&lt;br /&gt;
&lt;br /&gt;
и из консоли mysql проверить наличие таблиц в базе данных&lt;br /&gt;
&lt;br /&gt;
 show tables&lt;br /&gt;
&lt;br /&gt;
===Самостоятельное задание===&lt;br /&gt;
&lt;br /&gt;
Используя справку по утилите docker запустить два аналогичных контейнера, установив статические ip адреса для них.&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №5] Взаимодействие двух контейнеров по сети==&lt;br /&gt;
&lt;br /&gt;
Создайте рабочий каталог и перейдите в него&lt;br /&gt;
&lt;br /&gt;
 mkdir composemoodle&lt;br /&gt;
 cd composemoodle&lt;br /&gt;
&lt;br /&gt;
Создайте файл&lt;br /&gt;
&lt;br /&gt;
 docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
version: &amp;quot;2.2&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  mariadb:&lt;br /&gt;
     image: &amp;quot;mariadb:latest&amp;quot;&lt;br /&gt;
     environment:&lt;br /&gt;
      - MYSQL_ROOT_PASSWORD=123321&lt;br /&gt;
      - MYSQL_ALLOW_EMPTY_PASSWORD=no&lt;br /&gt;
      - MYSQL_DATABASE=mdatabase&lt;br /&gt;
      - MYSQL_USER=muser&lt;br /&gt;
      - MYSQL_PASSWORD=123456&lt;br /&gt;
  moodle:&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8080:8080&amp;quot;&lt;br /&gt;
      - &amp;quot;8443:8443&amp;quot;&lt;br /&gt;
    image: &amp;quot;bitnami/moodle:latest&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - ALLOW_EMPTY_PASSWORD=no&lt;br /&gt;
      - MOODLE_DATABASE_USER=muser&lt;br /&gt;
      - MOODLE_DATABASE_PASSWORD=123456&lt;br /&gt;
      - MOODLE_DATABASE_NAME=mdatabase&lt;br /&gt;
      - MOODLE_DATABASE_HOST=mariadb&lt;br /&gt;
      - MOODLE_USERNAME=user&lt;br /&gt;
      - MOODLE_PASSWORD=123321&lt;br /&gt;
      - MOODLE_EMAIL=user@host.com&lt;br /&gt;
      - MOODLE_SITE_NAME=user_moodle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате в рабочем каталоге должен быть файл:&lt;br /&gt;
&lt;br /&gt;
 docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге выполнить команду для запуска проекта&lt;br /&gt;
&lt;br /&gt;
 docker-compose up&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.nntc.nnov.ru/index.php?title=Docker&amp;diff=9298</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.nntc.nnov.ru/index.php?title=Docker&amp;diff=9298"/>
		<updated>2020-12-19T11:24:46Z</updated>

		<summary type="html">&lt;p&gt;Avolkov: 16.04-&amp;gt;20.04&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Лабораторные работы по Docker=&lt;br /&gt;
&lt;br /&gt;
==Подготовка рабочего места==&lt;br /&gt;
&lt;br /&gt;
Для выполнения всех работ достаточно установить в виртуальную машину &lt;br /&gt;
&lt;br /&gt;
 Ubuntu 20.04 LTS Desktop&lt;br /&gt;
&lt;br /&gt;
Ссылка на загрузку установочного образа: https://releases.ubuntu.com/20.04.1/ubuntu-20.04.1-desktop-amd64.iso&lt;br /&gt;
&lt;br /&gt;
После установки нужно открыть терминал и установить Docker командой&lt;br /&gt;
&lt;br /&gt;
 sudo apt update &amp;amp;&amp;amp; sudo apt install docker.io&lt;br /&gt;
&lt;br /&gt;
Затем добавить текущего пользователя в группу &lt;br /&gt;
&lt;br /&gt;
 docker&lt;br /&gt;
&lt;br /&gt;
это можно сделать командой&lt;br /&gt;
&lt;br /&gt;
 sudo usermod -Gdocker $USER&lt;br /&gt;
&lt;br /&gt;
затем перезагрузиться.&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №1] Создание простого контейнера==&lt;br /&gt;
&lt;br /&gt;
===Вручную===&lt;br /&gt;
&lt;br /&gt;
Откройте терминал хостовой машины&lt;br /&gt;
&lt;br /&gt;
На базе официального стандартного Docker-образа&lt;br /&gt;
&lt;br /&gt;
 ubuntu&lt;br /&gt;
&lt;br /&gt;
создайте и запустите Docker-контейнер:&lt;br /&gt;
&lt;br /&gt;
 docker run -it --name=my_first_container --hostname=my-first-container ubuntu /bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В случае успешного создания Docker-контейнера в эмуляторе терминала приглашение должно смениться на такое:&lt;br /&gt;
&lt;br /&gt;
 root@my-first-container:/#&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри Docker-контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу и найти и запустить его можно таким образом:&lt;br /&gt;
&lt;br /&gt;
Найти:&lt;br /&gt;
&lt;br /&gt;
 docker ps -a&lt;br /&gt;
&lt;br /&gt;
в ответе среди возможных прочих контейнеров должен быть такой:&lt;br /&gt;
&lt;br /&gt;
 f0a3cc6a8b63        ubuntu                 &amp;quot;/bin/bash&amp;quot;              15 seconds ago      Exited (0) 5 seconds ago                                my_first_container&lt;br /&gt;
&lt;br /&gt;
Имя его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 my_first_container&lt;br /&gt;
&lt;br /&gt;
Идентификатор его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 f0a3cc6a8b63&lt;br /&gt;
&lt;br /&gt;
Запустить:&lt;br /&gt;
&lt;br /&gt;
 docker start my_first_container&lt;br /&gt;
&lt;br /&gt;
или:&lt;br /&gt;
&lt;br /&gt;
 docker start f0a3cc6a8b63&lt;br /&gt;
&lt;br /&gt;
Естественно, в конкретном случае идентификатор будет другой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подключиться к терминалу Docker-контейнера:&lt;br /&gt;
&lt;br /&gt;
 docker attach my_first_container&lt;br /&gt;
&lt;br /&gt;
или &lt;br /&gt;
&lt;br /&gt;
 docker attach f0a3cc6a8b63&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу придётся опять читать выше по тексту как его запускать...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако есть способ отключиться от терминала и не завершить Docker-контейнер:&lt;br /&gt;
&lt;br /&gt;
Для этого нужно последовательно нажать сочетания клавиш:&lt;br /&gt;
&lt;br /&gt;
 Ctrl + P&lt;br /&gt;
&lt;br /&gt;
затем&lt;br /&gt;
&lt;br /&gt;
 Ctrl + Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После этого приглашение командной строки контейнера должно заменить приглашение хостовой системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе мы научились запускать контейнер на базе образа. Однако наша цель -- создать собственный образ, поведение контейнеров, запущенных на базе которого который будет отличаться от поведения только что созданного нами контейнера.&lt;br /&gt;
&lt;br /&gt;
Для создания собственного образа вручную необходимо внести изменения внутри нашего контейнера, а затем выполнить операцию по &amp;quot;превращению&amp;quot; нашего контейнера в образ.&lt;br /&gt;
&lt;br /&gt;
====Задача====&lt;br /&gt;
&lt;br /&gt;
 Создать образ, содержащий стартовый сценарий, который будет считывать переменную окружения с именем пользователя и приветствовать пользователя по имени.&lt;br /&gt;
&lt;br /&gt;
====Ход работы====&lt;br /&gt;
&lt;br /&gt;
Запустите контейнер my_first_container и подключитесь к его терминалу (как это сделать - описано выше)&lt;br /&gt;
&lt;br /&gt;
Установите внутри контейнера текстовый редактор&lt;br /&gt;
&lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install nano&lt;br /&gt;
&lt;br /&gt;
Создайте с помощью установленного редактора nano файл сценария&lt;br /&gt;
&lt;br /&gt;
 bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo &amp;quot;Hello, $USERNAME&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Сделайте файл исполняемым&lt;br /&gt;
&lt;br /&gt;
 chmod +x /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
Проверьте работоспособность командой:&lt;br /&gt;
&lt;br /&gt;
 USERNAME=Ivan /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
в результате в терминал должна быть выдана строка&lt;br /&gt;
&lt;br /&gt;
 Hello, Ivan&lt;br /&gt;
&lt;br /&gt;
Завершите контейнер, выйдя из него:&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
Создайте новый образ на базе изменённого контейнера командой:&lt;br /&gt;
&lt;br /&gt;
 docker commit -a Vasya -m &amp;quot;My first own image&amp;quot; my_first_container my_first_image&lt;br /&gt;
 &lt;br /&gt;
Образ будет доступен в списке образов&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Выполните запуск контейнера с автоматическим удалением его после завершения, передавая в команду запуска различные значения переменной окружения&lt;br /&gt;
&lt;br /&gt;
 USERNAME&lt;br /&gt;
&lt;br /&gt;
Примеры команды:&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ivan -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Maria -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Petr -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ekaterina -it my_first_image /bootstrap.sh&lt;br /&gt;
&lt;br /&gt;
===Автоматически (посредством файла Dockerfile)===&lt;br /&gt;
&lt;br /&gt;
Откройте терминал хостовой машины и создайте рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 mkdir docker&lt;br /&gt;
&lt;br /&gt;
Перейдите в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cd docker&lt;br /&gt;
&lt;br /&gt;
===Создание файлов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл &lt;br /&gt;
&lt;br /&gt;
 Dockerfile&lt;br /&gt;
&lt;br /&gt;
по следующему шаблону (в файле нужно изменить имя и емэйл разработчика на собственное):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM ubuntu&lt;br /&gt;
MAINTAINER Vasya I Pupkin &amp;lt;vasya@pupkin.com&amp;gt;&lt;br /&gt;
RUN echo '#!/bin/bash' &amp;gt; /bootstrap.sh&lt;br /&gt;
RUN echo 'echo &amp;quot;Hello, $USERNAME&amp;quot;' &amp;gt;&amp;gt; /bootstrap.sh&lt;br /&gt;
RUN chmod +x /bootstrap.sh&lt;br /&gt;
CMD /bootstrap.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должен быть один файл:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile&lt;br /&gt;
&lt;br /&gt;
===Создание образа контейнера===&lt;br /&gt;
&lt;br /&gt;
Для создания Docker-образа (image) выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker build -t 'my_second_image:latest' .&lt;br /&gt;
&lt;br /&gt;
Для проверки существования созданного контейнера выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Среди текста ответа должна появиться строчка с новым контейнером:&lt;br /&gt;
&lt;br /&gt;
 my_second_image        latest              add5d00c3dc0        7 seconds ago       72.9MB&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера на базе образа===&lt;br /&gt;
&lt;br /&gt;
Запуск контейнеров на базе созданного образа (за исключением имени образа и отсутствием необходимости указывать исполняемый скрипт (он указан непосредственно в Dockerfile)) ни чем не будет отличаться от запуска контейнеров в ходе создания образа вручную:&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ivan -it my_second_image&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Maria -it my_second_image&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Petr -it my_second_image&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -e USERNAME=Ekaterina -it my_second_image&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №2] Создание контейнера для разработки приложения на Lazarus==&lt;br /&gt;
&lt;br /&gt;
Откройте терминал хостовой машины и создайте рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 mkdir docker&lt;br /&gt;
&lt;br /&gt;
Перейдите в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cd docker&lt;br /&gt;
&lt;br /&gt;
===Создание файлов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл &lt;br /&gt;
&lt;br /&gt;
 Dockerfile_dev&lt;br /&gt;
&lt;br /&gt;
по следующему шаблону (в файле нужно изменить имя и емэйл разработчика на собственное):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM ubuntu:20.04&lt;br /&gt;
MAINTAINER Vasya I Pupkin &amp;lt;vasya@pupkin.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ENV DEBIAN_FRONTEND noninteractive&lt;br /&gt;
ENV USER ubuntu&lt;br /&gt;
ENV HOME /home/$USER&lt;br /&gt;
&lt;br /&gt;
# Create new user for vnc login.&lt;br /&gt;
RUN adduser $USER --disabled-password&lt;br /&gt;
&lt;br /&gt;
# Install MATE and dependency component.&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y \&lt;br /&gt;
        tightvncserver \&lt;br /&gt;
        mate-core mate-desktop-environment mate-notification-daemon \&lt;br /&gt;
        supervisor \&lt;br /&gt;
        net-tools \&lt;br /&gt;
        curl \&lt;br /&gt;
        git \&lt;br /&gt;
        pwgen \&lt;br /&gt;
        lazarus \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoclean \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoremove \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
# Clone noVNC.&lt;br /&gt;
RUN git clone https://github.com/novnc/noVNC.git $HOME/noVNC&lt;br /&gt;
&lt;br /&gt;
# Clone websockify for noVNC&lt;br /&gt;
Run git clone https://github.com/kanaka/websockify $HOME/noVNC/utils/websockify&lt;br /&gt;
&lt;br /&gt;
# Download ngrok.&lt;br /&gt;
ADD https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip $HOME/ngrok/ngrok.zip&lt;br /&gt;
RUN unzip -o $HOME/ngrok/ngrok.zip -d $HOME/ngrok &amp;amp;&amp;amp; rm $HOME/ngrok/ngrok.zip&lt;br /&gt;
&lt;br /&gt;
# Copy supervisor config.&lt;br /&gt;
COPY supervisor.conf /etc/supervisor/conf.d/&lt;br /&gt;
&lt;br /&gt;
# Copy startup script.&lt;br /&gt;
COPY startup.sh $HOME&lt;br /&gt;
&lt;br /&gt;
EXPOSE 6080 5901 4040&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл&lt;br /&gt;
&lt;br /&gt;
 supervisor.conf&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[program:vncserver]&lt;br /&gt;
command=vncserver -geometry 1600x900 :1&lt;br /&gt;
user=ubuntu&lt;br /&gt;
&lt;br /&gt;
[program:noVNC]&lt;br /&gt;
command=/home/ubuntu/noVNC/utils/launch.sh --vnc localhost:5901&lt;br /&gt;
user=ubuntu&lt;br /&gt;
stdout_logfile=/var/log/novnc.log&lt;br /&gt;
redirect_stderr=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл&lt;br /&gt;
&lt;br /&gt;
 startup.sh&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [ ! -f $HOME/.vnc/passwd ] ; then&lt;br /&gt;
&lt;br /&gt;
    if  [ -z &amp;quot;$PASSWORD&amp;quot; ] ; then&lt;br /&gt;
        PASSWORD=`pwgen -c -n -1 12`&lt;br /&gt;
        echo -e &amp;quot;PASSWORD = $PASSWORD&amp;quot; &amp;gt; $HOME/password.txt&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;$USER:$PASSWORD&amp;quot; | chpasswd&lt;br /&gt;
&lt;br /&gt;
    # Set up vncserver&lt;br /&gt;
    su $USER -c &amp;quot;mkdir $HOME/.vnc &amp;amp;&amp;amp; echo '$PASSWORD' | vncpasswd -f &amp;gt; $HOME/.vnc/passwd &amp;amp;&amp;amp; chmod 600 $HOME/.vnc/passwd &amp;amp;&amp;amp; touch $HOME/.Xresources&amp;quot;&lt;br /&gt;
    chown -R $USER:$USER $HOME&lt;br /&gt;
&lt;br /&gt;
    if [ ! -z &amp;quot;$SUDO&amp;quot; ]; then&lt;br /&gt;
        case &amp;quot;$SUDO&amp;quot; in&lt;br /&gt;
            [yY]|[yY][eE][sS])&lt;br /&gt;
                adduser $USER sudo&lt;br /&gt;
        esac&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
&lt;br /&gt;
    VNC_PID=`find $HOME/.vnc -name '*.pid'`&lt;br /&gt;
    if [ ! -z &amp;quot;$VNC_PID&amp;quot; ] ; then&lt;br /&gt;
        vncserver -kill :1&lt;br /&gt;
        rm -rf /tmp/.X1*&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ ! -z &amp;quot;$NGROK&amp;quot; ] ; then&lt;br /&gt;
        case &amp;quot;$NGROK&amp;quot; in&lt;br /&gt;
            [yY]|[yY][eE][sS])&lt;br /&gt;
                su ubuntu -c &amp;quot;$HOME/ngrok/ngrok http 6080 --log $HOME/ngrok/ngrok.log --log-format json&amp;quot; &amp;amp;&lt;br /&gt;
                sleep 5&lt;br /&gt;
                NGROK_URL=`curl -s http://127.0.0.1:4040/status | grep -P &amp;quot;http://.*?ngrok.io&amp;quot; -oh`&lt;br /&gt;
                su ubuntu -c &amp;quot;echo -e 'Ngrok URL = $NGROK_URL/vnc.html' &amp;gt; $HOME/ngrok/Ngrok_URL.txt&amp;quot;&lt;br /&gt;
        esac&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
/usr/bin/supervisord -n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должно быть три файла:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_dev&lt;br /&gt;
 supervisor.conf&lt;br /&gt;
 startup.sh&lt;br /&gt;
&lt;br /&gt;
===Создание каталогов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте каталог&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
командой&lt;br /&gt;
&lt;br /&gt;
 mkdir lazarus&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должно быть три файла:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_dev&lt;br /&gt;
 supervisor.conf&lt;br /&gt;
 startup.sh&lt;br /&gt;
&lt;br /&gt;
и один каталог:&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Создание образа контейнера===&lt;br /&gt;
&lt;br /&gt;
Далее в этом разделе будем исходить из условия, что ваш логин на https://hub.docker.com/ будет&lt;br /&gt;
&lt;br /&gt;
 vpupkin&lt;br /&gt;
&lt;br /&gt;
а пароль&lt;br /&gt;
&lt;br /&gt;
 ну, вы сами знаете...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ! Также стоит помнить, что в эмуляторе терминала находиться нужно в рабочем каталоге !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для создания Docker-образа (image) выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker build -t 'vpupkin/lazarus_dev:latest' -f Dockerfile_dev .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для проверки существования созданного контейнера выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Среди текста ответа должна появиться строчка с новым контейнером:&lt;br /&gt;
&lt;br /&gt;
 vpupkin/lazarus_dev   latest              fa1a63896356        9 seconds ago       2.42GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера на базе образа===&lt;br /&gt;
&lt;br /&gt;
На базе полученного образа запустите контейнер, пробросив внутрь контейнера локальный каталог хостовой машины и пробросив порт для взаимодействия с графической оболочкой контейнера посредством клиента noVNC:&lt;br /&gt;
&lt;br /&gt;
 docker run -it --mount source=&amp;quot;$(pwd)&amp;quot;/lazarus,target=/home/ubuntu/lazarus,type=bind -p 6080:6080 -e PASSWORD=123456 --name=lazarus_dev --hostname=lazarus-dev vpupkin/lazarus_dev /bin/bash&lt;br /&gt;
&lt;br /&gt;
Также в этой команде запуска задаются: имя контейнера, имя хоста, команда, которую выполнит контейнер при запуске и указаны ключи, которые автоматически подключают терминал к контейнеру. Для доступа по протоколу VNC посредством переменной окружения PASSWORD задаётся пароль.&lt;br /&gt;
&lt;br /&gt;
В случае успешного создания контейнера в эмуляторе терминала приглашение должно смениться на такое:&lt;br /&gt;
&lt;br /&gt;
 root@lazarus-dev:/#&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу и найти и запустить его можно таким образом:&lt;br /&gt;
&lt;br /&gt;
Найти:&lt;br /&gt;
&lt;br /&gt;
 docker ps -a&lt;br /&gt;
&lt;br /&gt;
в ответе среди возможных прочих контейнеров должен быть такой:&lt;br /&gt;
&lt;br /&gt;
 8e5f4fd0a99b        vpupkin/lazarus_dev   &amp;quot;/bin/bash&amp;quot;         3 minutes ago       Exited (0) 6 seconds ago                       lazarus_dev&lt;br /&gt;
&lt;br /&gt;
Имя его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 lazarus_dev&lt;br /&gt;
&lt;br /&gt;
Идентификатор его в данном случае:&lt;br /&gt;
&lt;br /&gt;
 8e5f4fd0a99b&lt;br /&gt;
&lt;br /&gt;
Остальное пока не важно, однако можно догадаться за что отвечают остальные параметры...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Запустить:&lt;br /&gt;
&lt;br /&gt;
 docker start lazarus_dev&lt;br /&gt;
&lt;br /&gt;
или:&lt;br /&gt;
&lt;br /&gt;
 docker start 8e5f4fd0a99b&lt;br /&gt;
&lt;br /&gt;
Естественно, в конкретном случае идентификатор будет другой.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Подключиться к терминалу:&lt;br /&gt;
&lt;br /&gt;
 docker attach lazarus_dev&lt;br /&gt;
&lt;br /&gt;
или &lt;br /&gt;
&lt;br /&gt;
 docker attach 8e5f4fd0a99b&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Внимание! Сейчас вы внутри контейнера и можете командовать им! Если скомандовать&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
, то контейнер завершит свою работу придётся опять читать выше по тексту как его запускать...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако есть способ отключиться от терминала и не завершить контейнер:&lt;br /&gt;
&lt;br /&gt;
Для этого нужно последовательно нажать сочетания клавиш:&lt;br /&gt;
&lt;br /&gt;
 Ctrl + P&lt;br /&gt;
&lt;br /&gt;
затем&lt;br /&gt;
&lt;br /&gt;
 Ctrl + Q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
После этого приглашение командной строки контейнера должно заменить приглашение хостовой системы.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе мы научились создавать образ контейнера и запускать контейнер на его базе.&lt;br /&gt;
&lt;br /&gt;
===Запуск графической подсистемы и вход в неё посредством браузера===&lt;br /&gt;
&lt;br /&gt;
Для запуска окружения рабочего стола и доступа в него по протоколу VNC в контейнере предусмотрен специальный сценарий запуска.&lt;br /&gt;
Чтобы его запустить нужно зайти в терминал контейнера (см. предыдущие пункты)&lt;br /&gt;
&lt;br /&gt;
И выполнить внутри контейнера команду:&lt;br /&gt;
&lt;br /&gt;
 /bin/bash /home/ubuntu/startup.sh&lt;br /&gt;
&lt;br /&gt;
Далее можно либо оставить эмулятор терминала и открыть браузер (правда помни, что если случайно закрыть эмулятор терминала, то контейнер завершит выполнение), либо отключиться от терминала контейнера без его завершения (тоже см. выше - про горячие клавиши).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В любом случае, убедиться, что контейнер запущен можно выполнив команду в хостовой машине:&lt;br /&gt;
&lt;br /&gt;
 docker ps&lt;br /&gt;
&lt;br /&gt;
и найдя свой контейнер среди списка, который вернёт команда.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для работы с окружением рабочего стола зайдите браузером по адресу:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:6080/vnc.html&lt;br /&gt;
&lt;br /&gt;
мы же там порт забрасывали, при старте контейнера...&lt;br /&gt;
&lt;br /&gt;
В окне, которое загрузится в браузере, ввести пароль. Какой? -- см. выше. Мы его там в переменной окружения задавали, при старте контейнера...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе загрузится стандартное окружение рабочего стола MATE, в котором можно использовать файловый менеджер и непосредственно IDE Lazarus.&lt;br /&gt;
&lt;br /&gt;
Внутри окружения в домашнем каталоге пользователя&lt;br /&gt;
&lt;br /&gt;
 ubuntu&lt;br /&gt;
&lt;br /&gt;
есть каталог&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
Он связан с хостовой системой. Зря мы чтоли создавали этот каталог и потом биндили его при старте контейнера?&lt;br /&gt;
&lt;br /&gt;
Конечно не зря. Через этот каталог хостовая машина может обмениваться с контейнером файлами. А самое главное, что при уничтожении контейнера все ваши ценные файлы останутся на хостовой машине в каталоге&lt;br /&gt;
&lt;br /&gt;
 lazarus&lt;br /&gt;
&lt;br /&gt;
, если вы, конечно, будете хранить ценные файлы именно в каталоге, который из окружения MATE контейнера имеет такой полный путь:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus&lt;br /&gt;
&lt;br /&gt;
(а теперь внимательно смотрим на команду старта контейнера и смотрим где там встречается такая строчка...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Внутри окружения MATE и в непосредственно IDE Lazarus работаем самостоятельно. Вы это умеете :-)&lt;br /&gt;
&lt;br /&gt;
===Порядок работы с IDE Lazarus===&lt;br /&gt;
&lt;br /&gt;
После запуска IDE Lazarus необходимо сразу сохранить проект так, чтобы он в итоге лежал в каталоге:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name&lt;br /&gt;
&lt;br /&gt;
project_name - любое логичное имя вашего проекта.&lt;br /&gt;
&lt;br /&gt;
Также есть вариант наоборот: загружаем в каталог lazarus (тот, который прибиндили в контейнер, см. выше, если непонятно) уже существующий проект, затем открываем его в IDE Lazarus из окружения MATE контейнера.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Работаем над проектом в IDE Lazarus, затем собираем его, сохраняем проект и закрываем IDE Lazarus&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
На этом этапе в &lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name&lt;br /&gt;
&lt;br /&gt;
должен находиться исполняемый файл проекта. Например, если проект вы назвали&lt;br /&gt;
&lt;br /&gt;
 mypr.lpr&lt;br /&gt;
&lt;br /&gt;
, то этот файл будет таким:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name/mypr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Вот примерно такой командой его и можно запустить отдельно от IDE Lazarus. Проверим?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Откройте эмулятор терминала из окружения MATE контейнера и введите там полный путь до исполняемого файла получившейся программы:&lt;br /&gt;
&lt;br /&gt;
 /home/ubuntu/lazarus/project_name/mypr&lt;br /&gt;
&lt;br /&gt;
В результате внутри окружения MATE контейнера должно запуститься ваше приложение, написанное на Lazarus.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Получилось? Если да, то теперь нам не нужо все это тяжёлое окружение в виде MATE и сервера с noVNC. Выключите его. Для этого нужно зайти в терминал контейнера:&lt;br /&gt;
&lt;br /&gt;
 docker attach lazarus_dev&lt;br /&gt;
&lt;br /&gt;
и завершить выполнение сценария, который до этого стартовали, сочетанием клавиш:&lt;br /&gt;
&lt;br /&gt;
 Ctrl + C&lt;br /&gt;
&lt;br /&gt;
вам должно будет вернуться приглашение командной строки контейнера - это признак того что окружение и сервер с noVNC завершены (можете проверить -- в браузере уже ничего не загрузится).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Теперь наша задача - запустить приложение прямо на хостовой машине (но выполняться оно будет в контейнере).&lt;br /&gt;
&lt;br /&gt;
===Делаем образ из контейнера с приложением на Lazarus===&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы запустить получившееся приложение внутри контейнера, но графическую часть его иметь на хостовой машине, нужно запустить еще один контейнер. Однако, из какого образа?&lt;br /&gt;
&lt;br /&gt;
Вероятно, из такого, где оно (приложение на Lazarus) присутствует. У нас есть такой образ?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Верно, нет. У нас есть лишь контейнер, который мы получили на базе подготовленного чистого образа.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Но мы можем теперь легко получить образ на базе нашего контейнера с приложением на Lazarus. Для этого нужно завершить контейнер и выполнить команду в хостовой систиеме:&lt;br /&gt;
&lt;br /&gt;
 docker commit -a Vasya lazarus_dev vpupkin/lazarus_test&lt;br /&gt;
&lt;br /&gt;
Убедиться, что образ создался, можно по прежнему командой:&lt;br /&gt;
 &lt;br /&gt;
 docker images&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
А вот теперь уже можно запустить контейнер на базе образа:&lt;br /&gt;
&lt;br /&gt;
 vpupkin/lazarus_test&lt;br /&gt;
&lt;br /&gt;
, который будет запускать приложение на Lazarus прямо на хостовой системе. Для этого нужно запустить контейнер такой командой:&lt;br /&gt;
&lt;br /&gt;
 docker run --rm -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --mount source=&amp;quot;$(pwd)&amp;quot;/lazarus,target=/home/ubuntu/lazarus,type=bind --name=lazarus_test --hostname=lazarus-test vpupkin/lazarus_test /bin/su -c &amp;quot;/home/ubuntu/lazarus/project_name/mypr&amp;quot; ubuntu&lt;br /&gt;
&lt;br /&gt;
Для успешного запуска графического приложения, работающего в контейнере, с возможностью отображения графического интерфейса, в этой команде сделано две вещи:&lt;br /&gt;
&lt;br /&gt;
Первая: установлена (внутрь контейнера) переменная окружения &lt;br /&gt;
&lt;br /&gt;
 DISPLAY&lt;br /&gt;
&lt;br /&gt;
равная значению аналогичной переменной окружения хостовой системы.&lt;br /&gt;
&lt;br /&gt;
Вторая: проброшено устройство&lt;br /&gt;
&lt;br /&gt;
 /tmp/.X11-unix&lt;br /&gt;
&lt;br /&gt;
из хостовой системы в контейнер.&lt;br /&gt;
&lt;br /&gt;
Также добавлено монтирование каталога lazarus для обмена файлами межу контейнером и хостовой системой, а также добавлена опция&lt;br /&gt;
&lt;br /&gt;
 --rm&lt;br /&gt;
&lt;br /&gt;
которая уничтожает контейнер после его завершения (за данные мы не переживаем, они же лежат локально в каталоге lazarus, который каждый раз монтируется при старте в новый контейнер).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Однако, возможно, не стоит каждый раз содавать контейнер из образа, если изменений в параметрах запуска не требуется?&lt;br /&gt;
&lt;br /&gt;
Достаточно убрать параметр&lt;br /&gt;
&lt;br /&gt;
 --rm&lt;br /&gt;
&lt;br /&gt;
из команды запуска контейнера, но следует помнить, что при завершении графического приложения контейнер будет завершён и запускать его уже нужно будет командой старта контейнера (в этом случае контейнер никуда не девается, а просто лежит на хостовой системе в выключенном состоянии).&lt;br /&gt;
&lt;br /&gt;
И включить его можно (т.е. запустить наше lazarus-приложение) так:&lt;br /&gt;
&lt;br /&gt;
 docker start lazarus_test&lt;br /&gt;
&lt;br /&gt;
===Отвечаем на главный вопрос?===&lt;br /&gt;
&lt;br /&gt;
Вопрос звучит так:&lt;br /&gt;
&lt;br /&gt;
 Если мы уже разработали приложение, то надо ли конечному пользователю все эти окружения MATE, сервер для запуска окружения noVNC и прочие скрипты инициализации, которые использовались для создания контейнера с инструментами разработки?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Наверное нет. Они сильно загружают систему при том, что больше никогда не понадобятся пользователю.&lt;br /&gt;
&lt;br /&gt;
Поэтому для конечного пользователя целесообразно создать новый контейнер, исключив оттуда всё лишнее и оставив лишь непосредственно готовое приложение.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Как это сделать -- см. в лабораторной работе ниже.&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №3] Создание контейнера для запуска приложения на Lazarus==&lt;br /&gt;
Откройте терминал хостовой машины. Если в домашнем каталоге пользователя присутствует каталог&lt;br /&gt;
&lt;br /&gt;
 docker&lt;br /&gt;
&lt;br /&gt;
то переместите его в резервную копию командой:&lt;br /&gt;
&lt;br /&gt;
 mv docker docker_backup1&lt;br /&gt;
&lt;br /&gt;
затем заново создайте рабочий каталог командой:&lt;br /&gt;
&lt;br /&gt;
 mkdir docker&lt;br /&gt;
&lt;br /&gt;
Перейдите в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cd docker&lt;br /&gt;
&lt;br /&gt;
===Создание файлов===&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге создайте файл &lt;br /&gt;
&lt;br /&gt;
 Dockerfile_prod&lt;br /&gt;
&lt;br /&gt;
по следующему шаблону (в файле нужно изменить имя и емэйл разработчика на собственное):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM ubuntu:16.04&lt;br /&gt;
MAINTAINER Vasya I Pupkin &amp;lt;vasya@pupkin.com&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ENV USER ubuntu&lt;br /&gt;
ENV HOME /home/$USER&lt;br /&gt;
&lt;br /&gt;
# Install dependencyes&lt;br /&gt;
RUN apt-get update \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get install -y libgtk2.0-0 \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoclean \&lt;br /&gt;
    &amp;amp;&amp;amp; apt-get autoremove \&lt;br /&gt;
    &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
# Create new user for run app&lt;br /&gt;
RUN adduser $USER --disabled-password&lt;br /&gt;
&lt;br /&gt;
# Copy app to user homedir&lt;br /&gt;
COPY mypr /home/$USER/&lt;br /&gt;
CMD /bin/su -c &amp;quot;/home/ubuntu/mypr&amp;quot; ubuntu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Скопируйте исполняемый файл, полученный в предыдущей работе в рабочий каталог&lt;br /&gt;
&lt;br /&gt;
 cp ../docker_backup1/lazarus/project_name/mypr ./&lt;br /&gt;
&lt;br /&gt;
Мы находимся в новом рабочем каталоге хостовой машины:&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker&lt;br /&gt;
&lt;br /&gt;
В начале этой работы каталог предыдущей работы мы переместили сюда:&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker_backup1&lt;br /&gt;
&lt;br /&gt;
Следовательно, относительно каталога&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker&lt;br /&gt;
&lt;br /&gt;
команда копирования исполняемого файла требует подняться на уровень выше&lt;br /&gt;
&lt;br /&gt;
 ../&lt;br /&gt;
&lt;br /&gt;
и из каталога&lt;br /&gt;
&lt;br /&gt;
 docker_backup1&lt;br /&gt;
&lt;br /&gt;
уровнем выше относительно&lt;br /&gt;
&lt;br /&gt;
 /home/user/docker&lt;br /&gt;
&lt;br /&gt;
скопировать необходимый файл в текущий каталог&lt;br /&gt;
&lt;br /&gt;
 ./&lt;br /&gt;
&lt;br /&gt;
В конце этого этапа в рабочем каталоге должно быть два файла:&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_prod&lt;br /&gt;
 mypr&lt;br /&gt;
&lt;br /&gt;
===Создание образа контейнера===&lt;br /&gt;
&lt;br /&gt;
Далее в этом разделе будем исходить из условия, что ваш логин на https://hub.docker.com/ будет&lt;br /&gt;
&lt;br /&gt;
 vpupkin&lt;br /&gt;
&lt;br /&gt;
а пароль&lt;br /&gt;
&lt;br /&gt;
 ну, вы сами знаете...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ! Также стоит помнить, что в эмуляторе терминала находиться нужно в рабочем каталоге !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для создания Docker-образа (image) выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker build -t 'vpupkin/lazarus_prod:latest' -f Dockerfile_prod .&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Для проверки существования созданного контейнера выполните команду:&lt;br /&gt;
&lt;br /&gt;
 docker images&lt;br /&gt;
&lt;br /&gt;
Среди текста ответа должна появиться строчка с новым контейнером:&lt;br /&gt;
&lt;br /&gt;
 vpupkin/lazarus_prod   latest              20bb2900074d        16 seconds ago      217MB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ! Обратите внимание на размер контейнера !&lt;br /&gt;
 Сравните размер контейнера с размером контейнера lazarus_dev из предыдущей работы&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера на базе образа===&lt;br /&gt;
&lt;br /&gt;
На базе полученного образа запустите контейнер, пробросив внутрь контейнера локальный каталог хостовой машины и пробросив порт для взаимодействия с графической оболочкой контейнера посредством клиента noVNC:&lt;br /&gt;
&lt;br /&gt;
 docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --name=lazarus_prod --hostname=lazarus-prod vpupkin/lazarus_prod&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При запуске контейнера таким образом не указывается команда, т.к. она задаётся в файле&lt;br /&gt;
&lt;br /&gt;
 Dockerfile_prod&lt;br /&gt;
&lt;br /&gt;
строчкой&lt;br /&gt;
&lt;br /&gt;
 CMD /bin/su -c &amp;quot;/home/ubuntu/mypr&amp;quot; ubuntu&lt;br /&gt;
&lt;br /&gt;
Результатом запуска контейнера должно стать запущенное внутри контейнера графическое приложение с отображением графического интерфейса на хостовой машине.&lt;br /&gt;
&lt;br /&gt;
При закрытии окна графического приложения контейнер будет завершён и будет доступен среди списка контейнеров&lt;br /&gt;
&lt;br /&gt;
 docker ps -a&lt;br /&gt;
&lt;br /&gt;
Повторный запуск уже существующего контейнера можно осуществить по имени контейнера командой:&lt;br /&gt;
&lt;br /&gt;
 docker start lazarus_prod&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №4] Взаимодействие двух контейнеров по сети==&lt;br /&gt;
&lt;br /&gt;
Задача: Запустить ПО Moodle в контейнере с именем c2, который взаимодействует с базой данных Mariadb, запущенной в контейнере с именем c1&lt;br /&gt;
&lt;br /&gt;
===Загрузить образы контейнеров===&lt;br /&gt;
&lt;br /&gt;
 docker pull mariadb&lt;br /&gt;
 docker pull bitnami/moodle&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Создание и подготовка контейнера C1===&lt;br /&gt;
Создать контейнер с базой данных Mariadb и задать пароль пользователя root через переменную окружения&lt;br /&gt;
&lt;br /&gt;
 docker run --name=c1 --hostname=c1 -e MYSQL_ROOT_PASSWORD=123321 --network bridge -d mariadb&lt;br /&gt;
&lt;br /&gt;
Создать временный контейнер с ПО Moodle и запустить его с доступом в командную оболочку&lt;br /&gt;
&lt;br /&gt;
 docker run -it --rm --name c2_tmp --network bridge bitnami/moodle:latest /bin/bash&lt;br /&gt;
&lt;br /&gt;
Установить во временный контейнер утилиты проверки состояния сети&lt;br /&gt;
&lt;br /&gt;
 apt update&lt;br /&gt;
 apt install net-tools iputils-ping&lt;br /&gt;
&lt;br /&gt;
Изнутри контейнера c2_tmp проверить доступ в базу данных (для этого нужно убедиться в корректности ip адреса контейнера c1):&lt;br /&gt;
&lt;br /&gt;
1. Посмотреть ip адрес конейнера c2_tmp (если контейнеры были запущены последовательно, то адрес контейнера c1 будет на единицу меньше)&lt;br /&gt;
&lt;br /&gt;
 ifconfig&lt;br /&gt;
&lt;br /&gt;
2. Выполнить&lt;br /&gt;
&lt;br /&gt;
 ping &amp;lt;предполагаемый адрес контейнера c1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
в соседней консоли остановить контейнер c1&lt;br /&gt;
&lt;br /&gt;
 docker stop c1&lt;br /&gt;
&lt;br /&gt;
в предыдущей консоли убедиться что пинги прекратились. Вернуться в соседнюю консоль. Запустить контейнер c1&lt;br /&gt;
&lt;br /&gt;
 docker start c1&lt;br /&gt;
&lt;br /&gt;
в предыдущей консоли убедиться что пинги возобновились.&lt;br /&gt;
&lt;br /&gt;
3. Выполнить проверку подключения к Mariadb посредством клиента mysql в контейнере c2_tmp&lt;br /&gt;
&lt;br /&gt;
 mysql -u root -p&amp;lt;пароль, установленный в переменной окружения при запуске контейнера c1&amp;gt; -h &amp;lt;корректный ip адрес контейнера c1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Создать базу пользователя и базу данных Mariadb для работы Moodle (из консоли mysql, предварительно подключившись к ней под пользователем root)&lt;br /&gt;
&lt;br /&gt;
 CREATE DATABASE mdatabase;&lt;br /&gt;
 CREATE USER 'muser'@'%' IDENTIFIED BY '123456';&lt;br /&gt;
 GRANT ALL PRIVILEGES ON mdatabase.* to 'muser'@'%' WITH GRANT OPTION;&lt;br /&gt;
&lt;br /&gt;
5. Проверить корректность подключения к Mariadb с созданным пользователем к созданной базе данных&lt;br /&gt;
&lt;br /&gt;
 mysql -u muser -p123456 -h &amp;lt;корректный ip адрес контейнера c1&amp;gt; mdatabase&lt;br /&gt;
 &lt;br /&gt;
6. Выйти из временного контейнера c2_tmp&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
===Запуск контейнера C2 с ПО Moodle===&lt;br /&gt;
&lt;br /&gt;
Поскольку в предыдущем пункте были подготовлены параметры доступа в базу данных Mariadb, используем их для запуска контейнера с ПО Moodle&lt;br /&gt;
&lt;br /&gt;
 docker run -d --name c2 -p 8080:8080 -p 8443:8443 --env ALLOW_EMPTY_PASSWORD=no --env MOODLE_DATABASE_USER=muser --env MOODLE_DATABASE_PASSWORD=123456 --env MOODLE_DATABASE_NAME=mdatabase --env MOODLE_DATABASE_HOST=&amp;lt;корректный ip адрес контейнера c1&amp;gt; --env MOODLE_USERNAME=user --env MOODLE_PASSWORD=123321 --env MOODLE_EMAIL=user@host.com --env MOODLE_SITE_NAME=user_moodle --network bridge bitnami/moodle:latest&lt;br /&gt;
&lt;br /&gt;
Проверка: Открыть в браузере адрес:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8080&lt;br /&gt;
&lt;br /&gt;
Ввести логин и пароль от ПО Moodle, указанные ранее в переменных окружения при старте контейнера.&lt;br /&gt;
&lt;br /&gt;
Подробное описание по контейнеру: https://hub.docker.com/r/bitnami/moodle&lt;br /&gt;
&lt;br /&gt;
 Важно! Первые несколько минут ПО Moodle не будет доступно по указанному адресу http://localhost:8080&lt;br /&gt;
 т.к. будет выполняться его первое развёртывание.&lt;br /&gt;
&lt;br /&gt;
Проследить процесс развёртывания можно внутри базы данных в контейнере c1, подключившись к ней с хостовой машины&lt;br /&gt;
&lt;br /&gt;
 mysql -u muser -p123456 -h &amp;lt;корректный ip адрес контейнера c1&amp;gt; mdatabase&lt;br /&gt;
&lt;br /&gt;
и из консоли mysql проверить наличие таблиц в базе данных&lt;br /&gt;
&lt;br /&gt;
 show tables&lt;br /&gt;
&lt;br /&gt;
===Самостоятельное задание===&lt;br /&gt;
&lt;br /&gt;
Используя справку по утилите docker запустить два аналогичных контейнера, установив статические ip адреса для них.&lt;br /&gt;
&lt;br /&gt;
==[Практическая работа №5] Взаимодействие двух контейнеров по сети==&lt;br /&gt;
&lt;br /&gt;
Создайте рабочий каталог и перейдите в него&lt;br /&gt;
&lt;br /&gt;
 mkdir composemoodle&lt;br /&gt;
 cd composemoodle&lt;br /&gt;
&lt;br /&gt;
Создайте файл&lt;br /&gt;
&lt;br /&gt;
 docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
со следующим содержимым&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
version: &amp;quot;2.2&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  mariadb:&lt;br /&gt;
     image: &amp;quot;mariadb:latest&amp;quot;&lt;br /&gt;
     environment:&lt;br /&gt;
      - MYSQL_ROOT_PASSWORD=123321&lt;br /&gt;
      - MYSQL_ALLOW_EMPTY_PASSWORD=no&lt;br /&gt;
      - MYSQL_DATABASE=mdatabase&lt;br /&gt;
      - MYSQL_USER=muser&lt;br /&gt;
      - MYSQL_PASSWORD=123456&lt;br /&gt;
  moodle:&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;8080:8080&amp;quot;&lt;br /&gt;
      - &amp;quot;8443:8443&amp;quot;&lt;br /&gt;
    image: &amp;quot;bitnami/moodle:latest&amp;quot;&lt;br /&gt;
    environment:&lt;br /&gt;
      - ALLOW_EMPTY_PASSWORD=no&lt;br /&gt;
      - MOODLE_DATABASE_USER=muser&lt;br /&gt;
      - MOODLE_DATABASE_PASSWORD=123456&lt;br /&gt;
      - MOODLE_DATABASE_NAME=mdatabase&lt;br /&gt;
      - MOODLE_DATABASE_HOST=mariadb&lt;br /&gt;
      - MOODLE_USERNAME=user&lt;br /&gt;
      - MOODLE_PASSWORD=123321&lt;br /&gt;
      - MOODLE_EMAIL=user@host.com&lt;br /&gt;
      - MOODLE_SITE_NAME=user_moodle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В результате в рабочем каталоге должен быть файл:&lt;br /&gt;
&lt;br /&gt;
 docker-compose.yml&lt;br /&gt;
&lt;br /&gt;
В рабочем каталоге выполнить команду для запуска проекта&lt;br /&gt;
&lt;br /&gt;
 docker-compose up&lt;/div&gt;</summary>
		<author><name>Avolkov</name></author>
		
	</entry>
</feed>