Docker

Docker

Введение

При разработке любых приложений, будь то веб-сайт, бэкенд или даже какой-нибудь алгоритм для робота, всегда есть зависимости (библиотеки, файлы настроек). При написании какой-либо программы вы можете поставить все необходимые библиотеки и пакеты себе на компьютер, но при таком подходе рано или поздно вы можете столкнуться со следующими проблемами:

  • Конфликт версий. Например, написанная вами программа использует Python 3.12, а другая программа, написанная ранее, работает только с Python 3.8. Конечно, вы можете установить себе обе версии Python, но в таком случае придётся при каждом использовании выбирать конкретную версию, настраивать переменные окружения и следить, чтобы одна программа случайно не «сломала» другую. Чем больше проектов — тем больше путаницы.

  • «Работает у меня, но не работает у тебя». Вы запустили проект на своём компьютере — всё отлично. Передали другу или выложили на сервер — и вдруг появляются ошибки: другая операционная система, другие версии библиотек, не хватает каких-то файлов.

  • Сложная установка. Иногда, чтобы запустить проект, нужно выполнить десятки команд: установить базы данных, настроить сервер, прописать пути. Для новичка или человека из другой области это может показаться кошмаром, и только на запуск уйдёт много времени.

  • Захламление системы. Со временем компьютер превращается в «свалку» из разных версий программ, пакетов и сервисов, которые разбросаны по всей системе.

Чтобы решить эти проблемы, придумали контейнеризацию. Самый популярный инструмент для этого — Docker.

Идея Docker очень простая: вместо того чтобы устанавливать всё прямо на компьютер, мы «упаковываем» программу вместе со всеми её зависимостями в специальный контейнер.

Контейнер — это изолированная от вашей операционной системы среда, внутри которой находятся:

  • Необходимые версии Python/ROS/OpenCV. Вы устанавливаете именно те версии библиотек, которые нужны вашей программе.

  • Файлы настройки. Вы можете преднастроить как вашу программу, так и зависимые библиотеки.

  • Всё необходимое для запуска.

  • И конечно, сама ваша программа.

Но чтобы каждый раз не настраивать контейнер вручную, в Docker используют образы (images). Образ — это как шаблон или «чертёж» нашего контейнера. В нём заранее описано, какие программы установить, какие файлы скопировать и какую команду запустить. Мы один раз собираем такой образ, а потом можем создавать из него сколько угодно контейнеров.

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

На этом этапе может показаться, что Docker — это обычная виртуальная машина. Но на самом деле это не совсем так. В отличие от виртуальной машины, Docker не запускает вторую операционную систему внутри вашей. Он создаёт лёгкое окружение только для вашей программы, с нужными библиотеками и настройками. Благодаря этому контейнеры используют ресурсы компьютера очень эффективно — не тратя процессор на лишнюю операционную систему, а только на то, что нужно приложению.

Docker помогает разработчикам избегать конфликтов версий, долгой настройки и «мусора» на компьютере. С его помощью можно упаковать программу со всеми зависимостями в контейнер, запускать её одной командой и делиться готовым образом с другими. Проще говоря, Docker отделяет инфраструктуру, где запускается программа, от самой программы и всех её зависимостей.

Установка

Предупреждение

Установка требуется только если вы хотите работать с Docker на вашем компьютере. Образ clover2 уже содержит Docker и при работе с дроном этот раздел можно пропустить.

Для установки Docker на устройство вам потребуется доступ в интернет и права администратора в терминале.

Ubuntu

Оригинал статьи установки тут.

Для установки Docker на операционную систему Ubuntu вам потребуется открыть терминал и выполнить следующие команды.

Обновление системы и установка curl

sudo apt update
sudo apt install curl

Запуск скрипта установки

curl -fsSL https://get.docker.com | sudo sh

Настройка Docker в Linux

В командной строке выполните сначала это:

sudo usermod -aG docker $USER

Потом это:

newgrp docker

Windows

Оригинал статьи установки тут. Для установки Docker на Windows требуется установить WSL2 — подсистему Linux внутри операционной системы Windows. Эта подсистема будет также полезна для работы с ROS2.

Шаг 1: Установка WSL2

Из меню Пуск открыть приложение Microsoft Store и найти в магазине приложений Ubuntu 24.04.

ms-ubuntu-install

Нажимая кнопку Получить вы начнёте процесс установки. Через какое-то время кнопка сменится на Открыть. После этого необходимо перезагрузить компьютер, чтобы применить установку новой программы.

ms-ubuntu-open

После перезагрузки компьютера в меню Пуск найдите приложение Ubuntu 24.04 и запустите его. При первом запуске программа предложит создать пользователя, придумайте имя и пароль (сделайте его таким же как в Windows или простым, чтобы не забыть). Если вы сделали всё правильно — увидите зелёную надпись с именем вашего пользователя и названием компьютера, поздравляю — вы в операционной системе линкус!

wsl-setup-user

Шаг 2: Установка Docker Desktop

Необходимо скачать установщик. Перейдя по ссылке под номером версии будет выбор установщика для всех популярных операционных систем, требуется нажать на Windows.

docker-windows-download

Запустите скачанный установщик, дважды нажав на файл в папке загрузки. Выберите галочки так же как на фотографии ниже и нажмите OK. По завершении установки программа предложит перезагрузить компьютер — нужно перезагрузить.

win-docker-1-step

После перезагрузки Docker Desktop откроется автоматически, при первом запуске надо согласиться с правилами программы.

docker-first-run

Шаг 3: Настройка Docker

В меню Пуск найдите приложение Ubuntu 24.04 и запустите его. Вы попадаете в командную строку Ubuntu и в ней по очереди выполните:

sudo usermod -aG docker $USER
newgrp docker

Запуск первого контейнера

Как уже говорилось, контейнер создаётся из образа (image). Если образ — это как шаблон или «чертёж коробки», то контейнер — это уже собранная и открытая коробка, внутри которой работает ваша программа.

Попробуем что-то простое — например, образ с Ubuntu:

docker run -it --rm ubuntu

Что здесь происходит:

  • docker run — команда, которая создаёт контейнер из образа и запускает его.

  • -it — даёт вам возможность взаимодействовать с контейнером через терминал.

  • --rm — автоматически удаляет контейнер после завершения работы с ним.

  • ubuntu — имя образа. Если образа нет на компьютере, Docker сначала его скачает.

В результате вы попадёте внутрь контейнера и сможете выполнять команды Linux, как будто это отдельный компьютер или виртуальная машина. И в вашем терминале должно быть что-то подобное:

$ docker run -it --rm ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
Digest: sha256:d1e2e92c075e5ca139d51a140fff46f84315c0fdce203eab2807c7e495eff4f9
Status: Downloaded newer image for ubuntu:latest
root@d994718f32d0:/# 

Давайте попробуем проверить, что Docker действительно изолирует вашу операционную систему. Для этого предлагаю установить внутрь контейнера программу htop. Это команда для удобного мониторинга ресурсов.

Первым делом обновим пакеты:

apt update

Далее установим программу htop:

apt install htop -y

И проверим работу пакета:

htop

После выполнения команды должен отобразиться следующий интерфейс. Можно сразу увидеть, что внутри Docker запущено всего две программы: bash — это наш терминал и htop — это программа, которую мы установили. Само собой, в операционной системе на вашем компьютере работает намного больше программ, чем мы видим здесь, как минимум браузер, через который вы читаете эту статью, но внутри контейнера этих программ нет, так как он изолирован.

htop

Чтобы выйти из контейнера, достаточно выполнить команду exit. При выходе из контейнера он автоматически удалится (из-за того, что мы запускали его с флагом --rm). Это легко проверить, достаточно посмотреть запущенные контейнеры командой:

docker ps -a

Что здесь происходит:

  • docker ps — команда, которая отображает запущенные контейнеры.

  • -a — показывает все контейнеры, как запущенные, так и завершившие свою работу.

В результате вывода команды можно увидеть, что запущенных контейнеров нет.

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                    PORTS     NAMES