Bootstrap

Docker на Android (Termux): udocker, QEMU и решение типичных ошибок

Docker на Android (Termux): udocker, QEMU и решение типичных ошибок

Как установить Docker на Android (Termux) и запустить свой сервис: полный гайд с udocker, QEMU и решением типичных ошибок

Введение

Многие разработчики и энтузиасты хотят запускать Docker-контейнеры прямо на Android-смартфоне. Официальный пакет docker в Termux отсутствует в обычных репозиториях, а pkg install docker выдаёт ошибку «Unable to locate package docker». В этой статье разберём все рабочие способы, подробно остановимся на udocker (самый быстрый вариант без root), покажем, как авторизоваться в своём приватном registry и решить типичные ошибки при pull, а также как поднять свой сервис.

Почему нельзя просто поставить Docker

  • Пакет Docker есть только в root-repo (нужен root + подходящее ядро с namespaces, cgroups, overlayfs).
  • Даже с root на большинстве стоковых Android-ядер dockerd не работает.
  • Termux — обычное Android-приложение, у него нет привилегий для создания настоящих контейнеров.

Варианты установки

1. QEMU + Alpine (полноценный Docker, без root)

Самый надёжный способ получить настоящий Docker (включая build и push).

☯

Terminal:

⌕

≡

✕
pkg update -y && pkg upgrade -y
pkg install qemu-utils qemu-common qemu-system-x86_64-headless wget -y

mkdir -p ~/alpine && cd ~/alpine
wget https://dl-cdn.alpinelinux.org/alpine/v3.20/releases/x86_64/alpine-virt-3.20.2-x86_64.iso
qemu-img create -f qcow2 alpine.img 5G

Запуск VM (пример):

☯

Terminal:

⌕

≡

✕
qemu-system-x86_64 -machine q35 -m 1024 -smp cpus=2 -cpu qemu64 \
  -drive if=pflash,format=raw,readonly=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
  -netdev user,id=n1,dns=8.8.8.8,hostfwd=tcp::2222-:22 \
  -device virtio-net,netdev=n1 \
  -cdrom alpine-virt-3.20.2-x86_64.iso -nographic alpine.img

Внутри Alpine: setup-alpine → после перезагрузки apk add docker → service docker start → rc-update add docker.

Плюс: полноценный Docker. Минус: медленнее, жрёт батарею и RAM.

2. udocker (рекомендуется большинству)

User-space реализация Docker. Без root, без QEMU, значительно быстрее.

☯

Terminal:

⌕

≡

✕
pkg install git -y
git clone --depth 1 https://github.com/George-Seven/Termux-Udocker ~/Termux-Udocker
bash ~/Termux-Udocker/install_udocker.sh

После установки используйте команды udocker вместо docker.

Что умеет udocker:

  • pull, create, run, login, logout
  • Работа с приватными registry
  • Запуск большинства образов

Чего не умеет:

  • push образов
  • Полноценный docker build (лучше собирать на ПК)

3. proot-distro (ограниченно)

☯

Terminal:

⌕

≡

✕
pkg install proot-distro
proot-distro install debian
proot-distro login debian
# внутри: apt install docker.io

CLI работает, dockerd — почти никогда.

Авторизация в своём (приватном) registry

Пример с Gitea/GitLab-подобным registry (admin-dixsu-git.dix.su):

☯

Terminal:

⌕

≡

✕
udocker logout -a
udocker --insecure login --registry=https://admin-dixsu-git.dix.su --username=ВАШ_ЛОГИН

Затем pull:

☯

Terminal:

⌕

≡

✕
udocker --insecure pull admin-dixsu-git.dix.su/dixsu/grid-bot:latest

Важно:

  • В --registry указывайте только хост, а не полный путь к образу.
  • Для HTTP/самоподписанных сертификатов используйте --insecure.

Решение типичной ошибки «Error: no files downloaded»

Ошибка часто появляется на больших слоях (100+ МБ), даже если HTTP 200 уже пришёл.

Диагностика:

☯

Terminal:

⌕

≡

✕
df -h $HOME
ls -lh ~/.udocker/layers/*.tmp   # временные файлы

Исправление:

  1. Удалить временные файлы: rm -f ~/.udocker/layers/*.tmp
  2. Повторить pull.
  3. Увеличить таймаут: ``bash export UDOCKER_CURL_TIMEOUT=3600 udocker --insecure pull admin-dixsu-git.dix.su/dixsu/grid-bot:latest ``
  4. Если не помогает — скачать образ на компьютере (docker save) и перенести: ``bash udocker load -i grid-bot.tar ``

В логах с -D видно, что манифест и токены получаются успешно, а падает именно запись большого blob.

Как поднять свой сервис

После успешного pull:

☯

Terminal:

⌕

≡

✕
udocker create --name=grid-bot admin-dixsu-git.dix.su/dixsu/grid-bot:latest
udocker run --name=grid-bot -p 8080:8080 grid-bot

Или сразу:

☯

Terminal:

⌕

≡

✕
udocker run -p 8080:8080 admin-dixsu-git.dix.su/dixsu/grid-bot:latest

Для фонового запуска используйте tmux или termux-wake-lock + скрипт.

Рекомендации по выбору способа

ЦельЛучший способКомментарий
Просто запустить контейнерudockerБыстро, без root
Нужен build + pushQEMU + AlpineПолноценный Docker
Есть root + хорошее ядроroot-repoРедко работает
Максимальная совместимостьQEMUСамый надёжный

Заключение

На Android полноценный Docker «из коробки» поставить нельзя, но с udocker или QEMU задача решается. Самый практичный путь для большинства пользователей — udocker: он позволяет авторизоваться в своём registry, скачивать образы и запускать сервисы. Главные грабли — большие слои и неправильный формат --registry. Следуйте шагам выше, и ваш сервис будет работать прямо на смартфоне.

Если возникнут новые ошибки — присылайте полный вывод с udocker -D, разберём точечно.

Копирование материалов разрешается только с указанием автора Roman Sakhno и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.