Cover image for How to Set Up Mosquitto MQTT Broker on Raspberry Pi with Docker

How to Set Up Mosquitto MQTT Broker on Raspberry Pi with Docker

How to Set Up Mosquitto MQTT Broker on Raspberry Pi with Docker

MQTT is a lightweight messaging protocol designed for IoT devices. Eclipse Mosquitto is the most widely used open-source MQTT broker, and running it on a Raspberry Pi gives you a dedicated, always-on message hub for your sensors and smart devices.


Prerequisites

  • A Raspberry Pi 3 or newer running Raspberry Pi OS
  • Docker and Docker Compose installed (see our Docker setup guide)
  • SSH access or a terminal on the Pi

Update your system first:

Bash
sudo apt update && sudo apt upgrade -y

Step 1: Create the Project Directory

Bash
mkdir -p ~/mosquitto/config
mkdir -p ~/mosquitto/data
mkdir -p ~/mosquitto/log
cd ~/mosquitto

Step 2: Create the Mosquitto Configuration File

Create the configuration file at ~/mosquitto/config/mosquitto.conf:

Code
persistence true
persistence_location /mosquitto/data/

log_dest file /mosquitto/log/mosquitto.log
log_dest stdout

listener 1883
listener 9001
protocol websockets

allow_anonymous false
password_file /mosquitto/config/password_file

This configuration:

  • Enables persistent message storage
  • Opens port 1883 for standard MQTT connections
  • Opens port 9001 for WebSocket connections
  • Disables anonymous access and requires a password file

Step 3: Create the Docker Compose File

Create docker-compose.yml in the ~/mosquitto directory:

YAML
services:
  mosquitto:
    image: eclipse-mosquitto
    container_name: mosquitto
    restart: unless-stopped
    ports:
      - "1883:1883"
      - "9001:9001"
    volumes:
      - ./config:/mosquitto/config
      - ./data:/mosquitto/data
      - ./log:/mosquitto/log

Step 4: Create a Password File

Before starting the broker, you need to create at least one user. First, start the container temporarily to access the mosquitto_passwd tool:

Bash
cd ~/mosquitto
docker compose run --rm mosquitto mosquitto_passwd -c /mosquitto/config/password_file myuser

You will be prompted to enter and confirm a password. This creates the password_file with the user myuser.

To add additional users later (without overwriting the file), omit the -c flag:

Bash
docker compose exec mosquitto mosquitto_passwd /mosquitto/config/password_file anotheruser

Step 5: Start the Broker

Bash
cd ~/mosquitto
docker compose up -d

Verify it is running:

Bash
docker ps

Check the logs to confirm the broker started without errors:

Bash
docker logs mosquitto

You should see output indicating that listeners are active on ports 1883 and 9001.


Step 6: Test with Pub/Sub Commands

Install the Mosquitto client tools on your Pi (or any machine on the network):

Bash
sudo apt install -y mosquitto-clients

Open two terminal windows. In the first, subscribe to a topic:

Bash
mosquitto_sub -h localhost -p 1883 -t "test/topic" -u myuser -P yourpassword

In the second, publish a message:

Bash
mosquitto_pub -h localhost -p 1883 -t "test/topic" -m "Hello from Pi!" -u myuser -P yourpassword

You should see Hello from Pi! appear in the subscriber terminal.


Using MQTT with Other Services

Mosquitto pairs well with many self-hosted services:

  • Home Assistant -- add the MQTT integration and point it to <your-pi-ip>:1883
  • Node-RED -- use the MQTT input/output nodes for automation flows
  • Custom sensors -- ESP32 and ESP8266 boards can publish sensor data directly to your broker

Troubleshooting

  • Connection refused on port 1883: Make sure the container is running with docker ps. Check docker logs mosquitto for startup errors.
  • Authentication errors: Verify the username and password match what you set with mosquitto_passwd. The password file path in mosquitto.conf must match the mounted volume path.
  • WebSocket not connecting: Confirm port 9001 is mapped in your compose file and that the protocol websockets line is under the listener 9001 directive.
  • Permission denied on log/data directories: Run sudo chown -R 1883:1883 ~/mosquitto/data ~/mosquitto/log to match the Mosquitto container user.
  • Firewall issues: If connecting from another machine, ensure the ports are open: sudo ufw allow 1883 && sudo ufw allow 9001.

Conclusion

A Mosquitto MQTT broker on your Raspberry Pi gives you a reliable, self-hosted messaging backbone for all your IoT projects. With password authentication enabled and Docker keeping the deployment clean, you have a solid foundation to build on. Add sensors, connect Home Assistant, or wire up Node-RED flows -- your MQTT broker is ready to handle it all.