Установка Docker для ARM и 64-bit ARM (Armbian, Linux)

Контейнеризация приложений в 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 шину для получения телеметрии от автомобиля и отправляет эти данные в облако.

Docker ARM ARM64 Banana Pi BPI-M64 Cubietruck

Подробнее почитать в публикации Reading Vehicle OBD-II data through CAN within a containerized application in Embedded Linux — CNX SOFTWARE.

Оглавление

  1. Постановка задачи
  2. Предварительные требования
  3. Шаг 1 — Установка Docker CE
  4. Шаг 2 — Установка docker-compose
  5. Шаг 3 — Оптимизация Docker
  6. Шаг 4 — Запуск контейнера portainer.io
  7. Литература

Постановка задачи

Установить на одноплатный компьютер 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.

В официальном руководстве будет три варианта:

Docker ARM ARM64 Banana Pi BPI-M64 Cubietruck

  • 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:

ARM64ARM32
$ 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 символов:

Docker ARM ARM64 Banana Pi BPI-M64 Cubietruck

3. Выберем локальное управление Docker контейнерами:

Docker ARM ARM64 Banana Pi BPI-M64 Cubietruck

4. Панель управления контейнерами Docker в portainer.io:

Docker ARM ARM64 Banana Pi BPI-M64 Cubietruck

Docker ARM ARM64 Banana Pi BPI-M64 Cubietruck

Запуск контейнера 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

Литература

  1. Команды управления Docker — Docker CLI (docker)
  2. Install Docker Engine on Ubuntu — Docker docs
  3. Portainer CE — open source tool for managing your containerized environments
  4. portainer/portainer — Docker hub
  5. Полная автоматизация «development» среды с помощью docker-compose — Хабр
  6. Compose file — Docker docs

About the Author: Anton

Programistik