Контейнеры в VyOS - Podman Container Management

Контейнеры в VyOS - Podman Container Management

VyOS поддерживает запуск контейнеров на базе Podman, позволяя развертывать приложения непосредственно на маршрутизаторе.

Обзор

VyOS использует Podman - daemonless (без демона) контейнерный движок, совместимый с Docker и OCI стандартами.

Возможности:

  • Запуск OCI-совместимых контейнеров
  • Интеграция с VyOS networking
  • Управление образами из различных registries
  • Пользовательские контейнерные сети
  • Volume и device mounting
  • Ограничение ресурсов (CPU, память)
  • Автоматический перезапуск
  • Управление capabilities

Использование:

  • Мониторинг (Zabbix, Prometheus)
  • DNS сервисы (Pi-hole, AdGuard)
  • Веб-сервисы
  • Прокси серверы (Squid, HAProxy)
  • VPN клиенты
  • Утилиты и инструменты

Базовая конфигурация

Простой контейнер

Запуск контейнера из Docker Hub:

set container name nginx image docker.io/nginx:latest
commit

Контейнер будет запущен автоматически после commit.

Контейнер с портом

Пробросить порт хоста в контейнер:

set container name nginx image docker.io/nginx:latest
set container name nginx port http source 8080
set container name nginx port http destination 80
set container name nginx port http protocol tcp
commit

Теперь nginx доступен на http://<vyos-ip>:8080.

Проверка состояния

show container
show container nginx

Образы контейнеров

Загрузка образа

Образ загружается автоматически при commit, но можно загрузить вручную:

add container image docker.io/nginx:latest

Просмотр образов

show container image

Пример вывода:

REPOSITORY               TAG      IMAGE ID      CREATED      SIZE
docker.io/library/nginx  latest   3b25b682ea82  2 weeks ago  192 MB

Обновление образа

update container image nginx

Загружает новую версию образа (если тег изменился).

Указание образа

set container name myapp image docker.io/myuser/myapp:1.0
commit

Формат: registry/repository:tag

По умолчанию используется Docker Hub (docker.io).

Entrypoint и Command

Переопределение entrypoint:

set container name myapp image myapp:latest
set container name myapp entrypoint '/usr/local/bin/custom-start.sh'
commit

Аргументы команды:

set container name myapp image myapp:latest
set container name myapp command '/bin/bash'
set container name myapp arguments '-c "echo Hello && sleep infinity"'
commit

Сетевая конфигурация

Контейнерная сеть

Создание пользовательской сети:

set container network mynet prefix 172.20.0.0/16
set container network mynet description 'Custom container network'
commit

IPv6:

set container network mynet prefix fd00::/64
commit

Подключение контейнера к сети

set container name nginx network mynet
commit

Контейнер получит динамический IP из сети mynet.

Статический IP

set container name nginx network mynet address 172.20.0.10
commit

MTU для сети

set container network mynet mtu 1400
commit

VRF для контейнерной сети

set container network mynet vrf MGMT
commit

Контейнерная сеть будет в указанном VRF.

Просмотр сетей

show container network

Volumes и монтирование

Монтирование директории

set container name nginx volume config source /config/nginx
set container name nginx volume config destination /etc/nginx/conf.d
set container name nginx volume config mode ro
commit
  • source - путь на VyOS
  • destination - путь в контейнере
  • mode - ro (read-only) или rw (read-write)

Монтирование конфигурационного файла

set container name app volume appconfig source /config/app.conf
set container name app volume appconfig destination /etc/app/app.conf
set container name app volume appconfig mode ro
commit

Данные в /config

Для сохранения данных между перезагрузками используйте /config:

set container name database volume data source /config/database
set container name database volume data destination /var/lib/postgresql/data
set container name database volume data mode rw
commit

/config - единственная директория VyOS, которая сохраняется между перезагрузками.

Device mounting

Монтирование устройств (например, USB):

set container name app device source /dev/ttyUSB0
set container name app device destination /dev/ttyUSB0
commit

Environment Variables

Передача переменных окружения в контейнер:

set container name myapp environment TZ value 'Europe/Moscow'
set container name myapp environment DEBUG value 'true'
set container name myapp environment DB_HOST value '192.168.1.100'
commit

Формат:

set container name <name> environment <KEY> value '<value>'

Секреты (пароли):

set container name db environment POSTGRES_PASSWORD value 'secret123'
commit

Порты

Проброс портов TCP

set container name webapp port http source 8080
set container name webapp port http destination 80
set container name webapp port http protocol tcp
commit
  • source - порт на VyOS
  • destination - порт в контейнере
  • protocol - tcp или udp

Теперь трафик на <vyos-ip>:8080 будет перенаправлен в контейнер на порт 80.

Проброс портов UDP

set container name dnsserver port dns source 5353
set container name dnsserver port dns destination 53
set container name dnsserver port dns protocol udp
commit

Множественные порты

set container name webapp port http source 8080
set container name webapp port http destination 80
set container name webapp port http protocol tcp

set container name webapp port https source 8443
set container name webapp port https destination 443
set container name webapp port https protocol tcp

commit

Bind на конкретный IP

Для bind на конкретный интерфейс используйте firewall DNAT:

set nat destination rule 10 destination address 192.168.1.1
set nat destination rule 10 destination port 8080
set nat destination rule 10 inbound-interface name eth1
set nat destination rule 10 translation address 172.20.0.10
set nat destination rule 10 translation port 80
set nat destination rule 10 protocol tcp
commit

Hostname

Установка hostname контейнера:

set container name myapp host-name myapp.local
commit

Hostname виден внутри контейнера и в DNS (если настроен).

Restart Policy

Политика перезапуска контейнера при падении:

Always

Всегда перезапускать (по умолчанию):

set container name myapp restart always
commit

On-failure

Перезапускать только при ненулевом exit code:

set container name myapp restart on-failure
commit

No

Не перезапускать:

set container name myapp restart no
commit

Resource Limits

CPU Quota

Ограничение CPU (в процентах):

set container name myapp cpu-quota 50
commit

50 = 50% одного CPU core.

Memory Limit

Ограничение памяти (в мегабайтах):

set container name myapp memory 512
commit

Контейнер ограничен 512 MB RAM.

Комбинированные лимиты

set container name myapp cpu-quota 25
set container name myapp memory 256
commit

Capabilities

Управление Linux capabilities для контейнера.

Добавление capability

set container name myapp capability net-admin
set container name myapp capability sys-time
commit

Часто используемые capabilities:

  • net-admin - управление сетью
  • sys-time - изменение системного времени
  • net-raw - raw sockets (ping)
  • sys-module - загрузка kernel модулей

Privileged контейнеры

Для полного доступа (все capabilities):

set container name myapp capability all
commit

Используйте с осторожностью (снижает безопасность).

Sysctl параметры

Изменение kernel параметров для контейнера:

set container name myapp sysctl parameter net.ipv4.ip_forward value 1
commit

Требует соответствующих capabilities.

Container Registries

Настройка registry

По умолчанию VyOS использует Docker Hub (docker.io).

Добавление дополнительного registry:

set container registry gitlab address registry.gitlab.com
commit

Аутентификация

Для приватных registries:

set container registry myprivate address registry.example.com
set container registry myprivate authentication username myuser
set container registry myprivate authentication password mypassword
commit

Insecure Registry

Для HTTP registry (не рекомендуется):

set container registry myregistry address registry.local:5000
set container registry myregistry disable-verify
commit

Mirror Registry

Зеркало Docker Hub:

set container registry dockermirror mirror address mirror.gcr.io
commit

Логирование

Драйвер логирования

По умолчанию используется journald.

Изменение драйвера:

set container name myapp log-driver k8s-file
commit

Доступные драйверы:

  • journald - systemd journal
  • k8s-file - Kubernetes-совместимые файлы
  • none - без логирования

Просмотр логов

show container log myapp

Логи также доступны через journald:

journalctl -u vyos-container-myapp

Примеры конфигурации

Pi-hole DNS сервер

Блокировка рекламы и DNS фильтрация:

# Контейнерная сеть
set container network pihole prefix 172.21.0.0/24

# Pi-hole контейнер
set container name pihole image docker.io/pihole/pihole:latest
set container name pihole network pihole address 172.21.0.10
set container name pihole restart always

# Порты
set container name pihole port dns-tcp source 5353
set container name pihole port dns-tcp destination 53
set container name pihole port dns-tcp protocol tcp

set container name pihole port dns-udp source 5353
set container name pihole port dns-udp destination 53
set container name pihole port dns-udp protocol udp

set container name pihole port web source 8080
set container name pihole port web destination 80
set container name pihole port web protocol tcp

# Environment
set container name pihole environment TZ value 'Europe/Moscow'
set container name pihole environment WEBPASSWORD value 'admin123'

# Volumes
set container name pihole volume config source /config/pihole/config
set container name pihole volume config destination /etc/pihole
set container name pihole volume config mode rw

set container name pihole volume dnsmasq source /config/pihole/dnsmasq.d
set container name pihole volume dnsmasq destination /etc/dnsmasq.d
set container name pihole volume dnsmasq mode rw

commit

Доступ к веб-интерфейсу: http://<vyos-ip>:8080/admin

Zabbix мониторинг

Multi-container мониторинговая система:

# Контейнерная сеть
set container network zabbix prefix 172.22.0.0/24

# PostgreSQL база данных
set container name postgres image docker.io/postgres:14
set container name postgres network zabbix address 172.22.0.2
set container name postgres restart always

set container name postgres environment POSTGRES_DB value 'zabbix'
set container name postgres environment POSTGRES_USER value 'zabbix'
set container name postgres environment POSTGRES_PASSWORD value 'zabbix_password'

set container name postgres volume data source /config/zabbix/postgresql
set container name postgres volume data destination /var/lib/postgresql/data
set container name postgres volume data mode rw

# Zabbix Server
set container name zabbix-server image docker.io/zabbix/zabbix-server-pgsql:latest
set container name zabbix-server network zabbix address 172.22.0.3
set container name zabbix-server restart always

set container name zabbix-server environment DB_SERVER_HOST value '172.22.0.2'
set container name zabbix-server environment POSTGRES_DB value 'zabbix'
set container name zabbix-server environment POSTGRES_USER value 'zabbix'
set container name zabbix-server environment POSTGRES_PASSWORD value 'zabbix_password'

set container name zabbix-server port trapper source 10051
set container name zabbix-server port trapper destination 10051
set container name zabbix-server port trapper protocol tcp

# Zabbix Web Frontend
set container name zabbix-web image docker.io/zabbix/zabbix-web-nginx-pgsql:latest
set container name zabbix-web network zabbix address 172.22.0.4
set container name zabbix-web restart always

set container name zabbix-web environment ZBX_SERVER_HOST value '172.22.0.3'
set container name zabbix-web environment DB_SERVER_HOST value '172.22.0.2'
set container name zabbix-web environment POSTGRES_DB value 'zabbix'
set container name zabbix-web environment POSTGRES_USER value 'zabbix'
set container name zabbix-web environment POSTGRES_PASSWORD value 'zabbix_password'
set container name zabbix-web environment PHP_TZ value 'Europe/Moscow'

set container name zabbix-web port http source 8081
set container name zabbix-web port http destination 8080
set container name zabbix-web port http protocol tcp

commit

Доступ: http://<vyos-ip>:8081 (admin/zabbix)

Nginx веб-сервер

Статический веб-сервер с пользовательской конфигурацией:

set container network web prefix 172.23.0.0/24

set container name nginx image docker.io/nginx:latest
set container name nginx network web address 172.23.0.10
set container name nginx restart always

set container name nginx port http source 8080
set container name nginx port http destination 80
set container name nginx port http protocol tcp

set container name nginx port https source 8443
set container name nginx port https destination 443
set container name nginx port https protocol tcp

# Volumes
set container name nginx volume html source /config/www/html
set container name nginx volume html destination /usr/share/nginx/html
set container name nginx volume html mode ro

set container name nginx volume config source /config/www/nginx.conf
set container name nginx volume config destination /etc/nginx/nginx.conf
set container name nginx volume config mode ro

commit

Squid прокси-сервер

HTTP/HTTPS прокси:

set container network proxy prefix 172.24.0.0/24

set container name squid image docker.io/ubuntu/squid:latest
set container name squid network proxy address 172.24.0.10
set container name squid restart always

set container name squid port proxy source 3128
set container name squid port proxy destination 3128
set container name squid port proxy protocol tcp

set container name squid volume config source /config/squid/squid.conf
set container name squid volume config destination /etc/squid/squid.conf
set container name squid volume config mode ro

set container name squid volume cache source /config/squid/cache
set container name squid volume cache destination /var/spool/squid
set container name squid volume cache mode rw

commit

OpenVPN клиент

VPN клиент в контейнере для маршрутизации трафика:

set container network vpn prefix 172.25.0.0/24

set container name ovpn-client image docker.io/dperson/openvpn-client:latest
set container name ovpn-client network vpn address 172.25.0.10
set container name ovpn-client restart always

set container name ovpn-client capability net-admin

set container name ovpn-client volume config source /config/openvpn/client.ovpn
set container name ovpn-client volume config destination /vpn/client.ovpn
set container name ovpn-client volume config mode ro

set container name ovpn-client volume auth source /config/openvpn/auth.txt
set container name ovpn-client volume auth destination /vpn/auth.txt
set container name ovpn-client volume auth mode ro

set container name ovpn-client device source /dev/net/tun
set container name ovpn-client device destination /dev/net/tun

commit

Prometheus мониторинг

Metrics и мониторинг:

set container network monitoring prefix 172.26.0.0/24

# Prometheus
set container name prometheus image docker.io/prom/prometheus:latest
set container name prometheus network monitoring address 172.26.0.10
set container name prometheus restart always

set container name prometheus port web source 9090
set container name prometheus port web destination 9090
set container name prometheus port web protocol tcp

set container name prometheus volume config source /config/prometheus/prometheus.yml
set container name prometheus volume config destination /etc/prometheus/prometheus.yml
set container name prometheus volume config mode ro

set container name prometheus volume data source /config/prometheus/data
set container name prometheus volume data destination /prometheus
set container name prometheus volume data mode rw

# Node Exporter (host metrics)
set container name node-exporter image docker.io/prom/node-exporter:latest
set container name node-exporter network monitoring address 172.26.0.11
set container name node-exporter restart always

set container name node-exporter port metrics source 9100
set container name node-exporter port metrics destination 9100
set container name node-exporter port metrics protocol tcp

# Grafana
set container name grafana image docker.io/grafana/grafana:latest
set container name grafana network monitoring address 172.26.0.12
set container name grafana restart always

set container name grafana port web source 3000
set container name grafana port web destination 3000
set container name grafana port web protocol tcp

set container name grafana volume data source /config/grafana
set container name grafana volume data destination /var/lib/grafana
set container name grafana volume data mode rw

set container name grafana environment GF_SECURITY_ADMIN_PASSWORD value 'admin123'

commit

Операционные команды

Просмотр контейнеров

Все контейнеры:

show container

Пример вывода:

NAME      STATE    IMAGE                           NETWORK
nginx     running  docker.io/library/nginx:latest  mynet
pihole    running  docker.io/pihole/pihole:latest  pihole

Детали контейнера:

show container nginx

Просмотр образов

show container image

Просмотр сетей

show container network

Пример вывода:

NETWORK ID    NAME     DRIVER
abc123def456  mynet    bridge

Логи контейнера

show container log nginx

Последние 50 строк:

show container log nginx tail 50

Перезапуск контейнера

restart container nginx

Загрузка образа

add container image docker.io/nginx:alpine

Обновление образа

update container image nginx

Загружает новую версию образа (если доступна).

Удаление контейнера

delete container name nginx
commit

Интеграция с VyOS

Firewall для контейнеров

Защита доступа к контейнерам:

# Разрешить доступ к nginx только из LAN
set firewall ipv4 forward filter rule 100 action accept
set firewall ipv4 forward filter rule 100 destination address 172.20.0.10
set firewall ipv4 forward filter rule 100 destination port 80
set firewall ipv4 forward filter rule 100 source address 192.168.1.0/24
set firewall ipv4 forward filter rule 100 protocol tcp

set firewall ipv4 forward filter rule 101 action drop
set firewall ipv4 forward filter rule 101 destination address 172.20.0.10
set firewall ipv4 forward filter rule 101 destination port 80
set firewall ipv4 forward filter rule 101 protocol tcp

commit

NAT для контейнеров

Контейнеры с доступом в интернет через NAT:

# SNAT для контейнерной сети
set nat source rule 100 source address 172.20.0.0/16
set nat source rule 100 outbound-interface name eth0
set nat source rule 100 translation address masquerade

commit

DNAT для публикации сервиса:

# Пробросить порт 80 внешнего IP в контейнер
set nat destination rule 10 destination address 203.0.113.10
set nat destination rule 10 destination port 80
set nat destination rule 10 inbound-interface name eth0
set nat destination rule 10 protocol tcp
set nat destination rule 10 translation address 172.20.0.10
set nat destination rule 10 translation port 80

commit

Routing для контейнеров

Статический маршрут для контейнерной сети:

set protocols static route 172.20.0.0/16 interface eth1
commit

VRF изоляция

Контейнеры в отдельном VRF:

# Создать VRF
set vrf name CONTAINERS table 100
set vrf name CONTAINERS description 'Container network'

# Контейнерная сеть в VRF
set container network mynet vrf CONTAINERS
set container network mynet prefix 172.20.0.0/16

commit

Интеграция с облачными платформами

Yandex Cloud

При развертывании VyOS в Yandex Cloud контейнеры могут использоваться для интеграции с облачными сервисами:

Container Registry интеграция:

# Использование Yandex Container Registry
set container registry yandex address cr.yandex
set container registry yandex authentication username oauth
set container registry yandex authentication password '<yandex-oauth-token>'
commit

# Запуск контейнера из Yandex Container Registry
set container name myapp image cr.yandex/<registry-id>/myapp:latest
commit

Мониторинг с Yandex Monitoring:

# Prometheus exporter для метрик в Yandex Monitoring
set container name unified-agent image cr.yandex/yc/unified-agent:latest
set container name unified-agent network monitoring
set container name unified-agent environment FOLDER_ID value '<folder-id>'
set container name unified-agent environment IAM_TOKEN value '<iam-token>'
commit

Логирование в Yandex Cloud Logging:

# Fluent Bit для отправки логов
set container name fluent-bit image cr.yandex/yc/fluent-bit:latest
set container name fluent-bit network monitoring
set container name fluent-bit volume config source /config/fluent-bit.conf
set container name fluent-bit volume config destination /fluent-bit/etc/fluent-bit.conf
set container name fluent-bit volume config mode ro
commit

VK Cloud

Интеграция с VK Cloud (Mail.ru Cloud Solutions):

VK Cloud Container Registry:

# Настройка registry для VK Cloud
set container registry vkcloud address hub.mcs.mail.ru
set container registry vkcloud authentication username '<username>'
set container registry vkcloud authentication password '<password>'
commit

# Запуск контейнера из VK Cloud Registry
set container name myapp image hub.mcs.mail.ru/<project>/myapp:latest
commit

S3-совместимое хранилище:

# MinIO клиент для интеграции с VK Cloud S3
set container name minio-client image docker.io/minio/mc:latest
set container name minio-client network storage
set container name minio-client environment MC_HOST_vkcloud value 'https://<access-key>:<secret-key>@hb.vkcs.cloud'
commit

Устранение неполадок

Контейнер не запускается

Проверьте статус:

show container myapp

Проверьте логи:

show container log myapp

Journald логи:

journalctl -u vyos-container-myapp -n 50

Образ не загружается

Проверьте доступность registry:

ping registry.example.com

Проверьте DNS:

nslookup docker.io

Проверьте аутентификацию:

show container registry

Сетевые проблемы

Проверьте контейнерную сеть:

show container network

Проверьте IP контейнера:

show container myapp

Ping из VyOS:

ping 172.20.0.10

Порты не доступны

Проверьте проброс портов:

show configuration commands | grep "container name myapp port"

Проверьте firewall:

show firewall

Проверьте NAT:

show nat source rules
show nat destination rules

Проблемы с volumes

Проверьте права доступа:

ls -la /config/myapp

Убедитесь что директория существует:

mkdir -p /config/myapp

Высокое потребление ресурсов

Проверьте использование:

show container

Установите лимиты:

set container name myapp cpu-quota 50
set container name myapp memory 512
commit

Безопасность

Минимальные привилегии

Запускайте контейнеры с минимальными capabilities:

# Избегайте
set container name myapp capability all

# Предпочитайте
set container name myapp capability net-admin

Изоляция сети

Используйте отдельные сети для разных приложений:

set container network web prefix 172.20.0.0/24
set container network db prefix 172.21.0.0/24

Read-only volumes

Монтируйте конфигурацию как read-only:

set container name myapp volume config mode ro

Регулярные обновления

Обновляйте образы для получения security patches:

update container image myapp
restart container myapp

Firewall защита

Ограничьте доступ к контейнерам через firewall:

set firewall ipv4 forward filter rule 100 action accept
set firewall ipv4 forward filter rule 100 destination address 172.20.0.0/24
set firewall ipv4 forward filter rule 100 source address 192.168.1.0/24

set firewall ipv4 forward filter rule 999 action drop
set firewall ipv4 forward filter rule 999 destination address 172.20.0.0/24

Лимиты ресурсов

Предотвращайте DoS через ограничение ресурсов:

set container name myapp cpu-quota 50
set container name myapp memory 512
commit

Производительность

Resource allocation

Планируйте ресурсы для контейнеров:

Рекомендации:

  • Веб-сервер: 256-512 MB, CPU 25-50%
  • База данных: 1024-2048 MB, CPU 50-100%
  • Мониторинг: 512-1024 MB, CPU 25-50%

Storage performance

Для баз данных используйте отдельные диски:

# Монтировать SSD для базы данных
set container name postgres volume data source /mnt/ssd/postgres
set container name postgres volume data destination /var/lib/postgresql/data
set container name postgres volume data mode rw

Network performance

Используйте MTU optimization:

set container network mynet mtu 9000

Для jumbo frames на поддерживаемом hardware.

Ограничения

  • Podman работает в rootless режиме с ограничениями
  • Некоторые контейнеры требуют privileged режим (все capabilities)
  • Графические приложения не поддерживаются
  • Большие контейнеры (>1GB RAM) могут влиять на производительность VyOS
  • Контейнеры перезапускаются при reboot VyOS

Лучшие практики

  1. Используйте /config - для persistent данных
  2. Ограничивайте ресурсы - устанавливайте CPU и memory limits
  3. Минимальные привилегии - только необходимые capabilities
  4. Отдельные сети - изоляция по функциям
  5. Firewall защита - контролируйте доступ
  6. Регулярные обновления - обновляйте образы
  7. Мониторинг - отслеживайте логи и ресурсы
  8. Резервное копирование - включайте /config/containers в backup
  9. Тестирование - проверяйте контейнеры перед production
  10. Документация - описывайте назначение контейнеров

Дополнительные ресурсы

Следующие шаги

  • Firewall - защита контейнеров
  • NAT - публикация сервисов
  • VRF - изоляция контейнерных сетей
  • System - мониторинг ресурсов
Проверено OpenNix LLC · Обновлено