Семинар 0 · Введение в робототехнику
Откройте Docker Desktop и дождитесь его запуска.
Затем откройте терминал.
Посмотреть справку Docker
docker --help
Скачать образ Ubuntu 24.04
docker pull ubuntu:24.04
После скачивания образ появится во вкладке Images в Docker Desktop.
Подготовленный образ с программой и её окружением
Используем согласованную среду, а не настраиваем каждый компьютер вручную.
Запускаем программу в среде, соответствующей той, где она будет работать.
Развёртываем проверенный образ вместо повторной установки программы и зависимостей.
Подготовленные файлы и программы,
из которых создают контейнер.
Отдельная рабочая среда,
созданная из образа.
Установка программы в А не меняет контейнер Б и исходный образ.
/tmp/result.txtСоздали файл внутри контейнера
Удалили контейнер —
этот файл пропал.
Папка project смонтирована в /work
/work/result.txtproject/result.txtДва пути к одному файлу
Удалили контейнер —
файл остался в папке компьютера.
Изменение или удаление файла в смонтированной папке видно с обеих сторон.
Остановка контейнера, в отличие от удаления, сохраняет его файлы.
При запуске контейнера запускается выбранная программа.
Файлы и библиотеки Ubuntu
Файлы и библиотеки проекта
Управляет процессами, памятью и доступом к устройствам
Файлы и процессы у контейнеров свои, ядро Linux — общее.
Контейнеры используют ядро
установленной Linux-системы.
Docker Desktop запускает Linux-среду.
В ней работают несколько контейнеров.
Текстовый файл с инструкциями для сборки образа.
FROM ubuntu:24.04
RUN apt-get update && \
apt-get install -y git
WORKDIR /work
CMD ["bash"]FROMRUNWORKDIRCMDБерём Ubuntu, устанавливаем Python и добавляем страницу сервера.
FROM ubuntu:24.04
RUN apt-get update && \
apt-get install -y python3
COPY index.html /opt/s1-http/index.html
CMD ["python3", "-m", "http.server", "8000", \
"--bind", "0.0.0.0", \
"--directory", "/opt/s1-http"]COPYКопирует файл index.html
в образ при сборке.
CMDПри запуске контейнера
стартует HTTP-сервер.
В первом примере работает Bash, во втором — сервер, который ждёт запросы.
ubuntu:24.04 — короткая запись полного имени:
docker.io/library/ubuntu:24.04docker.ioRegistry — Docker Hub
libraryОфициальные образы
ubuntuИмя образа
24.04Тег версии
Под одним тегом доступны варианты для разных процессоров:
linux/amd64x86-64: процессоры AMD и Intel
linux/arm64ARM64: например, Apple Silicon
Явно выбираем вариант, например для ARM64:
docker pull --platform linux/arm64 docker.io/library/ubuntu:24.04Без --platform Docker выбирает платформу своей среды запуска.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]OPTIONSПараметры Docker
IMAGEИз какого образа создать контейнер
COMMAND ARG...Какую программу запустить
docker run --rm ubuntu:24.04 cat /etc/os-releasecat покажет сведения об Ubuntu. После завершения контейнер удалится.
Если программу не указать, используется команда по умолчанию из образа.
Справка: docker run --help
docker run -it --name s1-ubuntu ubuntu:24.04 bash-i-t-it объединяет -i и -t--name s1-ubuntus1-ubuntu--rm-d-w /work/work контейнера-e ROBOT_NAME=demoROBOT_NAMEПолный список параметров: docker run --help
docker run -it --name s1-ubuntu ubuntu:24.04 bashВ открывшемся Bash создайте файл:
touch /tmp/seminar-markerdocker exec -it s1-ubuntu bashВо втором Bash проверьте файл:
ls /tmp/seminar-markerДва процесса Bash работают в одном контейнере и видят его файлы.
docker rundocker startdocker execdocker ps
docker ps -aРаботающие / все, включая остановленные
docker start -ai s1-ubuntuТот же контейнер, созданный ранее файл сохраняется.
-v "$(pwd):/work:ro"/work:ro — только чтение-w /work-e ROBOT_NAME=demo--env-file .env.env-p 127.0.0.1:8080:80008080 компьютера8000 контейнера--network noneПараметры Docker указываются перед именем образа.
--cpus 2--memory 1g--user 1000:1000--gpus all--device /dev/ttyUSB0--platform linux/amd64GPU, устройства и эмуляция требуют поддержки среды запуска.
Все параметры: docker run --help
Bind mount делает папку компьютера доступной внутри контейнера.
seminar-01/workПараметры команды docker run:
-v "$(pwd):/work"Слева — текущая папка компьютера; справа — путь внутри контейнера.$(pwd) — запись для macOS / Linux.
-w /workНачать работу в папке /work внутри контейнера.
Файлы не копируются: изменения видны с обеих сторон.
-p 127.0.0.1:8080:8000Компьютер :8080
↓
Контейнер :8000
127.0.0.1 — доступ только
с этого компьютера.
--network hostНа Linux контейнер использует
сетевое пространство компьютера.
Публикация через -p не нужна.
Конфликты портов — общие.
Публикация порта не запускает программу.
В Docker Desktop режим host требует отдельного включения.
Команды управления существующим контейнером:
docker logs --tail 5 s1-ubuntudocker logs -f s1-ubuntudocker stop s1-ubuntudocker ps -astop не удаляет контейнер и его файлы.Ctrl+C при просмотре логов завершает просмотр, а не контейнер.
Параметры запуска можно записать в файл compose.yaml.
services:
workspace:
image: ubuntu:24.04
command: bash
stdin_open: true
tty: true
volumes: [".:/work"]
working_dir: /workЭто отдельный пример конфигурации. Сейчас его не запускаем.
Скачайте файлы практики, распакуйте архив.
Откройте терминал в папке seminar-01.
macOS / Linux:
docker run -it --name s1-class -v "$(pwd):/work" -w /work ubuntu:24.04 bashВнутри контейнера:
pwd
bash /work/prepare-files.sh
touch /work/scratch/from-container.txtПроверьте файл на компьютере: seminar-01/scratch/from-container.txt.
Этот контейнер сохраняем для практики по Unix и Git.
Выполняем в Bash контейнера s1-class.
unminimize
apt-get update
apt-get install -y git nano less man-db manpages python3unminimize восстанавливает справочные страницы Ubuntu.
На запросы подтверждения отвечаем y.
Проверяем справку:
man wcКлавиша q — вернуться из справки в Bash.
lsПоказать содержимое
-lВ подробном формате
/workПапки /work
У опции может быть значение:
head-n5-nmethane.pdbПоказать первые 5 строк файла methane.pdb.
Текущая папка: /work
pwdГде я нахожусь?
lsЧто лежит в этой папке?
cd путьПерейти в другую папку
cd /work/shell-lesson-dataОт корня /.
Не зависит от текущей папки.
cd shell-lesson-dataОт текущей папки — здесь /work.
Зависит от того, где мы находимся.
Из /work обе команды ведут в одну папку.
. — текущая папка.. — родительская~ — домашняяТекущая папка: /work
alkanes в данных урока и перейдите в него.В найденной папке должны быть файлы .pdb.
Из папки /work:
cd shell-lesson-data/exercise-data/alkanespwd/work/shell-lesson-data/
exercise-data/alkaneslsЗдесь находятся methane.pdb, ethane.pdb и другие .pdb-файлы.
Исходный methane.pdb оставляем в alkanes.
mkdir -p /work/scratch
cp methane.pdb /work/scratch/
cd /work/scratchДальше работаем в /work/scratch.
nano methane.pdb
mv methane.pdb molecule-copy.pdb
rm molecule-copy.pdbrm удаляет файл, не перемещая в корзину.
Текущая папка: alkanes. Папка /work/scratch уже существует.
ethane.pdb/work/scratch/my-molecule.pdbНе редактируйте и не удаляйте файлы.
cp ethane.pdb /work/scratch/my-molecule.pdbls ethane.pdb /work/scratch/my-molecule.pdbОба файла существуют.
cat /work/scratch/my-molecule.pdbВ терминале появится её содержимое.
cp может завершиться без сообщения. Проверяем созданный файл.
head -n 5 methane.pdbПервые пять строк.
tail -n 5 methane.pdbПоследние пять строк.
less methane.pdbЧтение без изменения файла.
В less:
ls -l methane.pdbЛогический размер файла в байтах.
du -sh .Занятое место — один итог.
По папкам первого уровня:
du -h --max-depth=1 /workdf -h /workЁмкость, занятое и свободное место.
Size · Used · Avail · Use%
Текущая папка: alkanes
Нужно место, занятое папкой, а не свободное место диска.
du -sh .duЗанятое место
-sОдин итог
-hЧитаемые единицы
.Текущая папка
Форма ответа
[размер] .
Это размер дерева папки. Свободное место файловой системы показывает df.
/tmp/s1-permissions/hello.sh · - в начале прав означает обычный файл.
rw-r--r--chmod u+x hello.shr — чтение · w — запись · x — исполнение · u+x — добавить x владельцу
./hello.shТребует права x у файла.
bash hello.shBash читает файл; его x не требуется.
Папка: /tmp/s1-permissions. Файл hello.sh пока без права исполнения.
chmod u+x hello.sh
./hello.shРезультат
Hello from the container
ls -l hello.sh-rwxr--r--Появился x в тройке владельца.
cd /work/shell-lesson-data/exercise-data/alkanes
pwdwc methane.pdb9Переводы строки
57Слова
422Байты
methane.pdbИмя файла
-m / --chars — число символов. Байты и символы могут различаться.
Слова разделяются пробельными символами.
wc --helpНазвания опций и их назначение.
-l · -w · -c · -m
man wcWC(1): 1 — раздел руководства, не версия.
Для встроенной команды Bash: help cd.
wc -l methane.pdb ethane.pdbМожно передать несколько имён — или использовать шаблон:
wc -l *.pdb*.pdbСовпавшие имена подставляются до запуска wc.
cubane.pdbethane.pdbmethane.pdboctane.pdbpentane.pdbpropane.pdbtotal в выводе wc — сумма, а не имя файла.
Текущая папка: alkanes. Файл: propane.pdb
wc --help.propane.pdb.Нужны строки, не байты.
wc -l propane.pdbwc --lines propane.pdbРезультат
15 propane.pdb
-l и --lines считают переводы строки.
Команда cat без имени файла читает стандартный ввод.
helloТекст на входе
cathelloОбычный результат
Сюда программа пишет сообщения об ошибках.
Без перенаправлений ввод идёт с клавиатуры, а stdout и stderr видны в терминале.
wc -l *.pdb > /work/results/lengths.txtwc -l *.pdbТаблица счётчиков
/work/results/lengths.txtBash записывает таблицу сюда.
cat /work/results/lengths.txt> создать или перезаписать>> дописать в конецТекущая папка: alkanes. Папка /work/results уже существует.
ethane.pdb./work/results/ethane-lines.txt.Исходный .pdb не изменяйте.
wc -l ethane.pdb > /work/results/ethane-lines.txtcat /work/results/ethane-lines.txt12 ethane.pdb
Перенаправление меняет место вывода, но не текст wc.
Один и тот же файл: ../numbers.txt
sort ../numbers.txtРезультат
10 19 2 22 6
sort -n ../numbers.txtРезультат
2 6 10 19 22
Для таблицы счётчиков нужен sort -n. sort не изменяет исходный файл.
cat ../numbers.txt | sort -ncat ../numbers.txtПечатает числа
sort -nПолучает этот текст и сортирует
| передаёт текст следующей команде, не создавая промежуточный файл.
wc -l *.pdb > /work/results/lengths.txt
cat /work/results/lengths.txtФайл /work/results/lengths.txt уже создан.
Новый файл не создавайте.
sort -n /work/results/lengths.txt | head -n 1sort -nУпорядочить все строки
head -n 1Оставить одну строку
Результат
9 methane.pdb
Текущая папка: alkanes
.pdb-файла с наименьшим числом строк./work/results/shortest.txt.Исходные .pdb не изменяйте.
wc -l *.pdb | sort -n | head -n 3 > /work/results/shortest.txtwc -lПосчитать строки
sort -nУпорядочить
head -n 3Оставить три
>Записать в файл
cat /work/results/shortest.txt9 methane.pdb 12 ethane.pdb 15 propane.pdb
Сохраняем рабочие версии и понимаем, что изменилось.
Настроили поворот робота или исправили программу.
Посмотрели, чем новая версия отличается от рабочей.
Нашли прежнюю версию, если изменение оказалось неудачным.
История с понятными сообщениями — вместо папок «final», «final2» и «точно_final».
Проект, для которого Git хранит историю изменений.
git-demo/
README.md
.git/.git — служебные данные Git; вручную их не меняем.
Сохранённый снимок подготовленного состояния проекта.
У него есть идентификатор, автор, сообщение и связь с предыдущей историей.
Ветка — имя, указывающее на коммит. При новом коммите указатель текущей ветки перемещается.
Программа, которая хранит историю репозитория.
git add README.md
git commit -m "Add seminar note"Для локальных коммитов не нужны аккаунт и интернет.
Сервисы для размещения репозиториев и совместной работы.
Удалённый репозиторий — другая копия проекта с историей.
push отправляет коммиты в неё; pull получает и объединяет изменения.
Коммит ≠ публикация. Сначала научимся работать с локальной историей.
README.mdРедактируем файл.
git addСодержимое, выбранное для следующего коммита.
git commitСохранённые снимки проекта.
git diffРабочая папка ↔ индекс
git diff --stagedИндекс ↔ последний коммит
После новой правки git add нужно повторить: индекс сам не обновится.
В контейнере s1-class · отдельная пустая папка /work/git-demo
mkdir -p /work/git-demo
cd /work/git-demo
git init -b main
git config user.name "Seminar Student"
git config user.email "student@example.invalid"
nano README.mdВведите в README.md строку My first seminar. Сохраните файл и выйдите.
-b main — начальная ветка. Имя и email — учебные; настройки автора локальные.
Папка /work/git-demo · README.md сохранён, коммитов ещё нет.
git status
git add README.md
git diff --stageduntracked — файл ещё не отслеживается. После add он подготовлен к коммиту.
git commit -m "Add seminar note"
git status
git log --oneline-m задаёт сообщение; --oneline показывает историю кратко.
В истории появилась запись, а новых изменений для коммита нет.
Представим, что после первого коммита изменили строку в README.md.
git diffПоказывает новую правку.
git diff --stagedИзменений для коммита пока нет.
git diffПусто: файл и индекс совпадают.
git diff --stagedПоказывает подготовленную правку.
Новый коммит добавит версию в историю, а не перепишет первый коммит.
Learn Git Branching · симулятор в браузере
Узел графа. Стрелка направлена к родителю.
Имя, которое указывает на коммит. Сейчас это main.
Показывает, где мы работаем. Обычно связан с текущей веткой.
В симуляторе git commit создаёт узел без редактирования файла и add.
В симуляторе: main на C1, HEAD → main.
git commitНовый C2; main перемещается на него.
git branch featureСоздаём имя feature на C2.
git checkout featureПереключаемся на feature.
git commitНовый C3; перемещается только feature.
Ветка — не копия папки. Создание ветки само по себе не создаёт коммит.
В симуляторе: feature на C3, main на C2.
git checkout main
git commit
git merge featureC5 связывает две линии истории. Меняется main — текущая ветка; feature остаётся на C3.
Если истории не разошлись, возможен fast-forward: сдвиг ветки без нового коммита слияния.
Learn Git Branching → Введение → «Знакомство с Git Commit»
C0 ← C1main → C1 · HEAD → main
C0 ← C1 ← C2 ← C3main → C3 · HEAD → main
Добейтесь целевого графа. Перед каждой командой предскажите, какой узел и какая метка изменятся.
git commit
git commitРодитель C2 — C1, родитель C3 — C2. После каждого коммита main перемещается вперёд.
Learn Git Branching → Введение → «Ветвление в Git»
C0 ← C1, где main → C1 и HEAD → main.bugFix и переключитесь на неё.Сохраните точное имя: bugFix. Регистр букв имеет значение.
git branch bugFix
git checkout bugFixДобавляет имя ветки на текущий коммит.
Переключает HEAD на эту ветку.
Коммитов осталось два. Оба имени веток указывают на C1.
Семинар 0 · Docker / Unix / Git