Создайте образ Docker для ActiveMQ 5.x с сохранением PostgreSQL

В этом посте мы создадим собственный образ Docker для версии ActiveMQ 5.x вместе с базой данных PostgreSQL для сохранения сообщений.

Если вам нужна технология очередей для поддержки архитектуры микросервисов или для асинхронного выполнения задач, ActiveMQ поможет вам.

Я использовал ActiveMQ в различных проектах, и это мое решение в топе, когда мне нужна интеграция quick и easy. В конце концов, он делает то, что говорит, - очередь сообщений. О, это тоже реализация на основе Java, так что да, это больше для меня! :)

Чтобы узнать больше об ActiveMQ, вы всегда можете посетить его сайт.

Еще один отличный способ запустить ActiveMQ, помимо локальной установки, - это запустить его через Docker. Docker - это в представлении на 10 000 футов контейнерный движок, который позволяет вашим приложениям работать изолированно в среде по вашему выбору. Посетите сайт для получения дополнительной информации.

Еще одно большое улучшение - наличие уровня сохраняемости, так что все ваши сообщения могут быть сохранены на диске. Преимущество такой реализации заключается в том, что если по какой-либо причине ваш ActiveMQ остановится, ваши сообщения будут сохранены в базе данных, и как только ваш ActiveMQ будет запущен, они будут снова запланированы для использования. В этом примере мы будем использовать локально установленный сервер PostgreSQL.

Итак, хватит теории! Я полагаю, вы уже знакомы со всеми этими концепциями. Давайте создадим наш собственный образ Docker!

Ссылка на полный пример на github находится в конце сообщения.

Создайте образ Docker

Чтобы создать образ Docker, нам нужно создать Dockerfile соответствующим образом. Для каждого шага в файле я даю краткое объяснение, как показано ниже.

Все ресурсы, обязательные для запуска этого примера, можно найти по ссылке gitfub, которую я привожу в самом конце этого сообщения.

FROM openjdk:8-jre-alpine (1)

ENV ACTIVEMQ_VERSION 5.15.11 (1)
ENV ACTIVEMQ_WORKDIR /app (1)

RUN mkdir -p $ACTIVEMQ_WORKDIR (2)

COPY activemq/apache-activemq-5.15.11-bin.tar.gz . (3)

RUN tar -xzf apache-activemq-5.15.11-bin.tar.gz -C $ACTIVEMQ_WORKDIR (3)

RUN ln -s $ACTIVEMQ_WORKDIR/apache-activemq-$ACTIVEMQ_VERSION \$ACTIVEMQ_WORKDIR/activemq (4)

COPY conf/activemq.xml $ACTIVEMQ_WORKDIR/activemq/conf (5)

COPY conf/db.properties $ACTIVEMQ_WORKDIR/activemq/conf/db.properties (5)

COPY lib $ACTIVEMQ_WORKDIR/activemq/lib (6)

WORKDIR $ACTIVEMQ_WORKDIR/activemq (7)
EXPOSE 8161 (7)
EXPOSE 61616 (7)
CMD ["/bin/sh", "-c", "bin/activemq console"] (7)

(1) Настройка среды

Мы будем использовать alpine jre из openjdk 8 в нашей среде, чтобы успешно запустить ActiveMQ. Мы также устанавливаем пару переменных среды, содержащих значения, касающиеся рабочего каталога и используемой версии ActiveMQ.

(2) Создайте рабочий каталог

В рабочем каталоге происходит вся наша работа. Итак, нам нужно сначала создать его, и для этого мы будем использовать переменную шага (1).

(3) Скопируйте ActiveMQ

Затем мы копируем заархивированный файл ActiveMQ с нашего локального диска в образ Docker. В нашем примере мы используем версию 5.15.11, которую можно скачать здесь и сохранить в каталоге activemq.

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

>> mkdir -p activemq
>> wget http://archive.apache.org/dist/activemq/5.15.11/apache-activemq-5.15.11-bin.tar.gz -O activemq/apache-activemq-5.15.11-bin.tar.gz

Чтобы завершить этот шаг, нам нужно будет извлечь скопированный файл внутри образа Docker. Поскольку мы используем дистрибутив Linux, упакованный из образа, соответствующая команда, показанная в Dockerfile, может сделать эту работу за нас.

(4) Создайте мягкую ссылку

Теперь давайте для удобства создадим мягкую ссылку на извлеченный каталог ActiveMQ. Этот шаг может показаться необязательным, и это не так, но это удобное направление для следующих шагов.

(5) Скопируйте файлы конфигурации

А теперь перейдем к самой важной и важной части этого поста. Пришло время диктовать ActiveMQ, как он должен работать и как подключаться к базе данных.

Прежде всего, файл activemq.xml - это основной файл конфигурации, который находится в каталоге conf. Наше намерение состоит в том, чтобы заменить его одним из наших собственных, чтобы мы могли добиться желаемого поведения. Теперь мы можем создать каталог conf на нашем локальном диске и включить в него все файлы, которые должны заменить файлы по умолчанию. Итак, мы продолжаем и создаем наш собственный activemq.xml file в этом каталоге. Для нашего удобства мы можем скопировать версию по умолчанию из нашей загружаемой версии и применить изменения.

Создайте файл db.properties в локальном каталоге conf и добавьте следующие строки, определяющие, как нам следует подключаться к базе данных. При необходимости вы можете вносить изменения в соответствии с вашими потребностями. Имейте в виду, что наш экземпляр PostgreSQL работает на нашей локальной машине, поэтому нам нужно включить соответствующий host. Вы можете найти свой собственный, если, например, работаете под Linux, выполнив ip a из командной строки и определив настройки адаптера Docker. Вероятно, он должен начинаться с docker0.

amq.db.host=172.17.0.1
amq.db.dbname=activemq_db
amq.db.port=5432
amq.db.url=jdbc:postgresql://${amq.db.host}:${amq.db.port}/${amq.db.dbname}
amq.db.username=postgres
amq.db.password=postgres
amq.db.init_connections=5
amq.db.max_connections=10

Важно! Вам необходимо создать activemq_db базу данных самостоятельно. Если вы предпочитаете другое имя, измените его соответствующим образом и в приведенной выше конфигурации.

Затем в нашем локальном activemq.xml файле мы должны включить конфигурацию компонента источника данных, как показано ниже.

<bean id="postgres-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="${amq.db.url}"/>
    <property name="username" value="${amq.db.username}"/>
    <property name="password" value="${amq.db.password}"/>
    <property name="initialSize" value="${amq.db.init_connections}"/>
    <property name="maxTotal" value="${amq.db.max_connections}"/>
    <property name="testOnBorrow" value="true"/>
    <property name="validationQuery" value="select 1"/>
    <property name="poolPreparedStatements" value="true"/>
</bean>

Наконец, мы должны указать ActiveMQ использовать наш источник данных вместо его предопределенного в памяти.

<persistenceAdapter>
    <jdbcPersistenceAdapter dataSource="#postgres-ds" lockKeepAlivePeriod="5000" createTablesOnStartup="true">
...
    </jdbcPersistenceAdapter>
</persistenceAdapter>

Что здесь критично, так это то, что posgres-ds был назначен адаптеру постоянства. Атрибут createTablesOnStartup описывает, нужно ли нам создавать наши таблицы изначально или нет. Если вы запускаете свой контейнер Docker в первый раз, то для него должно быть установлено значение true. В противном случае вам следует переключить его на false, иначе вы будете продолжать получать ошибки в ваших журналах, касающиеся создания таблиц.

(6) Скопируйте файлы jar

Чтобы экземпляр ActiveMQ мог подключиться к базе данных, в образ должны быть включены дополнительные файлы jar. Дистрибутив ActiveMQ не поставляется со всеми необходимыми jar-файлами, поэтому мы можем создать каталог lib и поместить в него все эти файлы. Наконец, мы копируем эту локальную папку lib в соответствующий путь в нашем изображении.

(7) Запустите экземпляр ActiveMQ.

Наконец, пришло время указать изображению запустить экземпляр ActiveMQ. Сначала мы переключаем наш рабочий каталог на activemq, открываем порты для нашего контейнера, а затем выполняем соответствующий скрипт.

Что касается портов, порт 8161 является портом по умолчанию веб-интерфейса для мониторинга экземпляра, поэтому мы можем получить к нему доступ, посетив http://localhost:8161 в нашем браузере. Используйте учетные данные по умолчанию admin:admin для доступа к защищенным страницам. Кроме того, мы открываем 61616, который является tcp портом для других запущенных служб для создания и использования сообщений.

Запускаем контейнер

Мы приближаемся к концу этого поста, так что есть ли лучший способ протестировать наш пример, кроме как запустить его самостоятельно? :)

Как вы, возможно, уже знаете, нам нужно запустить Docker и создать наш образ. Как только мы запускаем наш образ докера, контейнер создается соответствующим образом. Поскольку контейнер является нашим работающим экземпляром образа Docker, мы можем остановить его, запустить, удалить или создать еще один.

Теперь давайте сначала создадим и пометим наш образ Docker.

>> docker build -t pk/activemq .

При первом запуске этой команды будут загружены зависимые изображения. На сборку в первый раз может потребоваться некоторое время, но это время ожидания больше не будет беспокоить вас в последующих сборках. Вы можете выполнить docker images из командной строки, чтобы проверить, находится ли ваш вновь созданный образ Docker на своем месте.

Затем мы запускаем образ Docker. Порт 8161 открыт, как мы видим ниже.

docker run --rm -d -p 8161:8161 pk/activemq

Вот и все, ребята! Теперь вы можете получить доступ к своему экземпляру ActiveMQ из браузера.

Надеюсь, этот пост был для вас полезен. Вы можете найти все файлы, доступные для запуска этого примера, на github.

Ваше здоровье!