Дерево страниц

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 3 Следующий »

Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 и РУСБ.10015-01 (очередное обновление 1.7)
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)

Введение

В статье приводится пример создания инфраструктуры сетевой службы RabbitMQ (далее - служба), обрабатывающей потоки данных с разными классификационными метками с соблюдением изоляции потоков данных. При этом:

  1. Обработка каждого потока выполняется отдельным экземпляром службы в непривилегированном docker-контейнере (см. Установка и администрирование Docker в Astra Linux 1.7) с меткой безопасности, равной метке безопасности потока. Для примера предполагается, что используются метки безопасности 0:0:0:0, 1:0:0:0 и 2:0:0:0 (см. Работа docker в непривилегированном режиме с ненулевыми метками безопасности).
  2. Служба внутри каждого контейнера работает с нулевой меткой безопасности используя стандартные настройки сетевых портов.
  3. Со стороны операционной системы для каждого контейнера назначается свой отдельный набор физических сетевых портов, средствами гипервизора docker перенаправляемых в стандартные сетевые порты службы в контейнере.
  4. Приложения, работая с собственными классификационными метками, направляют сетевые пакеты в стандартные порты службы. Сетевые пакеты при этом помечены классификационными метками, с которыми работают приложения.
  5. Сетевые пакеты, поступающие на стандартные порты, средствами сетевого фильтра iptables на основании классификационных меток сетевых пакетов перенаправляются на физические порта контейнеров с соответствующими метками.
  6. Сетевые пакеты, поступающие на физические порты контейнера, средствами гипервизора docker перенаправляются  на стандартные порты службы в контейнере.


Таблица перенаправления портов:

Стандартный сетевой порт
для прикладного ПО
Метка безопасности
сетевого пакета
Физический сетевой портСетевой порт контейнера
56720:0:0:056000Контейнер 0:0:0:0, порт 5672
1:0:0:056010Контейнер 1:0:0:0, порт 5672
2:0:0:056020Контейнер 2:0:0:0, порт 5672
156720:0:0:056001Контейнер 0:0:0:0, порт 15672
1:0:0:056011Контейнер 1:0:0:0, порт 15672
2:0:0:056021Контейнер 2:0:0:0, порт 15672
256720:0:0:056002Контейнер 0:0:0:0, порт 25672
1:0:0:056012Контейнер 1:0:0:0, порт 25672
2:0:0:056022Контейнер 2:0:0:0, порт 25672

Поясняющая схема (на примере порта 5672):

Подготовка docker-контейнера

Установка и настройка пакетов для подготовки docker-контейнеров

В примере в качестве исходного образа используется готовый образ Astra Linux Special Edition 1.7, доступный в docker-репозитории Astra Linux. Для его развертывания нужен только один пакет — docker.io:

sudo apt install -y docker.io
Можно также использовать собственные образы, см. Создание Docker-образов Astra Linux.

Далее предполагается, что текущий пользователь включен в группу docker и все действия выполняются от его имени без использования sudo (см. Установка и администрирование Docker в Astra Linux 1.7). Включить текущего пользователя в группу можно командой:

sudo usermod -aG docker $USER
Для начала действия включения пользователя в группу обычно рекомендуется перезапустить пользовательскую сессию. В целях тестирования актуализировать включение пользователя в группу можно следующими командами (команда действуют только на активный терминал, для выполнения понадобится ввести пароль пользователя):
exec su - $USER
Если пользовательская сессия не перезапускалась, то для последующего корректного запуска графических приложений желательно установить значения переменных окружения:
export DISPLAY=:0 HOME=/home/$USER HOSTNAME=`hostname`

Загрузка исходного образа

Загрузить базовый образ из репозитория:

docker pull registry.astralinux.ru/library/alse:1.7.3
Проверить загруженный образ:
docker image ls

Пример вывода команды:
REPOSITORY                            TAG       IMAGE ID       CREATED        SIZE
registry.astralinux.ru/library/alse   1.7.3     83d2946f21f2   4 weeks ago    94.3MB

Создание контейнера службы

Контейнер службы создается из загруженного на предыдущем шаге исходного образа registry.astralinux.ru/library/alse:1.7.3. В исходный образ вносятся следующие изменения:

  1. Устанавливается пакет rabbitmq-server.
  2. Включается плагин rabbit-management.
  3. Создается пустой файл /etc/rabbitmq/rabbitmq.conf. Используемый минимальный docker-образ Astra Linux Special Edition не поддерживает МРД и МКЦ, и файл /etc/rabbitmq/rabbitmq.conf создается для устранения предупреждений;
  4. Изменяются принятые по умолчанию имя и пароль администратора службы rabbitmq (guest и guest). Для примера используются имя и пароль astra и astra. Изменения записываются в файл /etc/rabbitmq/rabbitmq.conf. Побочным эффектом изменения имени является разрешение доступа через web-интерфейс, что далее упрощает администрирование службы в docker-контейнере.
  5. Разрешается доступ к сетевым портами, используемым службой (опция EXPOSE). Полный список портов см. по ссылке https://www.rabbitmq.com/networking.html. Доступ открывается ко всем перечисленным в списке портам.
  6. Добавляется команда, выполняемая при запуске контейнера (опция ENTRYPOINT /usr/sbin/rabbitmq-server) – запуск службы.

Для создания контейнера службы:

  1. Создать файл dockerfile со следующим содержимым:

    FROM registry.astralinux.ru/library/alse:1.7.3
    RUN apt update && apt install -y rabbitmq-server && rabbitmq-plugins enable rabbitmq_management
    RUN mkdir -p /etc/parsec/
    RUN touch /etc/parsec/privsock.conf
    RUN echo "default_user = astra" >> /etc/rabbitmq/rabbitmq.conf
    RUN echo "default_pass = astra" >> /etc/rabbitmq/rabbitmq.conf
    RUN cat /etc/rabbitmq/rabbitmq.conf
    # https://www.rabbitmq.com/networking.html
    EXPOSE 1883
    EXPOSE 4369
    EXPOSE 5551-5552
    EXPOSE 5671-5672
    EXPOSE 6000-6500
    EXPOSE 8883
    EXPOSE 15671-15672
    EXPOSE 15674-15675
    EXPOSE 15692
    EXPOSE 25672
    EXPOSE 35672-35682
    EXPOSE 61613-61614
    ENTRYPOINT /usr/sbin/rabbitmq-server
  2. Выполнить команду:

    docker build -t astra-rabbitmq:latest -f dockerfile .
    В результате выполнения команды будет создан контейнер с именем astra-rabbitmq:latest.

  3. Проверить список образов можно командой:

    docker image ls
    Примерный вывод команды:

    REPOSITORY                            TAG       IMAGE ID       CREATED          SIZE
    astra-rabbitmq                        latest    bd6b882259b0   10 seconds ago   455MB
    registry.astralinux.ru/library/alse   1.7.3     83d2946f21f2   4 weeks ago      94.3MB

Запуск и проверка docker-контейнера

Запустить из созданного образа docker-контейнер службы командой:

docker run -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name astra-rabbitmq astra-rabbitmq:latest

Опции команды:

  • -d — выполнение контейнера в фоновом режиме;
  • -p — перенаправление сетевых портов. Указанные сетевые порты физического компьютера перенаправляются на порты docker-контейнера. Для упрощения примера используется минимальный набор портов, достаточный для первичной проверки работы;
  • --n astra-rabbitmq — имя контейнера (astra-rabbitmq);
  •  astra-rabbitmq:latest — имя образа из которого запускается контейнер.

Для простейших проверок работоспособности контейнера можно выполнить следующие действия:

  1. Убедиться, что сетевые порты перенаправлены:

    sudo netstat -putln | grep docker-proxy

    tcp        0      0 0.0.0.0:5672            0.0.0.0:*               LISTEN      8135/docker-proxy   
    tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      8107/docker-proxy   
    tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      8121/docker-proxy   
    Для проверки непривилегированного контейнера использовать команду:
    sudo netstat -putln | grep rootlesskit

  2. Убедиться, что контейнер запущен:

    docker container ls

    CONTAINER ID   IMAGE                   COMMAND                  CREATED              STATUS              PORTS                                                                                                                                                                                                                       NAMES
    8bf47e60863a   astra-rabbitmq:latest   "/bin/sh -c /usr/sbi…"   About a minute ago   Up About a minute   1883/tcp, 4369/tcp, 5551-5552/tcp, 5671/tcp, 6000-6500/tcp, 8883/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15674-15675/tcp, 0.0.0.0:15672->15672/tcp, 15692/tcp, 35672-35682/tcp, 61613-61614/tcp, 0.0.0.0:25672->25672/tcp   astra-rabbitmq

  3. Подключиться к web-интерфейсу службы в контейнере (для входа использовать заданные ранее имя astra и пароль astra:

    firefox http://127.0.0.1:15672/
    или, если пользовательская сессия не перезапускалась и переменным окружения не были присвоены значения:
    DISPLAY=:0 firefox http://127.0.0.1:15672/

  4. Выполнить в контейнере команду проверки текущего статуса службы:

    docker exec astra-rabbitmq rabbitmqctl status

Экспорт образа для последующего использования

Экспортировать образ для последующего развертывания:

docker save astra-rabbitmq:latest -o astra-rabbitmq.tar

Развертывание службы в docker-контейнерах

Установка пакетов

Для запуска службы в привилегированном пакете достаточно установить пакет docker.io. Для запуска в непривилегированных контейнерах дополнительно требуется пакет rootless-helper-astra. Для управления трафиком с разными классификационными метками требуются пакеты iptables-astralabel-common iptables-astralabel-*. Команда для установки всех пакетов (пакет iptables-astralabel устанавливается для загруженного ядра):

sudo apt install -y docker.io rootless-helper-astra iptables-astralabel-common iptables-astralabel-`uname -r`

Отдельная служба в непривилегированном контейнере с нулевой классификационной меткой

Созданный и экспортированный ранее образ может быть импортирован в непривилегированное пользовательское окружения и запущен в этом окружении. Далее для примера все действия выполняются от имени текущего пользователя ($USER).

  1. Запустить пользовательскую службу docker:

    sudo systemctl start rootless-docker@$(systemd-escape $USER)

  2. Импортировать ранее выгруженный образ:

    rootlessenv docker load -i astra-rabbitmq.tar

  3. Проверить список образов:

    rootlessenv docker image ls

  4. Запустить контейнер из импортированного образа:

    rootlessenv docker run -d -p 5672:5672 -p 15672:15672 -p 25672:25672 --name astra-rabbitmq astra-rabbitmq:latest

Для проверки работы запущенного контейнера можно использовать указанные выше команды: Запуск и проверка docker-контейнера.

Сохранение изменений 


Настройка docker-контейнера как службы systemd

Комплект служб, работающих с разными классификационными метками

Тестирование структуры приложений RabbitMQ в  docker-контейнерах

Кластер RabbitMQ в docker-контейнерах

Кластер, работающий с нулевой классификационной меткой

Комплект служб, работающих с разными классификационными метками

  • Нет меток