We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

  Назад к списку статей

Автоматизированное развертывание контейнеров Docker в Termux с помощью Ansible и Terraform

Termux — мощная среда для работы в Linux-подобном окружении на Android. При этом задача «быстро поднять набор Docker-контейнеров» часто упирается не в команду docker run, а в повторяемость, управляемость и воспроизводимость.

В этой статье рассматривается подход к автоматизированному развертыванию контейнеров Docker в Termux с использованием связки Terraform (для описания и подготовки ресурсов/параметров) и Ansible (для конфигурации окружения и запуска контейнеров). Пример ориентирован на легальный, инфраструктурный сценарий: создание конфигурации и деплоя в контролируемой среде (локальная сеть/внутренние узлы), без обхода блокировок.

Архитектура решения

Схема процесса логически делится на два слоя:

  • Terraform: описывает «что нужно» и формирует входные данные (инвентарь, переменные, параметры окружения) для Ansible.
  • Ansible: выполняет «как нужно» — устанавливает зависимости, готовит Docker/Compose и поднимает контейнеры.

На практике в Termux можно развернуть контейнеры локально (на самом устройстве) либо подключиться к удаленному Docker-хосту из локальной сети. В обоих случаях Terraform помогает формализовать параметры и сделать процесс повторяемым.

Предварительные требования

Понадобятся:

  • Android-устройство с установленным Termux.
  • Доступ в локальную сеть (если планируется развертывание на удаленном узле).
  • Установленные инструменты на стороне управляющей машины (можно также сделать запуск с Termux, но для примера проще держать Terraform/Ansible на отдельном узле).
  • На Android: доступ к пакетному менеджеру Termux.

Важно: конкретная доступность Docker в Termux зависит от версии Android и архитектуры. На многих устройствах практичнее использовать rootless-подходы или контейнеризацию на уровне виртуализации. Если Docker недоступен напрямую, Ansible все равно может подготовить окружение и управлять запуском через подходящий механизм (например, Docker на отдельном хосте). Ниже приводится универсальный каркас автоматизации.

Подготовка Termux

Начнем с базовой подготовки окружения в Termux. Обновите пакеты и установите необходимые зависимости.

pkg update -y && pkg upgrade -y
pkg install -y git python jq curl

Далее (по ситуации) установите средства для работы с контейнерами. Если вы поднимаете Docker на самом Android, проверьте доступность компонента для вашего устройства. Если вы управляете удаленным Docker-хостом, в Termux понадобятся только клиентские утилиты и/или сетевые доступы.

Проверка базовой готовности среды:

uname -a
python --version
curl --version

Локальная конфигурация и переменные

Для воспроизводимости заведем структуру проекта на управляющей машине.

mkdir -p ~/docker-termux-ansible-terraform
cd ~/docker-termux-ansible-terraform
mkdir -p terraform ansible templates

В Terraform будут описаны переменные для узлов и параметры развертывания. В Ansible — плейбуки конфигурации и запуска.

Terraform: формирование параметров и инвентаря

Terraform удобен тем, что вы заранее задаете «контракт» входных данных. Например: IP-адрес устройства/хоста, порты сервисов, название контейнеров, пути к конфигам.

Создайте файл terraform/variables.tf:

variable "target_host" {
  type        = string
  description = "IP/hostname целевого Docker-хоста (локальная сеть)"
}

variable "ssh_user" {
  type        = string
  description = "Пользователь для SSH на целевом хосте"
  default     = "root"
}

variable "ssh_port" {
  type        = number
  description = "SSH port целевого хоста"
  default     = 22
}

variable "compose_project" {
  type        = string
  description = "Название проекта для Docker Compose"
  default     = "termux-demo"
}

variable "service_image" {
  type        = string
  description = "Образ сервиса для примера"
  default     = "nginx:alpine"
}

Далее создайте terraform/main.tf. В простом варианте Terraform не «создает инфраструктуру», а формирует файл инвентаря/выходные данные. Это все равно полезно: вы централизуете параметры и снижаете вероятность ошибок.

terraform {
  required_version = ">= 1.5.0"
}

output "ansible_inventory" {
  value = jsonencode({
    "all": {
      "hosts": {
        "target": {
          "ansible_host": var.target_host,
          "ansible_user": var.ssh_user,
          "ansible_port": var.ssh_port
        }
      }
    }
  })
}

Теперь в Terraform можно получить строку JSON с инвентарем. Запуск:

cd terraform
terraform init
terraform apply -var="target_host=192.168.1.50" -var="ssh_user=root"

Получите output и передайте его в Ansible (ниже показан вариант через файл). Для этого выполните:

terraform output -raw ansible_inventory > ../ansible/inventory.json

Ansible: установка Docker и поднятие контейнеров

Дальше создаем плейбук. Предположим, что целевой узел — Linux-хост (например, отдельный сервер) или тот же Android-хост с SSH-доступом. Важно понимать: Ansible управляет хостом по сети, а не «из коробки» устанавливает Docker в Termux без предварительных условий.

Создайте ansible/playbook.yml:

- name: Deploy Docker services
  hosts: all
  become: true
  vars:
    compose_project: "{{ lookup('vars', 'compose_project') | default('termux-demo') }}"
    service_image: "{{ lookup('vars', 'service_image') | default('nginx:alpine') }}"
  tasks:
    - name: Ensure dependencies for Docker/Compose
      ansible.builtin.package:
        name:
          - docker
          - docker-compose-plugin
        state: present

    - name: Ensure Docker service started
      ansible.builtin.service:
        name: docker
        state: started
        enabled: true

    - name: Create app directory
      ansible.builtin.file:
        path: "/opt/{{ compose_project }}"
        state: directory
        mode: "0755"

    - name: Copy docker-compose.yml
      ansible.builtin.template:
        src: "templates/docker-compose.yml.j2"
        dest: "/opt/{{ compose_project }}/docker-compose.yml"
        mode: "0644"

    - name: Docker compose up
      ansible.builtin.command:
        cmd: "docker compose -p {{ compose_project }} up -d"
        chdir: "/opt/{{ compose_project }}"
      register: compose_up
      changed_when: "'Creating' in compose_up.stdout or compose_up.rc == 0"

    - name: Show running containers
      ansible.builtin.command:
        cmd: "docker ps --format '{{'{{'}}.Names{{'}}'}}'"
      changed_when: false

Создайте шаблон ansible/templates/docker-compose.yml.j2:

services:
  web:
    image: {{ service_image }}
    container_name: "{{ compose_project }}-web"
    ports:
      - "8080:80"
    restart: unless-stopped

Подготовьте запуск Ansible с JSON-инвентарем. Создайте ansible/ansible.cfg (опционально):

[defaults]
inventory = inventory.json
host_key_checking = False
retry_files_enabled = False

Запуск плейбука:

cd ansible
ansible-playbook -i inventory.json playbook.yml --extra-vars "compose_project=termux-demo service_image=nginx:alpine"

Вариант: управление Docker-хостом через локальную сеть

Если вы планируете запуск Docker не на Android, а на отдельном хосте в вашей локальной сети, используйте:

  • корректную маршрутизацию/доступ по IP;
  • SSH-ключи вместо паролей;
  • минимальные привилегии, при необходимости — ограничение команд.

При необходимости создания локальной сети (например, через VPN) важно использовать ее только для объединения устройств в общую локальную сеть и управления ими, а не для обхода блокировок.

Практика безопасности

  • SSH-ключи: используйте ssh-keygen и настройте доступ без пароля.
  • Minimize privileges: не выдавайте избыточные права учетной записи, которой управляет Ansible.
  • Сетевые ограничения: открывайте порты (например, 8080) только в нужных сегментах сети.
  • Секреты: пароли/токены храните в Ansible Vault или в безопасном хранилище, а не в репозитории.

Как интегрировать Termux в процесс

Если Docker и контейнеры реально запускаются в Termux (на устройстве), подход может быть таким:

  • Termux готовит окружение и публикует SSH/сервер управления контейнерами (в рамках доступных возможностей вашего устройства);
  • Terraform формирует параметры (адрес устройства, проект, образы);
  • Ansible выполняет установку/конфигурацию и поднимает контейнеры.

Если же Docker нецелесообразно поднимать непосредственно в Termux, Termux становится «удобной консолью» для управления/мониторинга: вы собираете логи, выполняете проверки и при необходимости инициируете команды деплоя (например, через отдельные скрипты).

Тестирование и проверка результата

После выполнения Ansible проверьте:

  • что контейнеры поднялись: docker ps на целевом хосте;
  • что сервис доступен по порту (например, http://<host>:8080);
  • что контейнер перезапускается: restart: unless-stopped в compose.

Заключение

Связка Terraform + Ansible позволяет превратить развертывание Docker-контейнеров в Termux-сценарии в воспроизводимый процесс: вы задаете параметры один раз, формируете инвентарь и затем системно конфигурируете окружение и поднимаете сервисы. Такой подход снижает ручные ошибки, ускоряет повторные запуски и помогает поддерживать инфраструктуру в контролируемом состоянии.

Нужна настройка под ваш сценарий (локально в Termux или через управление Docker-хостом в локальной сети), подбор состава сервисов, безопасная схема доступа и подготовка плейбуков/шаблонов? Обратитесь в РыбинскЛАБ — мы поможем спроектировать и внедрить решение под ваши требования.

* Текст статьи подготовлен и структурирован с использованием технологий искусственного интеллекта. Проверен и доработан перед публикацией.

Нужна помощь с настройкой Termux, Linux и серверов?

Я оказываю ИТ-услуги: настройка серверов, автоматизация, безопасность, помощь с Linux и инфраструктурой. Материалы сайта — только в ознакомительных и образовательных целях.

Связаться со мной
Поддержать проект