Контейнеризация приложений в Docker уже стала де-факто стандартом для систем на Linux. Многие думают что Docker технология предназначена только для серверов, больших дата-центров. Но на самом деле контейнеризация приложений для одноплатных компьютеров на ARM является отличным решением т.к. позволяет с легкостью удаленно обновлять приложение, контролировать доступные ресурсы, и обеспечивать надежность и доступность путем отката к предыдущему рабочему варианту. Публикация содержит пошаговое руководство как установить Docker и docker-compose для одноплатных компьютеров на ARM процессоре 32-bit и 64-bit, предполагается что на компьютере установлена Armbian (Linux). В качестве платформы для установки и запуска Docker будем использовать Cubietruck (ARM32), и Banana Pi BPI-M64(ARM64), работающие на Armbian.
Европейская компания Toradex в своих встраиваемых решениях для автомобильных грузоперевозок использует технологию Docker. Компанией был разработан модуль Verdin на базе NXP i.MX8 M Mini SoC, который взаимодействует с автомобилем через CAN шину для получения телеметрии от автомобиля и отправляет эти данные в облако.
Подробнее почитать в публикации Reading Vehicle OBD-II data through CAN within a containerized application in Embedded Linux — CNX SOFTWARE.
Оглавление
- Постановка задачи
- Предварительные требования
- Шаг 1 — Установка Docker CE
- Шаг 2 — Установка docker-compose
- Шаг 3 — Оптимизация Docker
- Шаг 4 — Запуск контейнера portainer.io
- Литература
Постановка задачи
Установить на одноплатный компьютер Docker и docker-compose. Оптимизировать глобальные настройки Docker для уменьшение занимаемого дискового пространства и снижение вычислительной нагрузки на CPU. Дополнительно, обеспечить управление и мониторинг контейнеров помощью системы управления portainer.io.
Предварительные требования
- одноплатный компьютер на ARM процессоре не ниже ARMv7.
- ОС Linux основанная на: Ubuntu Xenial 16.04 (LTS), Ubuntu Bionic 18.04 (LTS), Ubuntu Focal 20.04 (LTS), или Ubuntu Groovy 20.10.
Установка производилась на следующих устройствах:
- Плата Cubietruck установлена версия Armbian_21.02.1_Cubietruck_bionic_current_5.10.12.img.xz, основанная на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.10.12. uname: Linux cubietruck 5.10.12-sunxi #21.02.1 SMP Wed Feb 3 20:39:30 CET 2021 armv7l armv7l armv7l GNU/Linux (пришлось сделать откат к предыдущей версии, т.к. под Ubuntu 20.04.2 LTS последняя версия stable отсутствовала).
- Плата Banana Pi BPI-M64 установлена версия Armbian_20.08.2_Bananapim64_bionic_current_5.8.6_minimal.img.xz, основанная на Ubuntu 18.04.5 LTS (Bionic Beaver), ядро Linux 5.8.6. uname: Linux bananapim64 5.8.6-sunxi64 #20.08.2 SMP Fri Sep 4 08:52:31 CEST 2020 aarch64 aarch64 aarch64 GNU/Linux.
Шаг 1 — Установка Docker CE
Пошаговая установка Docker CE для Armbian на основе Ubuntu описана в руководстве Install Docker Engine on Ubuntu. Единственно, необходимо обратить внимание на выбор репозитория исходя из архитектуры ARM32 или ARM64 во время установки, этот шаг будет детально прокомментирован.
Выполним следующие шаги:
1. Обновление и установка пакетов для использование репозитория по HTTPS (общие для ARM32 и ARM64):
$ sudo apt-get update $ sudo apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg
2. Добавление официального ключа Docker репозитория для GPG:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
3. Выбор версии установки исходя их архитектуры процессора. Более детально можно почитать в публикации Установка .NET 5.0 для ARM на примере Banana Pi BPI-M64 и Cubietruck (Armbian, Linux) раздел Определение архитектуры ARM32 и ARM64 для SoC.
В официальном руководстве будет три варианта:
- x86_64 / amd64 — для Intel и AMD процессоров архитектуры x86 или AMD64
- armhf — ARM32, ARMv7, aarch32, 32-разрядная архитектура ARM
- arm64 — ARM64, ARMv8, aarch64, 64-разрядная архитектура ARM
На Cubietruck (ARM32) будем устанавливать вариант — armhf.
На Banana Pi BPI-M64(ARM64) будем устанавливать вариант — arm64.
Выполним скрипт установки, в зависимости от разрядности системы ARM32 или ARM64:
$ echo \ "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ echo \ "deb [arch=armhf signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. Установка Docker Engine. Обновление новых добавленных репозитариев и установка Docker Engine (общие для ARM32 и ARM64).
$ sudo apt-get update $ sudo apt-get install -y docker-ce docker-ce-cli containerd.io
Если установка не удалась, указанные пакеты не были найдены (касается Ubuntu 20.04.2 LTS), то нужно заменить на этот вариант:
$ sudo apt-get install -y docker.io
5. Проверим установленную версию Docker путем выполнения команды docker -v :
$ root@bananapim64:~# docker -v Docker version 20.10.5, build 55c4c88
6. Проверим корректность установки Docker путем запуска образа hello-world :
$ sudo docker run hello-world
Если в консоли видите результат ниже, то Docker работает успешно:
$ root@bananapim64:~# sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 256ab8fe8778: Pull complete Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (arm64v8) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ root@bananapim64:~#
Шаг 2 — Установка docker-compose
1. Выполним скрипт установки:
$ sudo apt-get install -y docker-compose
2. Проверим установленную версию, командой docker-compose version :
root@bananapim64:~# docker-compose version docker-compose version 1.17.1, build unknown docker-py version: 2.5.1 CPython version: 2.7.17 OpenSSL version: OpenSSL 1.1.1 11 Sep 2018 root@bananapim64:~#
docker-compose установлен!
Шаг 3 — Оптимизация Docker
До создания контейнеров Docker необходимо выполнить некоторую оптимизацию:
Уменьшение размера log-файлов контейнеров
Во время работы контейнер может очень активно записывать данные в журнал событий, при этом размер log-файла журнала будет только увеличиваться. Поэтому необходимо ограничить размер и количество создаваемых log-файлов, для этого необходимо создать файл /etc/docker/daemon.json .
1. Открыть/создать файл /etc/docker/daemon.json :
sudo mcedit /etc/docker/daemon.json
2. Разместить в нем следующее содержимое:
{ "log-driver": "local", "log-opts": { "max-size": "10m", "max-file":"3" } }
Описание параметров:
- «log-driver»: «local» — параметры для локальных log-файлов
- «max-size»: «10m» — максимальный размер одного log-файла 10 Мб
- «max-file»:»3″ — максимальное количество log-файлов составляет 3
Таким образом, события каждого контейнера будут ограничены тремя файлами по 10 Мб, в сумме размер журнала на один контейнер составит 30 Мб.
Отключение Userland Proxy
Для публикации портов наружу контейнера, Docker для каждого порта создает отдельный TCP или UDP прокси. Если портов достаточно много, то это снижает скорость сетевого обмена и больше нагружает процессор. Для отключения userland-proxy необходимо внести изменения в файл /etc/docker/daemon.json .
1. Открыть/создать файл /etc/docker/daemon.json :
$ sudo mcedit /etc/docker/daemon.json
2. Разместить в нем следующее содержимое:
{ "userland-proxy": false }
Итоговый файл и перезапуск Docker
1. В итоге файл /etc/docker/daemon.json будет содержать следующий текст:
{ "log-driver": "local", "log-opts": { "max-size": "10m", "max-file":"3" }, "userland-proxy": false }
2. Перезапустим службу Docker для вступления в силу новых параметров
$ sudo systemctl restart docker
Шаг 4 — Запуск контейнера portainer.io
Portainer.io позволяет с легкость управлять контейнерами Docker. Управление осуществляется через Web-интерфейс. Доступен функционал создания, удаления, изменения контейнеров. Хорошо реализован мониторинг, просмотр журнала событий контейнеров. Система разграничения прав доступа позволяет разграничивать доступ к отдельным контейнерам, не только уровни доступа администратор/read-only, но и отдельные пользователя могут управлять только определенными контейнерами. Редакция CE, бесплатна и не ограничена количеством контейнеров или другими числовыми ограничениями, в отличие от Business-редакции некоторые функции недоступны. В Docker Hub portainer доступен по ссылке portainer/portainer.
1. Запустим контейнер portainer:
$ docker run --name portainer_local --restart always -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer-data:/data portainer/portainer
Процесс запуска:
root@bananapim64:~# docker run --name portainer_local --restart always -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer-data:/data portainer/portainer Unable to find image 'portainer/portainer:latest' locally latest: Pulling from portainer/portainer d1e017099d17: Pull complete 4e1a79253c37: Pull complete Digest: sha256:f8c2b0a9ca640edf508a8a0830cf1963a1e0d2fd9936a64104b3f658e120b868 Status: Downloaded newer image for portainer/portainer:latest WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested ecf227ed739081830787f9161bdfb18355ab78ec55ace07cce0edc28f3eaaea3 root@bananapim64:/var/lib/docker/volumes#
Volumes контейнеров Docker располагаются по пути: /var/lib/docker/volumes .
2. Запустим Web-браузер и перейдем по адресу: http://192.168.43.225:9000/. Установим пароль длиной не менее 8 символов:
3. Выберем локальное управление Docker контейнерами:
4. Панель управления контейнерами Docker в portainer.io:
Запуск контейнера portainer.io через docker-compose
1. Создадим в домашней директории файл docker-compose.bpi-m64.yml:
$ mcedit ~/docker-compose.bpi-m64.yml
2. Разместим в нем следующее содержимое:
version: '3.5' services: # Container management portainer_local: container_name: portainer_local image: portainer/portainer restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer-data:/data ports: - 9000:9000 volumes: portainer-data: name: portainer-data
3. Выполним команду создания контейнеров, существующие контейнеры будут пропущены:
$ docker-compose -p "bpim64base" --file docker-compose.bpi-m64.yml up -d
Процесс создания контейнеров:
root@bananapim64:~# docker-compose -p "bpim64base" --file docker-compose.bpi-m64.yml up -d Creating volume "portainer-data" with default driver Creating portainer_local ... Creating portainer_local ... done root@bananapim64:~#
Всегда перестройка всех контейнеров:
$ docker-compose -p "bpim64base" --file docker-compose.bpi-m64.yml up --build -d
Литература
- Команды управления Docker — Docker CLI (docker)
- Install Docker Engine on Ubuntu — Docker docs
- Portainer CE — open source tool for managing your containerized environments
- portainer/portainer — Docker hub
- Полная автоматизация «development» среды с помощью docker-compose — Хабр
- Compose file — Docker docs