As is, this project creates a custom docker container for RabbitMQ with a preconfigured vhost (example-vhost), exchange (example-exchange), and queue (example-queue) with appropriate bindings therein.
You can use this project to create your own pre-configured RabbitMQ image and container that you setup either by
- directly modifying the included custom_definitions.json configuration file with a text editor, or by
- (recommended) using the RabbitMQ management interface to create the vhosts, exchanges, queues, and bindings that you want, and then exporting the resulting configuration to overright the included custom_definitions.json file.
The following instructions explain how to run the RabbitMQ server container, modify the included custom configuration using your web browser in the RabbitMQ management interface, and then export the resulting configuration to include your changes in a new custom RabbitMQ server image and container.
We have two docker containers in this example:
- repo/rabbitmq-example-server = This is the server we want, pre-configured with vhost, exchange, and queue.
- repo/rabbitmq-example-client = This is another instance of rabbitmq "linked" to the above server container so that we can run the rabbit command line interfaces (cli's) against the server.
Start in the root directory of this project, then
Build and run the RabbitMQ server container:
./build_server.sh
./run_server.sh
You should see a running container in Docker that looks something like the following:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b885d5e8391 repo/rabbitmq-example-server:latest "/docker-entrypoint.s" 31 minutes ago Up 31 minutes 4369/tcp, 5671-5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbitmq-example-server
Use the management interface with your web browser to setup RabbitMQ for your environment.
If the server container is running, you should be able to reach the RabbitMQ management interface in your web browser on localhost as follows: http://localhost:15672/.
- Username:
admin
- Password:
nimda
Note, however, that if you are using docker-machine instead of running docker natively, you will need to know the ip address of the running machine vm (instead of localhost). Most people run a docker-machine named 'default', and can therefore get the IP as follows:
docker-machine ip default
On my computer, this resolved to 192.168.99.100, which means I would access the RabbitMQ management interface with the following address: http://192.168.99.100:15672/
Once you are happy with the configuration in RabbitMQ, you can use the Export defnitions
feature in the management console to download the json configuration and save that file to overwrite server/custom_defitions.json
locally.
Alternatively, since this is a tutorial, you can use the included client Docker container to export the new configuration.
Build and run the RabbitMQ client container:
./build_client.sh
./run_client.sh
This should bring you to a bash command prompt for the client container.
In the bash prompt for the client container from the prior step, export the current configuration of the rabbitmq-example-server:
rabbitmqadmin --host rabbitmq-example-server --username admin --password nimda export custom_definitions.json
View the contents of the resulting file:
cat custom_definitions.json
The results are not formatted nicely (all on one line), and they look something like this:
{"rabbit_version":"3.8.3","rabbitmq_version":"3.8.3","users":[{"name":"admin","password_hash":"ZZiLrBJwnZi5WvlJdwoOHFEVfHWE4KIqSvtBc5whwcXQCaiL","hashing_algorithm":"rabbit_password_hashing_sha256","tags":"administrator"}],"vhosts":[{"name":"/"},{"name":"example-vhost"}],"permissions":[{"user":"admin","vhost":"/","configure":".*","write":".*","read":".*"},{"user":"admin","vhost":"example-vhost","configure":".*","write":".*","read":".*"}],"topic_permissions":[{"user":"admin","vhost":"example-vhost","exchange":"","write":".*","read":".*"}],"parameters":[],"global_parameters":[{"name":"cluster_name","value":"rabbit@rabbitmq-example-server"},{"name":"internal_cluster_id","value":"rabbitmq-cluster-id-uiQY72El-t7KshK33EgSmA"}],"policies":[],"queues":[{"name":"example-queue","vhost":"example-vhost","durable":true,"auto_delete":false,"arguments":{"x-max-length":5,"x-queue-type":"classic"}}],"exchanges":[{"name":"example-exchange","vhost":"example-vhost","type":"fanout","durable":true,"auto_delete":false,"internal":false,"arguments":{}}],"bindings":[{"source":"example-exchange","vhost":"example-vhost","destination":"example-queue","destination_type":"queue","routing_key":"","arguments":{}}]}
You can use the above output to overright the included file in server/custom_definitions.json.
You might also want to use a nice json editor like Visual Studio Code to format the output before pasting into server/custom_definitions.json
Exit the client container:
exit
Back in the root of this project, cleanup the old containers:
./cleanup.sh
You can rebuild and re-run the server container (see step #1 above) and then connect to it in with your web browser (see step #2 above) to verify that your custom configurations have worked.
Make any edits you like to run_server.sh
and server/Dockerfile
to reflect your organization. You might also want to publish your resulting server image on DockerHub and/or in a private Docker repository.
./build_server.sh
./run_server.sh [debug]
The management console should be running on port 15672. The base URL differs depending on your environment:
-
If you are running docker natively, you can access the management console from here: http://localhost:15672/
-
If you are running in docker-machine, and you are using "default" as the machine name, you can use the following command to show the URL for the management console:
echo "http://$(docker-machine ip default):15672/"
./build_client.sh
./run_client.sh
Export the current configuration of the rabbitmq-example-server:
rabbitmqadmin --host rabbitmq-example-server --username admin --password nimda export custom_definitions.json
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request.
- January 3, 2016 -- initial version.
- March 9, 2019 -- cleanup README, add shebang, other consmetic stuff.
- May 4, 2020 -- updated to v3.8.3 of RabbitMQ
I couldn't make a custom rabbitmq image work with preconfigured vhost/exchange/queue just by following the steps on the blog post here: Creating a custom RabbitMQ container with preconfigured queues. That post had two problems:
- In rabbitmq.config, they put quotes around the labels (e.g., "load_definitions", vs load_definitions,) and that didn't work,
- I was trying to run the custom container with "docker run" parameters such as "-e RABBITMQ_DEFAULT_USER=admin", but specifying that parameter generates a new rabbitmq.config that overwrites the one I was trying to put in place. I suspect this is a feature/bug of the underlying rabbitmq image implementation.
I figured out the above through trial-and-error and many Google searches. I hope this example helps save you time improving on my attempts.
Gratis and libre.