Docker, kullanıp atılabilen ve tekrarlanabilir bir MQTT broker’ı edinmenin en hızlı yoludur. Resmi eclipse-mosquitto imajı küçüktür ve iyi bakımlıdır; ancak varsayılan ayarları neredeyse herkesi ilk seferde şaşırtır: bir config dosyası olmadan container’ın dışından bağlanamazsınız. Bu rehber, Mosquitto’yu Docker’da doğru şekilde kurar — kalıcı volume’lar, TCP ve WebSocket portları ve parola tabanlı kimlik doğrulama ile.
1. Klasör yapısını oluşturun
İmaj, /mosquitto altında üç dizin bekler. Bunları host üzerinde aynen oluşturun:
mkdir -p mosquitto/config mosquitto/data mosquitto/log
touch mosquitto/config/mosquitto.conf| Host klasörü | Container yolu | Amaç |
|---|---|---|
./mosquitto/config | /mosquitto/config | mosquitto.conf, parola dosyası, ACL dosyası, sertifikalar |
./mosquitto/data | /mosquitto/data | Kalıcılık veritabanı (retained mesajlar, oturumlar) |
./mosquitto/log | /mosquitto/log | Dosyaya log yazıyorsanız log dosyaları |
2. Minimal bir mosquitto.conf yazın
Mosquitto 2.x, hiçbir listener yapılandırılmadığında yalnızca localhost’u dinler — bir container içinde bu, kimsenin ona erişemeyeceği anlamına gelir. Bu config, MQTT’yi 1883’te ve WebSocket’leri 9001’de açar:
# 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 trueTLS, ACL veya bridge ayarları mı istiyorsunuz? mosquitto.conf oluşturucu bir formdan geçerli bir dosya üretir; kurulum rehberi ise local-only modunu daha ayrıntılı açıklar.
3. docker run ile başlatın
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:2Ana sürüm etiketini sabitlemek (eclipse-mosquitto:2) sürpriz yükseltmeleri önler. Log’ları docker logs -f mosquitto ile kontrol edin; Opening ipv4 listen socket on port 1883 satırını ve 9001 için bir websockets satırını görmelisiniz.
4. Ya da Docker Compose kullanın
Hızlı bir testin ötesindeki her şey için bir Compose dosyasını versiyon kontrolünde tutmak daha kolaydır:
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/logdocker compose up -d
docker compose logs -f mosquittoAynı Compose projesindeki diğer servisler (Node-RED, Home Assistant, uygulamanız) broker’a servis adıyla erişir: mqtt://mosquitto:1883. Host’a yalnızca Docker dışındaki bir şeyin gerçekten ihtiyaç duyduğu portları açın.
5. docker exec ile bir parola dosyası ekleyin
Anonim erişim bir dakikalık test için uygundur, daha uzun hiçbir şey için asla. İmajla birlikte gelen mosquitto_passwd ile bir kullanıcı oluşturun:
# -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 bobArdından config’i anonim erişimden parola doğrulamasına geçirin:
allow_anonymous false
password_file /mosquitto/config/passwddocker restart mosquittoACL’ler ve TLS de aynı şekilde çalışır — dosyalar config volume’una konur. Bkz. Mosquitto’yu parolalar, ACL’ler ve TLS ile güvenli hâle getirme.
6. Container’ı test edin
Host üzerinden (Mosquitto client’ları kuruluysa):
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'Host’ta client yok mu? Container içindekileri kullanın:
docker exec -it mosquitto mosquitto_sub -h localhost -u alice -P 'secret' -t 'demo/#' -v9001’deki WebSocket listener’ı, tarayıcı client’larının kullandığı listener’dır (ws://<host>:9001). HTTPS üzerinden yüklenen bir sayfanın yalnızca wss:// bağlantıları açabileceğini unutmayın; bu nedenle yerel bir broker’ı barındırılan bir web client’ından test etmek genellikle 9001 portunun önünde TLS gerektirir — ayrıntılar WebSocket üzerinden MQTT yazısında. Çalışan bir gidiş-dönüşün tarayıcıda nasıl göründüğünü görmek için önce herkese açık bir broker deneyin:
Online MQTT istemcisinde deneyin
Container sorunlarını giderme
| Belirti | Neden | Çözüm |
|---|---|---|
| Log’da "Starting in local only mode" yazıyor | Config bağlanmamış ya da hiçbir listener tanımlamıyor | Volume yolunu ve mosquitto.conf dosyasının listener 1883 içerdiğini kontrol edin |
| Host’tan bağlantı reddediliyor | Port publish edilmemiş | -p 1883:1883 (veya ports: girdisini) ekleyin ve container’ı yeniden oluşturun |
| "not authorised" / CONNACK 5 | Anonim erişim kapalı, kullanıcı adı veya parola yanlış | Kullanıcıyı mosquitto_passwd ile yeniden oluşturun, ardından docker restart mosquitto çalıştırın |
| "Unable to open log file" veya kalıcılık hataları | Broker kullanıcısı bağlanan klasöre yazamıyor | UID 1883’e ./mosquitto/data ve ./mosquitto/log için yazma izni verin |
| Container döngü hâlinde yeniden başlıyor | Config’te geçersiz bir yönerge var | docker logs mosquitto çıktısının son satırlarını okuyun; hatalı satır orada belirtilir |
Bunların dışındaki CONNACK kodları için MQTT reason code’ları başvurusu ve bağlantı hataları rehberi broker’ın size ne söylediğini açıklar.
İmajı güncelleme
Config, veri ve log’lar host üzerinde durduğu için yükseltme yalnızca daha yeni bir imajı çekip container’ı yeniden oluşturmaktan ibarettir. data volume’u korunduğu sürece retained mesajlar ve kalıcı oturumlar korunur:
docker compose pull mosquitto
docker compose up -d mosquitto
docker compose logs --tail 20 mosquittoDüz docker run ile imajı çekin, ardından docker rm -f mosquitto çalıştırıp aynı docker run komutunu yeniden çalıştırın. Bu komutu küçük bir shell script’inde tutmak (veya Compose’a geçmek) sizi volume flag’lerini yeniden yazmaktan kurtarır.
Production ipuçları
- Kesin bir imaj etiketi sabitleyin ve bilinçli olarak yükseltin; büyük yükseltmelerden önce Mosquitto changelog’unu okuyun.
data’yı bir volume üzerinde tutun; aksi hâlde container yeniden oluşturulduğunda retained mesajlar ve kalıcı oturumlar kaybolur.- İnternete herhangi bir şey açmadan önce 8883’e (ve WebSocket listener’ına) TLS koyun — kurallar için MQTT portları yazısına bakın.
- Hata ayıklamak için
docker execüzerindenmosquitto -vçalıştırmak yerinedocker logs mosquittoçıktısını okuyun — o komut container içinde ikinci bir broker başlatır ve "address already in use" hatasıyla başarısız olur.
Sıkça sorulan sorular
Host’umdan Mosquitto Docker container’ına neden bağlanamıyorum?
Bir listener tanımlayan bağlanmış bir mosquitto.conf olmadan Mosquitto 2.x local only modunda çalışır ve yalnızca container içinden gelen bağlantıları kabul eder. listener 1883 ve bir kimlik doğrulama ayarı içeren bir config bağlayın ve portu -p 1883:1883 ile publish edin.
Docker’da çalışan Mosquitto’ya nasıl kullanıcı eklerim?
mosquitto_passwd komutunu docker exec ile container içinde çalıştırıp bağlanan config klasöründeki bir parola dosyasına yazın, ardından broker’ın dosyayı yeniden yüklemesi için container’ı yeniden başlatın.
eclipse-mosquitto imajı hangi portları kullanır?
Hangi listener’ları yapılandırırsanız onları. Geleneksel olarak 1883 TCP üzerinden düz MQTT, 8883 TLS üzerinden MQTT ve 9001 WebSocket üzerinden MQTT içindir. Her biri mosquitto.conf içinde tanımlanmalı ve Docker ile publish edilmelidir.