4 авг. 2021 г.
Всем привет! Сегодня хотел бы поделиться опытом оптимизации производительности Docker под macOS c помощью Mutagen.
Docker под macOS изначально имеет проблемы с производительностью. Они связаны со способом монтирования разделов и файловой системой osxfs. Это оказывает серьезное влияние на работу приложений с большим количеством I/O операций. В результате web-приложение на Symfony может обрабатывать запрос по несколько секунд.
Есть несколько способов использовать Docker под macOS.
В этой статье рассмотрим настройку Mutagen. Mutagen обеспечивает синхронизацию файлов в реальном времени.
Сначала нужно установить Mutagen на macOS и запустить сервис:
brew install mutagen-io/mutagen/mutagen mutagen daemon start
В качестве демонстрационного проекта используется placeholder-service - сервис для создания заглушек изображений.
Затем нужно создать в проекте отдельный docker-compose файл для Mutagen: docker-compose-osx.yml
.
Таким образом настройка Mutagen никак не влияет на работу Docker и запуск проекта под Linux.
version: '3' services: php-fpm: container_name: placeholder-service_php_fpm_1 volumes: - placeholder-service-www:/var/www nginx: volumes: - placeholder-service-www:/var/www - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf - ./docker/nginx/sites/:/etc/nginx/sites-available - ./docker/nginx/conf.d/:/etc/nginx/conf.d - ./docker/logs:/var/log volumes: placeholder-service-www:
В этом файле мы создаем именованный раздел placeholder-service-www
.
А также задаем уникальное имя placeholder-service_php_fpm_1
для контейнера php-fpm
.
Далее нужно создать конфигурационный файл mutagen.yml
.
sync: defaults: mode: "two-way-resolved" flushOnCreate: true ignore: vcs: true configurationBeta: permissions: defaultFileMode: 0666 defaultDirectoryMode: 0666 placeholder-service-www: alpha: "./" beta: "docker://placeholder-service_php_fpm_1/var/www" ignore: paths: - ".idea" - "var" - "vendor" # Set up the service and any volumes before creating sessions. beforeCreate: - docker-compose -f docker-compose.yml -f docker-compose-osx.yml up --build --detach # Set up the main services after creating sessions. At this point, sessions will # have been established and code pushed to the shared volume. # After this is done, we can start up the deployment scripts. afterCreate: - docker-compose -f docker-compose.yml -f docker-compose-osx.yml up --build --detach - docker-compose exec php-fpm composer install # Tear down all services and remove the code volume after terminating sessions. afterTerminate: - docker-compose -f docker-compose.yml -f docker-compose-osx.yml down --remove-orphans || true # Define common utility commands. commands: logs: docker-compose -f docker-compose.yml -f docker-compose-osx.yml logs --follow
Здесь мы настраиваем объединение конфигов docker-compose.yml
и docker-compose-osx.yml
.
Также настраиваем раздел placeholder-service-www
для автоматической синхронизации c директорией /var/www
контейнера placeholder-service_php_fpm_1
.
Права доступа задаются в разделе configurationBeta
.
В случае проблем с правами доступа также можно установить неограниченный доступ на /var/www, а также отключить отслеживание прав доступа git.
docker-compose exec php-fpm chmod -R 777 /var/www git config core.fileMode false
Установка и запуск описаны в Readme. Сначала можно запустить проект без Mutagen:
git clone https://github.com/antonshell/placeholder-service.git
cd placeholder-service/
docker-compose up
docker-compose exec php-fpm composer install
Загрузка тестовой страницы занимает 480ms.
Затем остановить контейнеры и запустить с помощью Mutagen:
docker-compose down --remove-orphans || true
mutagen project start || mutagen project terminate
docker-compose exec php-fpm chmod -R 777 /var/www
git config core.fileMode false
Загрузка тестовой страницы занимает 83ms.
Демонстрационный проект доступен на github. Также есть Pull Request с настройкой Mutagen. На этом пока все. Спасибо за внимание!