Параллельные вычисления на raspberry pi. Создаём систему развертывания приложений с помощью Docker Технические характеристики Cluster HAT

Используется энтузиастами для самых различных целей. Так, например энтузиаст Дэвид Гилл (David Guill) решил использовать его для постройки кластера - группы компьютеров, соединенных между собой и представляющих, с точки зрения пользователя, единый аппаратный ресурс. Проект решено было назвать 40-Node Raspi Cluster. Стоит заметить, что кластер Дэвиду был необходим для того, чтобы набраться опыта в программировании на распределенных системах, так что кластер из Raspberry Pi будет заменять собой, на время обучения, настоящий супер-компьютер.

По простому можно было бы собрать кластер из Raspberry Pi, используя вместо корпуса стелаж или недорогой шкаф (как в случаи с ), но поскольку Дэвид увлекается моддингом, то и кластер он решил сделать стильный, максимально приближенный по своему виду и удобству к серийным решениям. И, надо сказать, у Дэвида это получилось, ведь его проект намного более продуман, чем многие серийные корпуса. Кстати, сделан корпус проекта 40-Node Raspi Cluster из акриловых панелей, нарезанных по размеру с помощью лазера и склеенных вручную.

Основными отличительными особенностями проекта 40-Node Raspi Cluster стали: крутой внешний вид, достаточно компактный размер (как большая башня), удобный доступ ко всем компонентам и возможность их замены без необходимости разбирать корпус, безвинтовое крепление частей коруса и многих комплектующих, а также порядок в проводах (а их в данном проекте ой как не мало). Данный проект включает в себя 40 компактных компьютеров Raspberry Pi (40 ядер Broadcom BCM2835 с частотой 700 МГц, 20 ГБ распределенной оперативной памяти), два 24-портовых свитча, один блок питания форм-фактора ATX, пять жестких дисков емкостью по 1 ТБ (с возможностью расширения до 12 штук), 440 ГБ флеш-памяти, а также роутер с возможностью беспроводного подключения.


Компьютеры Raspberry Pi в данном проекте сгруппированы по четыре штуки на кастомных акриловых креплениях, которых в данном проекте десять штук. Благодаря такому креплению (как в блейд-серверах), обеспечивается удобный доступ и легкая замена компактных компьютеров. Для каждого блейда с Raspberry Pi предусмотрен свой компактный DC-DC преобразователь, питающийся от общего ATX блока питания. Охлаждение кластера реализовано с помощью четырех 140 мм вентиляторов, за которыми установлены фильтры.

Дополнительной «моддинговости» проекту 40-Node Raspi Cluster добавляет обилие светодиодов - их в проекте более трех сотен (на мини-компьютерах, свитчах, роутерах и вентиляторах), при этом в процессе работы они будут мигать в соответствии с нагрузкой. Размеры данного проекта составляют 25 х 39 х 55 см, а примерная стоимость постройки - 3000 долларов.

С внешним и внутренним видом, а также с особенностями, проекта 40-Node Raspi Cluster вы можете ознакомиться по прикрепленным фото и видео. Если же данный проект вас заинтересовал, то ознакомиться с ним детальней, а Дэвид описал постройку этого монстра очень детально, можно посетив соответствующую заметку на его личном сайте.

Введение

Основополагающими затратами в области вычислений являются мощности компьютеров и их энергопотребление. Современные суперкомпьютеры занимают огромное пространство и потребляют сотни тысяч ватт.

Большой проблемой в этом случае является процесс обучения параллельному программированию и выполнению расчетов на суперкомпьютерах и тем более – управлению такого типа компьютерами, поскольку непосредственного доступа к ним у обучающихся, как правило, нет.

В данной работе предлагается для решения данной проблемы использовать одноплатные микрокомпьютеры, недавно появившиеся на рынке компьютерной техники (Paspberry Pi и аналоги). На их основе можно собрать недорогой вычислительный кластер и обучать студентов основам параллельного программирования. Таким образом, цель этой работы – создание недорогого учебного кластера из микрокомпьютеров для разработки и внедрения в учебный процесс алгоритмов параллельного программирования. Демонстрируется пример параллельных вычислений в разработанном учебном кластере.

Raspberry Pi – микрокомпьютер разработанный компаний Raspberry Pi Foundation. Маленький, размером с банковскую карту, он представляет собой полноценный одноплатный компьютер (System - on - a - Chip ). Процессор (в модели PI 3): 4 ядра ARM Cortex-A53 x64 . Операционная система по умолчанию Raspberian (основанная на Linux ядре). При цене всего в 35$ у платы есть все нужные интерфейсы (Wi - Fi , Bluetooth , Usb , Ethernet ), а также большой набор готовых программ для любого вида деятельности . Именно поэтому для небольшого учебного вычислительного кластера были выбраны эти микрокомпьютеры.

Понятие кластера и кластерных вычислений

Общеизвестно, что кластер – это группа компьютеров, объединённых высокоскоростными каналами связи, представляющая с точки зрения пользователя единый аппаратный ресурс . С другой стороны, кластер – это слабо связанная совокупность нескольких вычислительных систем, работающих совместно для выполнения общих программных приложений . Для того чтобы связать несколько raspberry PI в кластер, была собрана типовая кластерная вычислительная система (маршрутизатор, кабели Ethernet, USB и др.) на базе процессора PI 3 (рис. 1).

Рисунок 1. Кластерная вычислительная система на базе процессора из двух PI 3

Демонстрация параллельных вычислений

Для наглядной демонстрации возможностей кластера из двух PI 3 была выбрана среда программирования Python 2 и реализация алгоритма сортировка массива методом слияния. Компьютеры были объединены локальной сетью. Для упрощения составления кластера из нескольких R PI существует много готовых программ, одна из которых называется “mpi4py” .

Программный код сортировки массива слиянием на языке Python выглядит следующим образом:

def merge(left,right): #merges 2 sorted lists together

#Goes through both lists

while i < len(left)and j < len(right):

#Adds smaller element of the lists to the final list

if left[i] <= right[j]:

result.append(left[i])

result.append(right[j])

result += left

result += right

def mergesort(lst):

#if there"s only 1 element, no need to sort

if len(lst)< 2:

#breaks down list into 2 halves

middle = len(lst)/ 2

#recursively splits and sorts each half

left = mergesort(lst[:middle])

right = mergesort(lst)

#merges both sorted lists together

return merge(left, right)

Алгоритм работы программы состоит из следующей последовательности действий:

1. На PI 3 (сервер) генерируется случайный массив чисел.

2. Данный массив разбивается на n частей, по количеству процессоров в локальной сети.

3. С помощью модуля socket и локальной сети Pi3 (сервер) передает часть массива Pi3 (клиент).

4. Pi3 (сервер) сортирует свою часть массива и ждет ответа Pi3 (клиент).

5. Pi3 (клиент) сортирует свою часть массива и передает ее Pi3 (сервер).

6. Pi3 (сервер) получает отсортированную часть массива и выполняет конечную сортировку.

Расчеты показали, что для сортировки массива из 500 тысяч элементов одному Pi3 потребовалось около 23 секунд. После добавления второго Pi3 это время уменьшилось до 16 секунд. Прирост скорости нелинейный, но чем больше будет в кластере компьютеров, тем меньше будет затрачиваемое время.

Заключение

Одноплатные компьютеры лишь недавно вышли за пределы сегмента устройств для автоматизации производства и начали завоевывать массовый рынок. Их небольшие размеры, небольшое энергопотребление и достаточно высокие вычислительные возможности способны сделать их основой для реализации различных проектов, например, обучение параллельному программированию. Особенностью, представленной кластерной вычислительной системы на базе raspberry PI 3, является хорошая масштабируемость, определяемая возможностями коммутационного оборудования, невысокая стоимость, возможность применения бесплатно распространяемого программного обеспечения, что важно при внедрении в учебный процесс. Проведенная демонстрационная работа показывает, что кластер даже из двух PI 3 способен ускорить вычисление простой, но одновременно и объемной задачи, такой как сортировка большого массива данных.

В перспективе планируется увеличить в вычислительной системе число микрокомпьютеров и провести сравнение производительности криптографических алгоритмов, в частности, планирующихся использовать для шифрования/расшифрования изображений (фото-, аеро-, космо- изображений) большого объема и передаче их по сети Интернет.

Список литературы :

  1. Robert Mullins/ Distributed computed //University Cambridge. – 2012. – http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/distributed-computing/ .
  2. Кластер. – Режим доступа. – URL: https://ru.wikipedia.org/wiki/Кластер (дата обращения 25.02.2017).
  3. Лукин В.В., Марчевский И.К. Учебно-экспериментальный вычислительный кластер. Ч. 1. Инструментарий и возможности. – Режим доступа. – URL: https://elibrary.ru/download/elibrary_17091004_33209664.pdf (дата обращения 25.02.2017).

Raspberry Pi 3 возможно назвать по-настоящему универсальным компьютером. Bitcoin, конечно, на нём намайнить не получится, да и в игры с графикой консолей последних поколений поиграть не выйдет, но вот со многим остальным он хорошо справится. Ниже, в свою очередь, будет рассмотрены основные и наиболее популярные варианты применения Raspberry Pi 3.

Мультимедийные возможности Raspberry Pi 3

Возможности Raspberry Pi 3 в области мультимедиа очень велики. В частности, на основе "Малины" можно сделать мультимедийный центр, игровую консоль либо даже всё сразу. В результате с этим одноплатником можно получить на своем телевизоре с HDMI-портом доступ к следующим категориям развлечений:

  • видео в высоком разрешении на YouTube или других хостингах;
  • музыке на стриминговых сервисах;
  • игровым стримам на, например, Twitch;
  • играм, разработанным для старых консолей : NES, SNES, SEGA и др.

Чтобы просматривать и прослушивать мультимедийный контент, можно либо использовать браузер, либо, что еще более удобно - установить специальный медиаплеер. Наиболее функциональным и удобным из них является Kodi .

Для превращения "Малины" в игровую консоль нужно поставить на неё эмуляторы интересующих платформ и заказать игровые Rom-ы. Это делается за пару десятков минут. А еще проще и удобнее - инсталлировать специальный дистрибутив, например, Retro Pie или какой-то другой.

Разработка и работа с документами на RPi

Конечно, "Малина" - не самый мощный компьютер, а значит - не лучшее решение для работы. Но при желании на ней более или менее комфортно можно посмотреть/отредактировать какой-то документ или даже написать скрипт. Конечно, работать с тяжелыми IDE на ней не получится, но этого от RPi никто и не требует.

Также с помощью RPi3 можно «посерфить» в интернете или пообщаться в мессенджерах либо социальных сетях.

Сервер для любых нужд из Raspberry Pi 3

Еще один вариант, как можно использовать Raspberry Pi 3 - это сделать из него сервер. Так, достаточно поставить на него LAMP или просто Apache и Myphpadmin, после чего можно будет разрабатывать и тестировать веб-проекты в условиях достаточно ограниченных ресурсов.

Второй вариант - скачивать и раздавать с Raspberry Pi 3 torrent. Для этого, конечно, потребуется внешний жесткий диск, так как карты памяти и флэшки для данных целей не очень подходят как из-за ограничений скорости и маленького объема, так и ввиду быстрой изнашиваемости при интенсивных нагрузках.

Применение "Малины" в робототехнике и IoT

В IoT и робототехнике применение RPi практически безгранично. Из этого устройства можно сделать, например, камеру видеонаблюдения, небольшую метеостанцию, машинку с удаленным управлением и многое другое. Так, Raspberry Pi 3 находит применение в машине в виде видеорегистратора. При желании из данного одноплатника можно сделать даже мобильный телефон или смартфон. Но такое стоит делать либо ради экспериментов, либо, чтобы похвастаться перед друзьями/сообществом. Дело в том, что соответствующее устройство получится как минимум довольно громоздким.

Конечно, для данных целей понадобятся модули. Но с их покупкой проблем не должно возникнуть. В Сети существует множество магазинов, которые продают дополнительные компоненты для "Малины" по доступным ценам.

Объединение нескольких RPi 3 в кластер

Ещё один способ применения Raspberry Pi 3 - объединение нескольких таких устройств в кластер. Это довольно специфический способ использования, который подойдет далеко не каждому.

Для начала следует дать краткое и понятное объяснение, что такое кластер. В общих чертах под этим термином понимается комплекс однородного оборудования (в данном случае множество RPi), на которых параллельно выполняется какая-то задача.

Делать кластер из "Малины" для реализации чего-то серьезного практического смысла нет, так как есть более дешёвые и удобные решения. Объединение Raspberry Pi 3 в кластер целесообразно по большей части для обучения. Имея несколько одноплатников, можно разобраться с особенностями параллельных вычислений или показать как они работают ребёнку (собственно, RPi и создавался для обучения детей).

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

Вполне возможно, что это самый дешёвый и доступный кластер, построенный в домашних условиях.
В данный момент он считает задачки seti@home.

Сборка

Сборка не составляет особого труда - вот список материалов для повторения:

  • 4 платы OrangePi PC (One тоже подойдет) с кабелями питания
  • 16 стоек для печатных плат для крепления между собой
  • 4 стойки (коротких) для крепления на подставку или использования в качестве ножек
  • 2 куска оргстекла (верхняя и нижняя крышка)
  • Вентилятор 92 мм
  • 4 уголка для крепления вентилятора
  • 100Mbs Ethernet HUB, желательно с питанием либо 5, либо 12 вольт
  • Патчкорды для соединения Ethernet в необходимом количестве (кстати, поскольку сеть все равно 100 МБит, можно использовать 4х-жильную телефонную лапшу и немного сэкономить на кабеле)
  • Источник питания (об этом позже)
  • Для связи с внешним миром - дешёвый USB WiFi

Скручиваем вместе четыре платы, крепим верхнюю и нижнюю крышки, ставим вентилятор с использованием уголков. На верхнюю крышку водружаем хаб и соединяем наш всё вместе через Ethernet.

А вот так “изделие” выглядит “с тыльной стороны”.

К сожалению, синей изоленты не было - так что хаб крепим резиночками.

Питание

Каждая из OPI потребляет не меньше ампера (производитель рекомендует источник не меньше 1.5…2A). Вентилятор требует 12 вольт, хаб тоже, хотя бывают и 5-вольтовые модели.

Так что потребуется хороший источник питания с двумя напряжениями.

Старый компьютерный вполне подойдет, но лучше использовать современный безвентиляторный импульсный источник, например от MeanWell.

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

Для “раздачи” 5ти вольт будем использовать модифицированный USB-хаб из дешевых. Для этого можно либо высверлить чип, либо просто отрезать ножки данных, оставив только цепи питания и землю. Я остановился на втором способе, правда внутри проложил еще “толстые” соединения на линии 5В. Ну и повесим ответный molex для соединения с БП. Получается примерно так:

А вот вся конструкция в сборе:

Система

Вообще, это просто “маленькая локальная сеть из 4х компьютеров”.
В качестве базовой системы - обычный Debian, о котором уже много говорили .

Сеть

Самый верхний узел - clunode0, он умеет соединяться по WiFi с внешней сетью, при этом раздает “интернет” на машины clunode1, clunode2, clunode3. Там же работает сервер NFS для общего хранилища и dnsmasq для раздачи DHCP адресов вида 10.x.x.x.

На clunode0 в /etc/network/interfaces примерно такая запись:

1
2
3
4
5
6
7
8
9
10
11
12
13
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-key-mgmt WPA-PSK
wpa-proto RSN WPA
wpa-pairwise CCMP TKIP
wpa-group CCMP TKIP
wpa-ssid "MyWiFi"
wpa-psk "MyWiFiPassword"
post-up /usr/local/bin/masquerade.sh eth0 wlan0
iface default inet dhcp

Хотя, вроде как там ситуация переломилась и бинарник можно сгрузить с сайта. Не проверял - проще было собрать самому.

Еще можно установить и настроить консольную утилиту boinctui . Выглядит всё вполне пристойно (animated GIF):

Перспективы

Можно развить идею - вот навскидку несколько идеек:

  • Первая плата (clunode0) - load balancer, сlunode2,3 - веб-сервера или приложение, clunode4 - БД ==> микродатацентр:)
  • Hadoop (и такие случаи уже есть, народ строит кластеры на Raspberry)
  • Proxmox кластер, правда я не уверен, что все запчасти доступны для ARM
  • Майнер cryptocurrency, если конечно подберете криптовалюту, которую всё еще выгодно майнить на процессоре и выгодно майнить вообще.

Спасибо, что дочитали до конца.

Сегодня речь пойдёт о замечательном инструменте, а именно о контейнерной системе развертывания приложений - Docker. Разработчиков для Raspberry Pi тема касается непосредственно. Добро пожаловать под кат.

1. Что такое Docker

Возможно не все знакомы с системами развертывания. Поэтому я поясню.

Говоря совсем простым языком, Docker - это такая система, которая позволяет один раз настроить приложение на одной машине, сохранить его окружение (не только конфигурацию, а именно и окружение тоже) и зависимости, дальше распространять его уже настроенным в виде контейнера. Т.е. для развертывания ничего не понадобится кроме образа.

Также вы можете где-нибудь увидеть слова "Docker" и "виртуализация" в одном предложении, это не значит что Docker эмулирует процессор, память, ядро ОС и т.д., виртуализация происходит на уровне ядра т.е. все "виртуализируемые" им процессы являются реальными процессами вашей ОС.

Как вы уже догадались можно придумать массу применений. Например, вы собираетесь сделать кластер Raspberry Pi, который будет майнить биткоины (кстати, это нерентабельно в наши дни) и на каждую из 1000 имеющихся в арсенале плат вы должны установить и настроить один и тот же софт. Да, можно скомпилировать свой образ ОС, но это во-первых не так быстро, во-вторых это не так гибко (конфигурация чуть-чуть поменялась и надо пересобирать весь образ ОС).

Или, например, вы хотите распространять ваше приложение под несколько модификаций одноплатных компьютеров: Rpi1, Rpi2, O-droid, Rpi3. Везде одна и та же структура приложения, один и тот же исполняемый код, но конфигурация отличается. Вы можете создать 3,4 отдельных мануала для пользователей по установке и настройке, а потом вам это надоест и вы создадите N различных, уже настроенных конфигураций вашего приложения под самые популярные платформы и будете распространять их виде контейнеров.

Это то что я придумал навскидку. На самом деле Docker это очень-очень мощный инструмент, применений ему можно найти неограниченное количество.

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

Ладно, вводная часть что-то слишком затянулась. Перейдем к делу.

2. Установка

Если вы устанавливаете систему с нуля, то возможно рациональнее воспользоваться уже готовым образом от команды Hypriot.

Большинство пользователей не будет переустанавливать систему из-за того что хотят попробовать Docker. Поэтому ниже будет приведен процесс установки на Raspbian.

0. Если у вас старая версия Raspbian, обновляемся до новой т.к. с версии Debian 8 появилась поддержка ядра Docker "из коробки":

$ sudo sed -i "s/wheezy/jessie/" /etc/apt/sources.list $ sudo sed -i "s/wheezy/jessie/" /etc/apt/sources.list.d/raspi.list $ sudo apt-get update && sudo apt-get -y upgrade # answer "y" to upcoming questions $ sudo sudo apt-get -y dist-upgrade # answer "y" to upcoming questions $ sudo init 6 $ sudo apt-get -y autoremove $ sudo apt-get -y purge $(dpkg -l | awk "/^rc/ { print $2 }") $ sudo init 6

1. На официальном сайте отсутствует мануал с описанием установки на Raspberry Pi, но команда Hypriotпроделала большую работу по автоматизации установки Docker на Raspberry. Воспользуемся плодами их труда:

$ git clone https://github.com/hypriot/rpi-docker-builder.git $ cd rpi-docker-builder $ sudo sh build.sh $ sudo sh run-builder.sh

После этого пакет для установки Docker вы найдете в каталоге./dist/docker-hypriot_1.10.3-1_armhf.deb. На данный момент это последняя версия.

Ленивые могут воспользоваться готовыми пакетами от Hypriot:

$ curl -sSL http://downloads.hypriot.com/docker-hypriot_1.10.3-1_armhf.deb >/tmp/docker-hypriot_1.10.3-1_armhf.deb $ sudo dpkg -i /tmp/docker-hypriot_1.10.3-1_armhf.deb $ rm -f /tmp/docker-hypriot_1.10.3-1_armhf.deb $ sudo sh -c "usermod -aG docker $SUDO_USER" $ sudo systemctl enable docker.service

2. Проверка работоспособности

Sudo docker info

Docker version

Выведет информацию о версии, количестве контейнеров, версии ядра, драйверов и т.д.

3. Теперь любое приложение, которое есть в виде docker-контейнера для ARM, можно устанавливать с помощью docker run на Raspberry Pi.

Следующая команда скачает и развернёт небольшой уже настроенный веб-сервер:

Docker run -d -p 80:80 hypriot/rpi-busybox-httpd

Список контейнеров можно посмотреть с помощью

Docker ps

3. Использование

Можно, конечно, описывать основные команды и прочее, но за этим лучше обращаться к документации.

Поэтому мы рассмотрим на примере.

Предположим мы хотим собрать контейнер в котором будет веб сервер NGinx и PHP 5.4.

В начале пишется инструкция по сборке образа. Листинг файла с комментариями приведен ниже.

src: build/backend/Dockerfile

# Используем за основу контейнера Ubuntu 14.04 LTS FROM ubuntu:14.04 # Переключаем Ubuntu в неинтерактивный режим - чтобы избежать лишних запросов ENV DEBIAN_FRONTEND noninteractive # Устанавливаем локаль RUN locale-gen ru_RU.UTF-8 && dpkg-reconfigure locales # Добавляем необходимые репозитарии и устанавливаем пакеты RUN apt-get install -y software-properties-common RUN add-apt-repository -y ppa:ondrej/php5-5.6 RUN add-apt-repository -y ppa:nginx/stable RUN sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y wget curl php5-fpm php5-mysql php5-gd php5-curl php-pear php-apc php5-mcrypt php5-imagick php5-memcache supervisor nginx # Добавляем описание виртуального хоста ADD iloverpi.ru /etc/nginx/sites-enabled/iloverpi.ru # Отключаем режим демона для Nginx (т.к. запускать будем сами) RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf # Отключаем режим демона для php-fpm RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf # Добавляем конфиг supervisor (описание процессов, которые мы хотим видеть запущенными на этом контейнере) ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Объявляем, какие директории мы будем подключать VOLUME ["/var/www"] # Объявляем, какой порт этот контейнер будет транслировать EXPOSE 80 # Запускаем supervisor CMD ["/usr/bin/supervisord"]

src: build/backend/supervisord.conf

Nodaemon=true loglevel=debug command=/usr/sbin/nginx autorestart=true command=/usr/sbin/php5-fpm autorestart=true

Полный список команд с пояснениями доступен по ссылке .

Теперь, используя эту инструкцию, собираем образ iloverpi.ru.

Sudo docker build -t iloverpi.ru ~/PATH_TO_DOCKERFILE_DIR

Образ iloverpi.ru надо запустить, тем самым создав контейнер. Помимо этого требуется связать 80 порт хоста с 80 портом контейнера. Для удобства и полноты примера также свяжем /var/www хоста и /var/www контейнера.

$ sudo docker run -v /var/www:/var/www -p 80:80 -м -t iloverpi.ru

Убеждаемся что контейнер запущен:

Sudo docker ps | grep "iloverpi.ru"

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

У меня вывод предыдущей команды выглядит так:

D8429cc192c0 astgo.ru/dev:latest "/usr/bin/supervisor 20 seconds ago Up 19 seconds 0.0.0.0:80->80/tcp container23

Здесь "container23" - имя контейнера.

Для взаимодействия с командной строкой контейнера существует команда

Sudo docker exec -i -t container23 bash

После этого станет доступно обычное приглашение командной строки. Это и будет консоль нашего контейнера.

Итак, мы собрали и развернули свой контейнер, научились с ним взаимодействовать.

Статья получилась длинной, но надеюсь Вам было интересно. До новых встреч.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.