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.