= Docker Logging and Monitoring = <> ---- == Utilities == The `docker(1)` utility offers some logging and monitoring functionality. To view the usage statistics for all containers, try: {{{ $ docker stats redis1 redis2 CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O redis1 0.07% 796 KB / 64 MB 1.21% 788 B / 648 B 3.568 MB / 512 KB redis2 0.07% 2.746 MB / 64 MB 4.29% 1.266 KB / 648 B 12.4 MB / 0 B }}} To print the log messages from a container in a manner similar to `tail --follow`, try: {{{ docker logs --tail --follow redis1 }}} ---- == Logging to Files == The default behavior is for `dockerd(8)` to write JSON-formatted messages to a distinct file for each container. Especially for long-running containers, this can lead to log files that are too large to store or reasonably use. See [[Docker/Configuration#Logging|here]] for configuration options that will mitigate this. ---- == Prometheus == === Networking === For '''Prometheus''' monitoring, `dockerd(8)` will need to bind to an address and port. If you aren't concerned with hardening your server, just use `0.0.0.0` and everything will work. If all monitoring will be done locally, you can check the output of `ip addr show docker0` to find the exact intranet address that `dockerd(8)` has bound to. When monitoring remote servers, the Prometheus client must connect to the same address that `dockerd(8)` is bound to. It is ''not possible'' to configure DNS for the client and bind to `127.0.0.1` on the server. The only workaround is for `dockerd(8)` to bind to `0.0.0.0`. === Docker Swarm === Docker must be running in [[Docker/Swarm|swarm mode]]. Configure `dockerd(8)` to advertise metrics. This is an experimental feature, so the `dockerd(8)` configuration file must be updated like: {{{ { "metrics-addr": "0.0.0.0:9323", "experimental": true } }}} === Prometheus Service === Prometheus needs to be configured to scrape `dockerd(8)` and publish it's database. {{{ global: scrape_interval: 15s # Default is 60s evaluation_interval: 15s # Default is 60s # scrape_timeout default is 10s external_labels: monitor: 'my-monitor' scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['127.0.0.1:9090'] - job_name: 'docker' static_configs: - targets: ['172.17.0.1:9323', 'example.com:9323'] }}} Start one instance of Prometheus to the swarm. {{{ docker service create --replicas=1 --name prometheus \ --mount type=bind,src=/path/to/prometheus.yml,dst=/etc/prometheus/prometheus.yml \ --publish 9090:9090/tcp \ prom/prometheus }}} Verify that Prometheus has successfully connected to `dockerd(8)` at `http://127.0.0.1:9090/targets`. ---- CategoryRicottone