Found an interesting custom component sensor called docker_monitor.py here.
But since I use Hass.io it couldn't open docker's UNIX socket, this post describes how to enable and use the TCP based API instead.

Copy docker_monitor.py to your custom_components/sensor directory, create a sensor in your home assistant config like so, and define the containers you want to monitor.

  - platform: docker_monitor
    host: tcp://192.168.179.10:2375
    containers:
      - homeassistant
      - hassio_supervisor
      - portainer
      - watchtower
    monitored_conditions:
      - utilization_version
      - container_status
      - container_memory_usage
      - container_memory_percentage_usage
      - container_cpu_percentage_usage

To enable docker's TCP API do this:

$ sudo vi /lib/systemd/system/docker.service

Change ExecStart line to:

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0

Reload systemd and restart docker service

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

Check if it's listening on port 2375

$ ss -ntl|grep 2375
LISTEN     0      128         :::2375                    :::*

Restart your Home Assistant

I have these groups defined:

Docker Monitor:
  - sensor.docker_version
  - sensor.docker_hassio_supervisor_status
  - sensor.docker_hassio_supervisor_cpu_use
  - sensor.docker_hassio_supervisor_memory_use
  - sensor.docker_hassio_supervisor_memory_use_percent
  - sensor.docker_homeassistant_status
  - sensor.docker_homeassistant_cpu_use
  - sensor.docker_homeassistant_memory_use
  - sensor.docker_homeassistant_memory_use_percent
  - sensor.docker_portainer_status
  - sensor.docker_portainer_cpu_use
  - sensor.docker_portainer_memory_use
  - sensor.docker_portainer_memory_use_percent
  - sensor.docker_watchtower_status
  - sensor.docker_watchtower_cpu_use
  - sensor.docker_watchtower_memory_use
  - sensor.docker_watchtower_memory_use_percent

Customization:

  sensor.docker_version:
    friendly_name: 'Docker Version'
  sensor.docker_hassio_supervisor_status:
    friendly_name: 'Hass.io Status'
  sensor.docker_hassio_supervisor_cpu_use:
    friendly_name: 'Hass.io CPU Usage'
  sensor.docker_hassio_supervisor_memory_use:
    friendly_name: 'Hass.io Memory Usage'
  sensor.docker_hassio_supervisor_memory_use_percent:
    friendly_name: 'Hass.io Memory %'
  sensor.docker_homeassistant_status:
    friendly_name: 'Home Assistant Status'
  sensor.docker_homeassistant_cpu_use:
    friendly_name: 'Home Assistant CPU Usage'
  sensor.docker_homeassistant_memory_use:
    friendly_name: 'Home Assistant Memory Usage'
  sensor.docker_homeassistant_memory_use_percent:
    friendly_name: 'Home Assistant Memory %'
  sensor.docker_portainer_status:
    friendly_name: 'Portainer Status'
  sensor.docker_portainer_cpu_use:
    friendly_name: 'Portainer CPU Usage'
  sensor.docker_portainer_memory_use:
    friendly_name: 'Portainer Memory Usage'
  sensor.docker_portainer_memory_use_percent:
    friendly_name: 'Portainer Memory %'
  sensor.docker_watchtower_status:
    friendly_name: 'Watchtower Status'
  sensor.docker_watchtower_cpu_use:
    friendly_name: 'Watchtower CPU Usage'
  sensor.docker_watchtower_memory_use:
    friendly_name: 'Watchtower Memory Usage'
  sensor.docker_watchtower_memory_use_percent:
    friendly_name: 'Watchtower Memory %'

Resources:
https://gathering.tweakers.net/forum/list_message/57718722#57718722
https://docker-py.readthedocs.io/en/stable/client.html