Использую некоторое подобие автоматизации следующим образом:
1. На хосте запускаю скрипт, который собирает моё приложение в новый образ из Dockerfile оф. образа Rails:
https://github.com/docker-library/rails/blob/3c87a...
Этот скрипт донастраивает ОС; устанавливает гемы, нужные для старта приложения; копирует код приложения из каталога репозитория на хосте (можно дописать, чтобы вытягивал сразу из репозитория). Как только образ готов, можно останавливать старый контейнер, запускать новый и полностью удалять старый.
Уверен, что можно с помощью Continuous Integration сервера полностью автоматизировать задачу.
Dockerfile должен быть составлен так, чтобы в контейнере не происходило изменений, а все изменения писались либо на хост, либо в специальный контейнер для данных, чтобы ничего не потерялось.
2. Так как в качестве хоста для запуска Docker использую в основном виртуальные машины, то стараюсь не использовать data-контейнеры, а хранить всё на хосте через Volume директивы. Это связано в первую очередь с тем, что для каждого проекта я использую отдельную виртуальную машину. Да и так потеряться ничего не должно, и мониторить проще.
Если же нужно изолировать хранилища данных (например при расшаривании виртуальной машины между разными клиентами/проектами), то только через data-контейнеры. Тут история немного сложнее в настройке и, может быть запутаннее, но всё же так правильно с точки зрения безопасности.
Так как виртуальные машины на SSD, проблем с производительностью пока не отмечал. Да и проекты, в принципе, небольшие (до 10000 просмотров в сутки).