Автор: Усачёв Денис Евгеньевич, ведущий эксперт РыбинскЛАБ.
Почему контейнеризация в Termux — это реально
Termux давно перестал быть только «тренировочной» средой для утилит. На мобильных устройствах он удобен как инструмент для разработки, сборки артефактов и тестирования. Если при этом вы хотите получать воспроизводимые окружения, контейнеризация становится логичным следующим шагом.
Ключевой момент: в Termux обычно нет удобного доступа к Docker Daemon, а попытки его «поднимать» часто упираются в ограничения окружения. Хорошая альтернатива — использовать Podman и Buildah, которые ориентированы на работу без Docker Daemon и позволяют собирать образы в формате, совместимом с OCI.
Podman и Buildah: роль каждого инструмента
- Buildah — сборщик образов. Он умеет работать с инструкциями уровня Dockerfile и собирать образы, совместимые с OCI.
- Podman — движок для запуска и управления контейнерами/образами. Его важное преимущество — работа в режиме, не требующем Docker Daemon.
В связке с Termux вы получаете «локальный конвейер»: собрать образ → сохранить/передать → при необходимости запустить контейнер.
Подготовка Termux
Перед началом обновите пакеты. Рекомендуется работать в актуальной версии Termux и включить доступ к нужным ресурсам (хранилище/файловая система) через настройки приложения.
pkg update -y
pkg upgrade -y
Установим базовые инструменты, которые понадобятся почти всегда.
pkg install -y git proot-distro tar curl wget unzip
Далее — подготовим среду для сборки и работы контейнерных инструментов.
Варианты установки Podman/Buildah в Termux
В Termux нет единого «универсального» способа установить всё в виде пакетов apt, который одинаково работает на всех устройствах и версиях Android. Поэтому на практике используют один из подходов:
- Через Linux‑окружение (например, в proot-distro) — как наиболее предсказуемый путь.
- Через контейнеризацию самого окружения — когда вы запускаете сборку внутри контейнера, но это уже следующая ступень сложности.
Ниже приведён сценарий через proot-distro, поскольку он обычно проще для старта.
Создание Linux-окружения (proot-distro)
Развернём Debian-подобную среду. Замените имя дистрибутива при необходимости.
proot-distro install debian
proot-distro login debian --shared-tmp -- bash
Оказавшись внутри, обновите систему.
apt update -y
apt upgrade -y
Установка Podman и Buildah в Linux-окружении
В зависимости от версии Debian/репозиториев состав пакетов может отличаться. Как минимум, вам понадобятся Podman и Buildah. Попробуйте базовую установку.
apt install -y podman buildah
Если пакеты не находятся, проверьте актуальность репозиториев и доступность версий. В некоторых ситуациях рационально перейти на другой дистрибутив или использовать более современный источник сборочных пакетов (но это уже вопрос к конкретной платформе и версии окружения).
Концепция OCI‑образов: что вы получаете
OCI (Open Container Initiative) задаёт стандарты формата образов и структуры артефактов. В контексте Podman/Buildah это означает, что вы можете собирать образы, которые:
- совместимы с OCI runtime-экосистемой;
- зависят меньше от «docker-специфики»;
- могут быть сохранены в виде переносимых артефактов.
Далее рассмотрим сборку минимального OCI‑совместимого образа без Docker Daemon.
Сборка образа с Buildah без Docker Daemon
Перейдите в рабочую директорию и создайте простой Dockerfile-эквивалент. Например, образ на основе alpine.
mkdir -p ~/oci-demo && cd ~/oci-demo
Создайте файл Containerfile (Buildah часто использует Containerfile/Dockerfile-подобный синтаксис).
cat > Containerfile <<'EOF'
FROM alpine:3.20
RUN apk add --no-cache ca-certificates
CMD ["sh", "-c", "echo OCI image from Termux && sleep 5"]
EOF
Теперь создайте билд через Buildah и соберите образ.
buildah bud -t oci-demo:latest .
Проверим, что образ появился в локальном хранилище.
podman images
На этом этапе вы уже собрали образ без участия Docker Daemon — только инструментами Buildah/Podman.
Экспорт OCI-артефактов: сохранить результат для переноса
Один из практических сценариев — экспортировать образ в файл, чтобы затем забрать его на другое устройство/в CI/на сервер. В зависимости от конфигурации окружения вы можете экспортировать образ как архив.
Пример экспорта в tar:
podman save -o oci-demo-latest.tar oci-demo:latest
Затем архив можно передать (например, через файловый менеджер Termux или по локальной сети в пределах вашего рабочего окружения).
Запуск контейнера в Podman
Запуск контейнера обычно делается так:
podman run --rm oci-demo:latest
Если контейнер выходит слишком быстро (у нас он спит 5 секунд), вы увидите вывод и процесс завершится.
Для интерактивного режима:
podman run --rm -it oci-demo:latest sh
Тонкости: права, user namespace и rootless-поведение
На мобильных устройствах особенно важны ограничения по правам и особенностям запуска процессов внутри proot. В большинстве случаев Podman поддерживает rootless-режим, но детали зависят от версии Podman и возможностей ядра/окружения.
С практической точки зрения:
- начинайте с минимального примера;
- если контейнер не стартует — смотрите логи и ошибки;
- проверяйте, что пространство имён пользователя поддерживается в вашем окружении.
Сборка многостадийных образов и оптимизация
Когда вы переходите от «Hello world» к реальным проектам (например, сборка бинарника или сборка фронтенда), становится важной оптимизация размера и воспроизводимость. Buildah поддерживает практики многостадийных сборок.
Например, схема: stage сборки → stage рантайма.
cat > Containerfile <<'EOF'
FROM alpine:3.20 AS build
RUN apk add --no-cache gcc musl-dev
WORKDIR /src
RUN printf 'int main(){return 0;}' > main.c
RUN gcc -static -O2 main.c -o app
FROM alpine:3.20
COPY --from=build /src/app /app
CMD ["/app"]
EOF
buildah bud -t oci-demo-multi:latest .
Результат будет компактнее, чем если бы вы оставляли инструменты сборки в финальном слое.
Работа с локальной сетью (без обхода блокировок)
Если вам нужно тестировать сервис внутри контейнера с доступом из Termux (например, открыть локально страницы/эндпоинты), удобно организовать локальную сеть в рамках вашего устройства/вашей сети. При этом важно не использовать VPN для обхода ограничений.
В типовом случае вы публикуете порт контейнера наружу (в пределах доступной сети), а взаимодействие организуете обычным способом: прокси/порт‑форвардинг/доступ по адресу контейнера.
Пример (общая идея):
podman run --rm -p 8080:8080 <ваш_образ>
Конкретика зависит от сетевых возможностей окружения в Termux и режима запуска.
Частые проблемы и как их диагностировать
- Образ не собирается: проверьте наличие зависимостей внутри окружения, лог сборки Buildah и корректность синтаксиса Containerfile.
- Podman не запускает контейнер: проверьте ошибки rootless/namespace, доступность нужных возможностей ядра и корректность конфигурации.
- Размер образа растёт: применяйте многостадийность, используйте минимальные базы (alpine/distroless-подход где доступно) и чистите кэш в RUN.
- Сложно переносить артефакт: используйте
podman saveили экспортируйте слои/образы как архивы, чтобы забрать результат.
Практический чек-лист: от нуля до OCI-образа
- Обновите Termux пакеты:
pkg update,pkg upgrade. - Разверните Linux окружение через
proot-distro. - Установите
podmanиbuildahвнутри окружения. - Создайте
Containerfile. - Соберите образ:
buildah bud -t <tag> .. - Проверьте:
podman images. - Запустите:
podman run --rm <tag>. - При необходимости экспортируйте:
podman save -o <file>.tar <tag>.
Заключение
Termux отлично подходит для практической контейнеризации: используя Podman и Buildah, вы можете создавать OCI‑совместимые образы и запускать контейнеры без Docker Daemon. Это уменьшает трение при работе на мобильной среде и упрощает перенос артефактов между устройствами и этапами разработки.
Хотите быстрее внедрить такой подход в свои рабочие процессы? Команда РыбинскЛАБ поможет с настройкой, подбором окружения и выстраиванием конвейера сборки/тестирования под ваши задачи.