Как пробросить контейнер с mysql к контейнеру с веб сервером?
Вот у вас же написано в описании сервиса web
  links:
    - db
####
Более правильно и наглядно было написать
  links:
    - db:db
)
####
это значит кто контейнер сервиса "db"  для сервиса "web" будет доступен по адресу db
localhost внутри контейнера укажет на сам этот контейнер, айпи хоста на сам хост. Конечно по айпи хоста можно добраться до базы, поскольку проброшен порт (что и делает ваш mysql workbench), но видимо докер добавляет это правило iptables только для внешних сетей.
посмотрите на каком айпи крутится контейнер за базой, docker inspect
в настройках php приложения укажите этот ip
например у меня с тремя контейнерами nginx+php-fpm+postgres  , база имеет айпи 172.17.0.3 , его и указываю.
контейнеры общаются с друг другом по внутренней сетке своей, а вы пытаетесь из контейнера подключится к другому с внешней стороны, надеюсь понятно объяснил.