# [Part II] IoT with docker-compose

Perfect is the enemy of good. That’s the case with the IoT backend system that we described part I. In our previous post, we went step by step through the procedure of setting up:

• MQTT server to listen in incoming topics, e.g. sensors,
• Influx database to store time series of sensor data,
• Telegraf to connect them, as a server agent

Great. Now, there is an alternative way to do that again with docker. Compose is a tool for defining and running multi-container docker applications. We just need to write a YAML file to configure your application’s services. Let’s how this looks like for our application:

version: "3.5"
services:
mosquitto:
image: eclipse-mosquitto:latest
hostname: mosquitto
container_name: mosquitto
restart: always
ports:
- "1883:1883"
influxdb:
image: influxdb:latest
hostname: influxdb
container_name: influxdb
restart: always
depends_on:
- mosquitto
ports:
- "8086:8086"
volumes:
- influxdb-storage:/var/lib/influxdb
environment:
- INFLUXDB_DB=sensors
telegraf:
image: telegraf:latest
hostname: telegraf
container_name: telegraf
restart: always
depends_on:
- influxdb
ports:
- "5050:5050"
volumes:
- ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
volumes:
influxdb-storage: {}

and this our iot.yml file. Following, we realise that the steps are the same as the commands, we were passing in the terminal. No surprise. Then in the local telegraf folder, we include the configuration file for the telegraf:

[[inputs.mqtt_consumer]]
servers = ["tcp://mosquitto:1883"]
topics = ["sensors"]
data_format = "influx"

[[outputs.influxdb]]
urls = ["http://influxdb:8086"]
database = "sensors"
skip_database_creation = true
user_agent = "telegraf"
docker-compose -f iot.yml up