April 7

Как запустить балансировку HAProxy в Docker на AstraLinux

Установка Docker

Для начала установим Docker на AstraLinux:

sudo apt update
sudo apt install docker.io
sudo usermod -aG docker $USER

После этого перезапустите все терминальные сессии, чтобы изменения вступили в силу.

Подробнее об установке Docker можно прочитать в официальной документации AstraLinux.

Запуск HAProxy в Docker

Можно ли запускать HAProxy в Docker? Конечно! Docker сегодня используется повсеместно, и многие приложения, включая HAProxy, доступны в виде контейнеров.

Преимущества Docker

  • Простота развертывания – не нужно компилировать HAProxy или устанавливать зависимости.
  • Изоляция – сервис работает в контейнере, не затрагивая основную систему.
  • Управление жизненным циклом – запуск, остановка и обновление происходят через стандартные команды Docker.

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

Docker практически не нагружает CPU, так как контейнеры работают напрямую через ядро ОС. Однако сетевые задержки могут увеличиться из-за NAT (примерно до 70 мкс для небольших запросов). Если критична минимальная задержка, можно использовать сетевой режим host.

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

HAProxy внутри Docker запускается от root, но после инициализации переключается на непривилегированного пользователя. Рекомендуется использовать официальные образы от HAProxy Technologies, чтобы избежать рисков.

Практический пример: балансировка нагрузки

Создадим сеть Docker и три контейнера с тестовым веб-приложением:

sudo docker network create --driver=bridge mynetwork

sudo docker run -d --name web1 --net mynetwork jmalloc/echo-server:latest  
sudo docker run -d --name web2 --net mynetwork jmalloc/echo-server:latest  
sudo docker run -d --name web3 --net mynetwork jmalloc/echo-server:latest  

Проверим, что контейнеры запущены:

sudo docker ps

Настройка HAProxy

Создадим конфигурационный файл haproxy.cfg:

global
  stats socket /var/run/api.sock user haproxy group haproxy mode 660 level admin expose-fd listeners
  log stdout format raw local0 info

defaults
  mode http
  timeout client 10s
  timeout connect 5s
  timeout server 10s
  timeout http-request 10s
  log global

frontend stats
  bind *:8404
  stats enable
  stats uri /
  stats refresh 10s

frontend myfrontend
  bind :80
  default_backend webservers

backend webservers
  server s1 web1:8080 check
  server s2 web2:8080 check
  server s3 web3:8080 check

Запуск HAProxy

sudo docker run -d \
   --name haproxy \
   --net mynetwork \
   -v $(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \
   -p 80:80 \
   -p 8404:8404 \
   haproxytech/haproxy-alpine:latest

Теперь:

  • Веб-приложение доступно на http://localhost (запросы балансируются между web1, web2, web3).
  • Статистика HAProxy – на http://localhost:8404.

Перезагрузка конфигурации без остановки

sudo docker kill -s HUP haproxy

Остановка и удаление

sudo docker stop web1 web2 web3 haproxy
sudo docker rm web1 web2 web3 haproxy
sudo docker network rm mynetwork

Заключение

Запуск HAProxy в Docker упрощает развертывание и управление балансировщиком нагрузки. Оригинал исходной статьи: https://www.haproxy.com/blog/how-to-run-haproxy-with-docker