Containerized Deployment of Apache RocketMQ 4.9.2

Network Infrastructure Setup

To ensure the NameServer, Broker, and Console components can communicate, establish a dedicated Docker bridge network first.

docker network create rocketmq-net

NameServer Containerization

Dockerfile for NameServer

Create a file named Dockerfile.namesrv. This configuration uses OpenJDK 8 and sets up the environment variables. It includes a patch for the runserver.sh script to resolve Java 8 compatibility issues regarding GC log parameters.

FROM openjdk:8-jre-alpine

ENV RQ_VERSION="4.9.2"
ENV APP_HOME="/opt/rocketmq/namesrv"

WORKDIR $APP_HOME

# Install dependencies and download RocketMQ
RUN apk add --no-cache curl bash && \
    mkdir -p /var/rocketmq/logs /var/rocketmq/store && \
    curl -L https://archive.apache.org/dist/rocketmq/${RQ_VERSION}/rocketmq-all-${RQ_VERSION}-bin-release.zip -o source.zip && \
    unzip source.zip && \
    rm source.zip && \
    mv rocketmq-${RQ_VERSION}/* . && \
    rmdir rocketmq-${RQ_VERSION}

# Adjust JVM memory settings for resource-constrained environments
RUN cd bin && \
    sed -i 's/-Xms[^ ]*/-Xms512m/' runserver.sh && \
    sed -i 's/-Xmx[^ ]*/-Xmx512m/' runserver.sh && \
    sed -i 's/-Xmn[^ ]*/-Xmn128m/' runserver.sh && \
    # Comment out incompatible GC log options for Java 8
    sed -i '70s/^/#/' runserver.sh && \
    sed -i '75,79s/^/#/' runserver.sh

EXPOSE 9876

VOLUME ["/var/rocketmq/logs", "/var/rocketmq/store"]

CMD ["sh", "bin/mqnamesrv"]

Build and Run Scripts

Save the following build logic into build-namesrv.sh:

#!/bin/bash
docker build -f Dockerfile.namesrv -t my-rocketmq-namesrv:4.9.2 .

Save the execution logic into run-namesrv.sh:

#!/bin/bash
docker run -d \
  --name rocketmq-namesrv \
  --network rocketmq-net \
  --network-alias namesrv \
  -p 9876:9876 \
  -v /var/lib/rocketmq/logs:/var/rocketmq/logs \
  -v /var/lib/rocketmq/store:/var/rocketmq/store \
  my-rocketmq-namesrv:4.9.2

Broker Containerization

Dockerfile for Broker

Create Dockerfile.broker. Similar to the NameServer, this downloads the distribution and optimizes the runbroker.sh script.

FROM openjdk:8-jre-alpine

ENV RQ_VERSION="4.9.2"
ENV APP_HOME="/opt/rocketmq/broker"

WORKDIR $APP_HOME

RUN apk add --no-cache curl bash && \
    mkdir -p /var/rocketmq/logs /var/rocketmq/store && \
    curl -L https://archive.apache.org/dist/rocketmq/${RQ_VERSION}/rocketmq-all-${RQ_VERSION}-bin-release.zip -o source.zip && \
    unzip source.zip && \
    rm source.zip && \
    mv rocketmq-${RQ_VERSION}/* . && \
    rmdir rocketmq-${RQ_VERSION}

# Optimize heap size for containerized environments
RUN cd bin && \
    sed -i 's/-Xms[^ ]*/-Xms512m/' runbroker.sh && \
    sed -i 's/-Xmx[^ ]*/-Xmx512m/' runbroker.sh && \
    sed -i 's/-Xmn[^ ]*/-Xmn128m/' runbroker.sh

EXPOSE 10909 10911 10912

VOLUME ["/var/rocketmq/logs", "/var/rocketmq/store"]

CMD ["sh", "bin/mqbroker"]

Configuration and Deployment

Prepare the host directories and a minimal configuration file:

mkdir -p /var/lib/rocketmq/broker
cat <<EOF > /var/lib/rocketmq/broker/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr = namesrv:9876
autoCreateTopicEnable = true
EOF

Build script (build-broker.sh):

#!/bin/bash
docker build -f Dockerfile.broker -t my-rocketmq-broker:4.9.2 .

Run script (run-broker.sh):

#!/bin/bash
docker run -d \
  --name rocketmq-broker \
  --network rocketmq-net \
  --network-alias broker \
  -p 10909:10909 \
  -p 10911:10911 \
  -p 10912:10912 \
  -v /var/lib/rocketmq/broker/broker.conf:/opt/rocketmq/broker/conf/broker.conf \
  -v /var/lib/rocketmq/logs:/var/rocketmq/logs \
  -v /var/lib/rocketmq/store:/var/rocketmq/store \
  my-rocketmq-broker:4.9.2 \
  sh bin/mqbroker -c /opt/rocketmq/broker/conf/broker.conf

RocketMQ Dashboard Deployment

Console Dockerfile

Download the pre-compiled JAR for the console (e.g., rocketmq-console-ng-2.0.0.jar) and create Dockerfile.console:

FROM openjdk:8-jre-alpine

WORKDIR /app

COPY rocketmq-console-ng-2.0.0.jar ./app.jar

ENV JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"
ENV SERVER_PORT="8080"

EXPOSE 8080

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Dserver.port=$SERVER_PORT -Drocketmq.config.namesrvAddr=$NAMESRV_ADDR -jar app.jar"]

Running the Console

Build the image:

docker build -f Dockerfile.console -t my-rocketmq-console:2.0.0 .

Start the container ensuring it connects to the NameServer:

#!/bin/bash
docker run -d \
  --name rocketmq-console \
  --network rocketmq-net \
  -p 8080:8080 \
  -e "NAMESRV_ADDR=namesrv:9876" \
  my-rocketmq-console:2.0.0

Access the dashboard via http://<host-ip>:8080. Default credential are typically admin/admin unless modified in the source properteis before building.

Tags: rocketmq docker Apache RocketMQ Message Queue java

Posted on Sun, 07 Jun 2026 15:59:34 +0000 by jswash