Контейнеры в 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'
commitIPv6:
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
commitMTU для сети
set container network mynet mtu 1400
commitVRF для контейнерной сети
set container network mynet vrf MGMT
commitКонтейнерная сеть будет в указанном VRF.
Просмотр сетей
show container networkVolumes и монтирование
Монтирование директории
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
commitEnvironment 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
commitBind на конкретный 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
commitHostname
Установка hostname контейнера:
set container name myapp host-name myapp.local
commitHostname виден внутри контейнера и в DNS (если настроен).
Restart Policy
Политика перезапуска контейнера при падении:
Always
Всегда перезапускать (по умолчанию):
set container name myapp restart always
commitOn-failure
Перезапускать только при ненулевом exit code:
set container name myapp restart on-failure
commitNo
Не перезапускать:
set container name myapp restart no
commitResource Limits
CPU Quota
Ограничение CPU (в процентах):
set container name myapp cpu-quota 50
commit50 = 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
commitCapabilities
Управление 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
commitInsecure Registry
Для HTTP registry (не рекомендуется):
set container registry myregistry address registry.local:5000
set container registry myregistry disable-verify
commitMirror 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
commitSquid прокси-сервер
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
commitOpenVPN клиент
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
commitPrometheus мониторинг
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
commitNAT для контейнеров
Контейнеры с доступом в интернет через 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
commitDNAT для публикации сервиса:
# Пробросить порт 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
commitRouting для контейнеров
Статический маршрут для контейнерной сети:
set protocols static route 172.20.0.0/16 interface eth1
commitVRF изоляция
Контейнеры в отдельном 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
commitVK 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
commitS3-совместимое хранилище:
# 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 myappJournald логи:
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 myappPing из 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/24Read-only volumes
Монтируйте конфигурацию как read-only:
set container name myapp volume config mode roРегулярные обновления
Обновляйте образы для получения security patches:
update container image myapp
restart container myappFirewall защита
Ограничьте доступ к контейнерам через 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 rwNetwork performance
Используйте MTU optimization:
set container network mynet mtu 9000Для jumbo frames на поддерживаемом hardware.
Ограничения
- Podman работает в rootless режиме с ограничениями
- Некоторые контейнеры требуют privileged режим (все capabilities)
- Графические приложения не поддерживаются
- Большие контейнеры (>1GB RAM) могут влиять на производительность VyOS
- Контейнеры перезапускаются при reboot VyOS
Лучшие практики
- Используйте /config - для persistent данных
- Ограничивайте ресурсы - устанавливайте CPU и memory limits
- Минимальные привилегии - только необходимые capabilities
- Отдельные сети - изоляция по функциям
- Firewall защита - контролируйте доступ
- Регулярные обновления - обновляйте образы
- Мониторинг - отслеживайте логи и ресурсы
- Резервное копирование - включайте /config/containers в backup
- Тестирование - проверяйте контейнеры перед production
- Документация - описывайте назначение контейнеров