Tutoriais

Rodar o Mosquitto no Docker (docker run e docker-compose)

Rode a imagem eclipse-mosquitto com docker run ou Docker Compose: volumes de config, dados e logs, portas 1883 e 9001 e um arquivo de senhas via docker exec.

Atualizado · 7 min de leitura

O Docker é a forma mais rápida de ter um broker MQTT descartável e reproduzível. A imagem oficial eclipse-mosquitto é pequena e bem mantida, mas seus padrões surpreendem quase todo mundo na primeira vez: sem um arquivo de configuração, você não consegue se conectar de fora do container. Este guia configura o Mosquitto no Docker do jeito certo — com volumes persistentes, portas TCP e WebSocket e autenticação por senha.

1. Crie a estrutura de pastas

A imagem espera três diretórios em /mosquitto. Replique-os no host:

bash
mkdir -p mosquitto/config mosquitto/data mosquitto/log
touch mosquitto/config/mosquitto.conf
Pasta no hostCaminho no containerFinalidade
./mosquitto/config/mosquitto/configmosquitto.conf, arquivo de senhas, arquivo de ACL, certificados
./mosquitto/data/mosquitto/dataBanco de persistência (mensagens retidas, sessões)
./mosquitto/log/mosquitto/logArquivos de log, se você registrar em arquivo

2. Escreva um mosquitto.conf mínimo

O Mosquitto 2.x só escuta no localhost quando nenhum listener está configurado — dentro de um container, isso significa que ninguém consegue alcançá-lo. Esta configuração abre MQTT na 1883 e WebSockets na 9001:

mosquitto/config/mosquitto.conf
# MQTT over TCP
listener 1883
# MQTT over WebSockets
listener 9001
protocol websockets

persistence true
persistence_location /mosquitto/data/

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

# For a first test only — switched to a password file in step 5
allow_anonymous true

Quer TLS, ACLs ou configurações de bridge? O gerador de mosquitto.conf monta um arquivo válido a partir de um formulário, e o guia de instalação explica o modo somente local em mais detalhes.

3. Inicie com docker run

docker run
docker run -d --name mosquitto \
  --restart unless-stopped \
  -p 1883:1883 -p 9001:9001 \
  -v "$PWD/mosquitto/config:/mosquitto/config" \
  -v "$PWD/mosquitto/data:/mosquitto/data" \
  -v "$PWD/mosquitto/log:/mosquitto/log" \
  eclipse-mosquitto:2

Fixar a tag da versão principal (eclipse-mosquitto:2) evita upgrades inesperados. Confira os logs com docker logs -f mosquitto; você deve ver Opening ipv4 listen socket on port 1883 e uma linha de websockets para a 9001.

4. Ou use o Docker Compose

Para qualquer coisa além de um teste rápido, um arquivo Compose é mais fácil de manter no controle de versão:

compose.yaml
services:
  mosquitto:
    image: eclipse-mosquitto:2
    container_name: mosquitto
    restart: unless-stopped
    ports:
      - "1883:1883"   # MQTT
      - "9001:9001"   # MQTT over WebSockets
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log
bash
docker compose up -d
docker compose logs -f mosquitto

Outros serviços no mesmo projeto Compose (Node-RED, Home Assistant, sua aplicação) alcançam o broker pelo nome do serviço: mqtt://mosquitto:1883. Publique no host apenas as portas de que algo fora do Docker realmente precisa.

5. Adicione um arquivo de senhas via docker exec

Acesso anônimo serve para um minuto de teste, nunca para mais do que isso. Crie um usuário com o mosquitto_passwd, que já vem dentro da imagem:

Criar o arquivo de senhas e o primeiro usuário
# -c creates the file (overwrites it if it exists!) — use only for the first user
docker exec -it mosquitto mosquitto_passwd -c /mosquitto/config/passwd alice

# add more users without -c
docker exec -it mosquitto mosquitto_passwd /mosquitto/config/passwd bob

Depois, mude a configuração de acesso anônimo para autenticação por senha:

mosquitto/config/mosquitto.conf (alterações)
allow_anonymous false
password_file /mosquitto/config/passwd
bash
docker restart mosquitto

ACLs e TLS funcionam do mesmo jeito — os arquivos vão no volume de configuração. Veja como proteger o Mosquitto com senhas, ACLs e TLS.

6. Teste o container

A partir do host (com os clientes do Mosquitto instalados):

bash
mosquitto_sub -h localhost -p 1883 -u alice -P 'secret' -t 'demo/#' -v &
mosquitto_pub -h localhost -p 1883 -u alice -P 'secret' -t 'demo/hello' -m 'hi from docker'

Não tem os clientes no host? Use os que estão dentro do container:

bash
docker exec -it mosquitto mosquitto_sub -h localhost -u alice -P 'secret' -t 'demo/#' -v

O listener WebSocket na 9001 é o que os clientes no navegador usam (ws://<host>:9001). Lembre que uma página carregada via HTTPS só pode abrir conexões wss://, então testar um broker local a partir de um cliente web hospedado geralmente exige TLS na frente da porta 9001 — mais em MQTT sobre WebSockets. Para ver como é uma ida e volta funcionando no navegador, experimente antes um broker público:

Teste no cliente MQTT online

Solução de problemas no container

SintomaCausaSolução
O log diz "Starting in local only mode"A configuração não foi montada ou não define nenhum listenerVerifique o caminho do volume e se o mosquitto.conf contém listener 1883
Connection refused a partir do hostPorta não publicadaAdicione -p 1883:1883 (ou a entrada ports:) e recrie o container
"not authorised" / CONNACK 5Acesso anônimo desabilitado, usuário ou senha erradosRecrie o usuário com mosquitto_passwd e depois rode docker restart mosquitto
"Unable to open log file" ou erros de persistênciaO usuário do broker não consegue escrever na pasta montadaDê ao UID 1883 permissão de escrita em ./mosquitto/data e ./mosquitto/log
O container reinicia em loopDiretiva inválida na configuraçãoLeia as últimas linhas de docker logs mosquitto; a linha com problema aparece ali

Para códigos de CONNACK além desses, a referência de reason codes MQTT e o guia de erros de conexão explicam o que o broker está dizendo.

Atualizando a imagem

Como configuração, dados e logs ficam no host, atualizar é só baixar uma imagem mais nova e recriar o container. Mensagens retidas e sessões persistentes sobrevivem enquanto o volume data for mantido:

Compose
docker compose pull mosquitto
docker compose up -d mosquitto
docker compose logs --tail 20 mosquitto

Com docker run puro, baixe a imagem, rode docker rm -f mosquitto e execute o mesmo comando docker run de novo. Guardar esse comando em um pequeno script shell (ou migrar para o Compose) evita redigitar as flags de volume.

Dicas para produção

  • Fixe uma tag exata da imagem e atualize de forma deliberada; leia o changelog do Mosquitto antes de upgrades de versão principal.
  • Mantenha data em um volume; caso contrário, mensagens retidas e sessões persistentes somem quando o container é recriado.
  • Coloque TLS na 8883 (e no listener WebSocket) antes de expor qualquer coisa na internet — veja portas MQTT para as convenções.
  • Para depurar, leia docker logs mosquitto em vez de rodar mosquitto -v via docker exec — isso inicia um segundo broker dentro do container e falha com "address already in use".

Perguntas frequentes

Por que não consigo me conectar ao container Docker do Mosquitto a partir do host?

Sem um mosquitto.conf montado que defina um listener, o Mosquitto 2.x roda em modo somente local e só aceita conexões de dentro do container. Monte uma configuração com listener 1883 e uma opção de autenticação, e publique a porta com -p 1883:1883.

Como adiciono um usuário ao Mosquitto rodando no Docker?

Rode o mosquitto_passwd dentro do container com docker exec, gravando em um arquivo de senhas na pasta de configuração montada, e depois reinicie o container para que o broker recarregue o arquivo.

Quais portas a imagem eclipse-mosquitto usa?

As dos listeners que você configurar. Por convenção, 1883 é MQTT simples sobre TCP, 8883 é MQTT sobre TLS e 9001 é MQTT sobre WebSockets. Cada uma precisa ser definida no mosquitto.conf e publicada com o Docker.