Docker — производительность файловой системы

Докер, особенно на сложных системах контейнеров, на MacOs работает намного медленнее, чем на нативном Linux, это факт. Можно ознакомится с бенчмарками.

Мониторю состояние проблемы я по вот этой задаче на гитхабе.

Начиная с 17.04 CE Edge onwards появились новые флаги для выполнения docker run -v позволяющие управлять степенью синхронности примонтированного волума:

  • consistent: полная согласованность. Контейнер и хост синхронны постоянно. Это значение по умолчанию. И на macOs это медленно, из за медленной работы osfx
  • cached: файлы хоста для mount является авторитетным. Может быть задержка в переносе данных и обновлениях, сделанные на хосте, будут видны внутри контейнера через некоторое время. Используется для улучшения производительности чтения в контейнер с хост-машины. Детали реализации и настройки можно прочитать тут
  • delegated: файлы контейнера для mount является авторитетным. Может быть задержка в переносе данных и обновлениях, сделанных в контейнере, до того как они будут видны на хосте. На текущий момент в 17.04 delegated ведет себя идентично consistent.

Команда Docker для Mac планирует выпустить улучшенную реализацию делегированных в будущем, чтобы ускорить работу с большими объемами записи.

На текущий момент есть два решения, в случае если :cached не решает вопроса:

  • d4m-nfs
  • docker-sync и подобные решения, основанные на rsync/event based syncing (быстрая синхронизация, но нужно изменить настройки, и можно столкнуться с проблемами синхронизации)

Я пользовался вторым из решений, оно действительно быстрое(было до последнего обновления пару дней назад) — сейчас проблема в первом запуске при развертывании — первичное копирование с хост-машины внутрь контейнера проходит достаточно долго в приложении на symfony3 (связано с значительным объемом папки vendor)