Как правильно настроить среду разработки на OS X с помощью Docker?
интро
Я не могу найти хороший способ настроить среду разработки на OS X с помощью Docker и Boot2Docker. Проблема, с которой я сталкиваюсь, заключается в том, как управлять исходным кодом так, чтобы:
- Я могу изменить код на OS X с помощью инструментов (текстовый редактор, IDE, git и т. д.), которые я уже установил.
- эти изменения отражаются в контейнере Docker, поэтому, если я повторно запускаю тесты или обновляю веб-страницу, Я вижу свои изменения немедленно.
теоретически это должно быть легко сделать, установив мой исходный код в виде Тома:
docker run -it -v /path/to/my/source/code:/src some-docker-image
к сожалению, это имеет две основные проблемы, которые делают его полностью непригодным для использования в OS X:
Проблема №1: смонтированные Тома на виртуальной коробке (которые используют vboxsf) чрезвычайно медленны
например, вот сколько времени требуется Джекилу, чтобы скомпилировать мой Домашняя страница если исходный код является частью Докер изображение:
> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash
root@7aaea30d98a1:/src# time bundle exec jekyll build
[...]
real 0m7.879s
user 0m7.360s
sys 0m0.600s
вот точно такой же образ Докера, за исключением этого времени, я монтирую исходный код из OS X:
> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash
root@1521b0b4ce6a:/src# time bundle exec jekyll build
[...]
real 1m14.701s
user 0m9.450s
sys 0m3.410s
Проблема №2: просмотр файлов нарушен
механизмы наблюдения по умолчанию в SBT, Jekyll и grunt используют такие технологии, как inotify, которые не работают, если они работают в контейнере Docker, и изменения вносятся в OS X в смонтированную папку.
обходные пути я пробовал
Я искал решения (в том числе все они на SO) и опробовали несколько из них, но не нашли успешного:
- Я переключил Boot2Docker для использования NFS, но это было так медленно.
- я попробовал Vagrant + NFS, и это тоже было так же медленно.
- Я пробовал Самбу гора, но папка всегда показывалась пустой в контейнере Docker.
- Я пытался использовать unison file system, который работал кратко для синхронизации файлов, но тогда держали показывать ошибки подключения.
- я включил опрос в Джекил, но это значительно увеличило задержку, пока мои изменения не были подобраны.
- пробовал Тузик, "более быстрый, дружелюбный Докер на OS X с Vagrant" и получил некоторые улучшение. Вместо того, чтобы компиляция Джекила была в 10-15 раз медленнее, она была в 2-3 раза медленнее. Это лучше, но все еще не совсем пригодно.
кто-нибудь нашел решение, которое действительно работает и позволяет продуктивно разрабатывать код с помощью Docker и OS X?
обновление: наконец-то решение!
я наконец нашел решение, которое кажется продуктивным с помощью Boot2Docker + rsync. Я захватил детали о том, как настроить это в моем собственном ответе, а также проект с открытым исходным кодом под названием docker-osx-dev.
10 ответов:
Я решил добавить свой ответ лучшее решение я нашел до сих пор. Я обновлю это, если найду лучшие варианты.
лучшее решение до сих пор
лучшее решение, которое я нашел для настройки продуктивной среды разработки с Docker на OS X:Boot2Docker + Rsync. С помощью rsync время сборки в контейнере Docker находится на одном уровне с запуском сборки непосредственно на OSX! Кроме того, код наблюдателя файлов делает не необходимость опроса (
inotifyработает, так как rsync использует обычные папки), поэтому горячая перезагрузка почти как быстро.есть два способа его настройки: автоматическая установка и ручная установка.
автоматизированная установка
я упаковал все шаги для настройки Boot2Docker с Rsync в проект с открытым исходным кодом под названием docker-osx-dev. Код немного грубый, но я успешно использую его в течение нескольких лет недели, чтобы легко переключаться между 3 проектами с 3 различными стеками технологий. Попробуйте, сообщите об ошибках и отправьте некоторые PRs! Кроме того, смотрите мой пост в блоге,продуктивная среда разработки с Докером на OS X для получения дополнительной информации.
руководство по установке
- установить Boot2Docker:
brew install boot2docker.- запустите Boot2Docker, но с отключенными общими папками VirtualBox:
boot2docker init && boot2docker start --vbox-share=disable.- выполнить
boot2docker shellinitи скопируйте переменные среды он печатает в ваш .- установите rsync на виртуальную машину Boot2Docker:
boot2docker ssh "tce-load -wi rsync".- создайте необходимые базовые папки на виртуальной машине Boot2Docker и правильно установите для них разрешения. Например, если вы будете синхронизировать
/foo/barпапка из OS X, вам нужно создать/foo/barна виртуальной машине Boot2Docker:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar".- запустите rsync для синхронизации файлов с виртуальной машиной Boot2Docker:
rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. Проверьте документы rsync для различных параметров, которые вы можете включить, например используя--exclude .gitисключить при синхронизации.- использовать файл Watcher, чтобы сохранить файлы в синхронизации. Например, вы можете использовать fswatch (
brew install fswatch) передается в rsync.- на данный момент, Вы должны быть в состоянии использовать
docker runчтобы запустить контейнер Docker и использовать-vфлаг для подключения папки, которую вы синхронизируете:docker run -v /foo/bar:/src some-docker-image.- Обновить код на OS X, как обычно. Изменения должны распространяться очень быстро, используя rsync, нормальный файл watcher код должен забрать изменения, как обычно (т. е. с помощью
inotify), и сборка должна выполняться быстро, потому что все файлы являются "локальными" для контейнера.- Если вам нужно протестировать работающий сайт, запустите
boot2docker ipкоманда, чтобы узнать, какой IP он включен.
обновление: теперь что докер для mac находится в бета-версии с функциями без взлома, этот маршрут может быть намного более разумным для локального развития без хаков и обходных путей эссе.
не. Я знаю, что это не тот ответ, на который вы, вероятно, надеетесь, но возьмите честную оценку стоимости/выгоды от попытки получить локальный исходный код + докеризованное выполнение против просто локальной разработки на OSX.
At в какой-то момент все проблемы, усилия по настройке и операционные болевые точки могут быть решены достаточно хорошо, но на данный момент мое мнение об этом-это чистый убыток.
Проблема №1: смонтированные Тома на виртуальной коробке (которые используют vboxfs) чрезвычайно медленны
подождите некоторое время, и это почти наверняка улучшится.
Проблема №2: просмотр файлов нарушен
Я не уверен, что исправить это в ближайшем будущем. Если этот тип функциональность является ключом к вашему рабочему процессу разработки, я бы счел это dealbreaker. Это не стоит больших усилий в области НИОКР по сравнению с просто использованием rbenv/bundler для управления вашими установками jekyll / ruby и запуска их локально на OSX, как люди успешно делали в течение последнего десятилетия+.
Так же, как "облако" имеет нулевое участие в моей локальной настройке разработки, на данный момент docker является выигрышем для тестирования / постановки / развертывания и для запуска баз данных и других третьих сторон компоненты, но приложения, которые я на самом деле кодирую, запускаются прямо на OSX.
Docker для Mac и Windows должен быть окончательный способ разработки с Docker на OS X (и Windows). Продукт Docker, программное обеспечение-это " интегрированная, простая в развертывании среда для создания, сборки и доставки приложений с Mac или Windows."Это направлено на то, чтобы быть в состоянии решить проблемы, представленный ОП. Из его 24 марта 2016:
- быстрее и надежнее: нет больше VirtualBox! докер движок работает в дистрибутиве Alpine Linux поверх виртуальной машины xhyve на Mac OS X или на виртуальной машине Hyper-V в Windows, и эта виртуальная машина управляется приложением Docker. Вам не нужно docker-machine для запуска Docker для Mac и Windows.
- интеграция инструментов: Docker для Mac-это приложение Mac, а Docker для Windows-это приложение Windows, включая собственный пользовательский интерфейс и возможность автоматического обновления. Набор инструментов Docker поставляется в комплекте с ним: Docker command line, Docker Составьте, и Docker нотариус командной строки.
- установка Тома для вашего кода и данных: доступ к данным Тома работает правильно, включая уведомления об изменении файлов (на Mac inotify теперь работает без проблем внутри контейнеров для каталогов, подключенных к тому). Это позволяет редактировать / тестовые циклы для разработки "в контейнере".
- легкий доступ к запущенным контейнерам в локальной сети хоста: Docker для Mac и Windows включают DNS-сервер для контейнеров и интегрированы с Mac OS X и сетевая система Windows. На Mac Docker можно использовать даже при подключении к очень ограничительной корпоративной VPN.
- Docker для Mac был спроектирован с нуля, чтобы соответствовать модели безопасности OS X sandbox, и мы тесно сотрудничаем с Apple для достижения этой цели.
отказ от ответственности: я могу быть предвзятым, так как я являюсь автором docker-sync.
Я, вероятно, пробовал все решения, названные здесь, в том числе некоторые другие (см. compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync), но они в основном либо не удалось на стороне производительности (большинство из них) или на докер-машине (или нет) используется / принудительно.
http://docker-sync.io был построен, чтобы объединить все решения и обеспечивают лучшие стратегии (реализуя несколько, вы можете выбрать).
Он может быть использован с rsync (1 способ синхронизации), включая исправления разрешений для пользователей, и с unison (2 способ синхронизации). Это не заставляет вас в docker-machine или конкретный гипервизор, а также не требует, чтобы у вас был docker для Mac. Он работает со всеми из них.
производительность EugenMayer / docker-sync/wiki / 4.-Производительность не влияет, это как у вас нет доли в все.
docker-sync и его наблюдатели за изменениями оптимизированы и работают с проектами с файлами 12k без проблем.
дайте ему попробовать, если хотите, я хотел бы услышать обратную связь!
Я чувствую тебя! Я думаю, что я пробовал почти все, что вы пробовали, и, к сожалению, это было все еще медленно. Затем я наткнулся на этот комментарий https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 это предполагает использование Vagrant и Parallels и вместо Virtualbox. Это позволило мне использовать nfs, и я действительно увидел большой прирост производительности для моего проекта (Drupal).
вот файл бродяги. Все, что вам нужно сделать, это установить vagrant, скопировать это в a файл называется Vagrantfile и помещается в какую-то папку. Перейдите в эту папку и просто сделайте
vagrant upвместо вашего обычного boot2docker вверх.Vagrant.configure(2) do |config| config.vm.box = "parallels/boot2docker" config.vm.network "forwarded_port", guest: 80, host: 80 config.vm.synced_folder( "/Users/dicix/work/www", "/vagrant", type: 'nfs', nfs_udp: true, mount_options: %w[actimeo=2], bsd__nfs_options: %w[alldirs maproot=root:wheel] ) end
Я также использую Vagrant с parallels и boot2docker (https://github.com/Parallels/boot2docker-vagrant-box). развитие никогда не было проще для меня. Работает очень хорошо с
docker-composeи большим объемом. Я действительно не чувствую задержки или массового потребления ресурсов.Это то, что моя
Vagrantfileвыглядит так:Vagrant.configure(2) do |config| config.vm.network "private_network", ip: "192.168.33.10" config.vm.box = "parallels/boot2docker" config.vm.synced_folder "/Users", "/Users", type: "nfs", mount_options: ["nolock", "vers=3", "udp"], id: "nfs-sync" end
Я уже несколько недель разрабатываю среду OS X (mid 2011 Macbook Air) + Boot2Docker + Docker-compose. Не сталкивались с серьезными проблемами производительности, но я избегаю запуска какой-либо сборки при разработке (почему бы не использовать что-то вроде
jekyll serve --skip-initial-build?). Вот примерdocker-compose.ymlфайл, который я использую:docker-compose.yml:
test: build: . volumes: - ./client:/src/client - ./server:/src/server - ./test:/src/test command: nodemon --exec jasmine-node -- test/ --verbose --autotest --captureExceptions --color environment: - DEBUG=*Dockerfile:
FROM node:0.12 RUN mkdir -p /src WORKDIR /src ENV PATH=/src/node_modules/.bin:$PATH # We add package.json first so that we the # image build can use the cache as long as the # contents of package.json hasn't changed. COPY package.json /src/ RUN npm install --unsafe-perm COPY . /src CMD [ "npm", "start" ] EXPOSE 3000Я иногда использую NFS (http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/), но не заметили большой разницы в производительности при этом.
для меня, удобство простой
docker-compose up testчтобы заставить мою среду работать, это стоило затрат на производительность (я обычно работаю над несколькими проектами с разными стеками).PS:
nodemonявляется одним из немногих наблюдателей файлов, которые работают с vboxsf (см. https://github.com/remy/nodemon/issues/419).
настройки унисон работает как шарм! https://github.com/leighmcculloch/docker-unison
двунаправленная синхронизация, с очень хорошими характеристиками!
получение настройки для работы в качестве инструмента развития. Но это будет больно. Я задокументировал этот процесс здесь:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
этот метод является последним (сентябрь 2015) и самый простой способ получить настройки Docker на Mac: вот ссылка:
вы устанавливаете Docker с помощью Docker Toolboxссылка на инструкцию здесь:
Это полный пакет установки, настройки, это включает в себя следующие инструменты Docker:
Docker Machine для запуска двоичного файла docker-machine
Докер двигатель для запуска докера двоичный
Docker Compose для запуска docker-compose binary
Kitematic, графический интерфейс Docker оболочка, предварительно настроенная для среды командной строки Docker
Oracle VM VirtualBox
что в наборе:
- Docker Client
- Настройки Машины
- Docker Compose (только для Mac)
- Докер Kitematic
- VirtualBox

Comments