Как правильно настроить среду разработки на 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: Подключенные тома на VirtualBox (которые используют vboxsf) очень медленные
Например, вот как долго Jekyll компилирует мою домашнюю страницу, если исходный код является частью образа Docker:
> docker run -it brikis98/yevgeniy-brikman-homepage:v1 bash
[email protected]:/src# time bundle exec jekyll build
[...]
real 0m7.879s
user 0m7.360s
sys 0m0.600s
Вот точно такой же образ Docker, но на этот раз я смонтировал исходный код из OS X:
> docker run -it -v $(pwd):/src brikis98/yevgeniy-brikman-homepage:v1 bash
[email protected]:/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, и это было так же медленно.
- Я пробовал монтировать Samba, но папка всегда отображалась пустой в контейнере Docker.
- Я пытался использовать файловую систему Unison, которая кратко работала для синхронизации файлов, но затем продолжала показывать ошибки соединения.
- Я включил опрос в Jekyll, но это значительно увеличило задержку, пока мои изменения не были подобраны.
- Я попробовал Dinghy, "более быстрый, дружелюбный Docker на OS X с Vagrant" и получил некоторое улучшение. Вместо того, чтобы компиляция Jekyll была в 10-15 раз медленнее, она была в 2-3 раза медленнее. Это лучше, но все еще не совсем годный к употреблению.
Кто-нибудь нашел решение, которое действительно работает и позволяет продуктивно разрабатывать код с помощью Docker и OS X?
Обновление: решение наконец!
Я наконец нашел решение, которое кажется продуктивным, используя Boot2Docker + rsync. Я собрал подробности о том, как это настроить, в своем собственном ответе, а также в проекте с открытым исходным кодом под названием docker-osx-dev.
Ответы
Ответ 1
Я решил добавить свой собственный ответ с лучшим решением, которое я нашел до сих пор. Я обновлю это, если найду лучшие варианты.
Лучшее решение до сих пор
Лучшее решение, которое я нашел для настройки продуктивной среды разработки с Docker в OS X,: Boot2Docker + Rsync. С rsync время сборки в контейнере Docker находится на одном уровне с запуском сборки непосредственно на OSX! Более того, код наблюдателя файла не нуждается в опросе (inotify
работает, поскольку rsync использует обычные папки), поэтому горячая перезагрузка происходит почти так же быстро.
Есть два способа настроить его: автоматическая установка и ручная установка.
Автоматическая установка
Я выполнил все шаги для настройки Boot2Docker с помощью Rsync в проект с открытым исходным кодом под названием docker-osx-dev. Код немного грубо, но я успешно использовал его в течение нескольких недель, чтобы легко переключаться между 3-мя проектами с тремя различными стеками технологий. Попробуйте, сообщите об ошибках и отправьте некоторые PR! Кроме того, см. Мое сообщение в блоге Производственная среда разработки с Docker на OS X для получения дополнительной информации.
Ручная настройка
- Установите Boot2Docker:
brew install boot2docker
.
- Запустите Boot2Docker, но с отключенными общими папками VirtualBox:
boot2docker init && boot2docker start --vbox-share=disable
.
- Запустите
boot2docker shellinit
и скопируйте переменные среды, которые он выдает в ваш файл ~/.bash_profile
.
- Установите rsync на VM2 Boot2Docker:
boot2docker ssh "tce-load -wi rsync"
.
- Создайте необходимые базовые папки на VMware Boot2Docker и установите для них правильные права. Например, если вы будете синхронизировать папку
/foo/bar
с OS X, вам нужно создать /foo/bar
на VM Boot2Docker: boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar"
.
- Запустите rsync, чтобы синхронизировать файлы с VM2 Boot2Docker:
rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar [email protected]:/foo
. Проверьте документы rsync для различных параметров, которые вы можете включить, например, с помощью --exclude .git
, чтобы исключить папку .git
при синхронизации.
- Используйте файл-наблюдатель, чтобы синхронизировать файлы. Например, вы можете использовать fswatch (
brew install fswatch
) в rsync.
- На этом этапе вы сможете использовать
docker run
для запуска контейнера Docker и использовать флаг -v
для монтирования папки, которую вы синхронизируете: docker run -v /foo/bar:/src some-docker-image
.
- Обновите код на OS X, как обычно. Изменения должны распространяться очень быстро, используя rsync, нормальный файл наблюдателя должен воспринимать изменения как обычно (т.е. Используя
inotify
), и сборка должна выполняться быстро, потому что все файлы являются "локальными" в контейнере.
- Если вам нужно протестировать запущенный веб-сайт, запустите команду
boot2docker ip
, чтобы узнать, на каком IP-адресе.
Ответ 2
Обновление. Теперь, когда docker для mac находится в бета-версии с не-хак-функциональностью, этот маршрут может быть гораздо более разумным для локального развития без эссе стоит хаки и обходные пути.
Не. Я знаю, что не ответ, на который вы, вероятно, надеетесь, но честно оценивайте стоимость/выгоду от попыток получить локальный исходный код + докционированное выполнение, а не только локальную разработку на OSX.
В какой-то момент все проблемы, усилия по настройке и операционные точки боли МОГУТ быть разрешены достаточно хорошо, но сейчас я беру на себя это чистая потеря.
Проблема № 1: Установленные тома в Virtual Box (которые используют vboxfs) чрезвычайно медленны
Подождите некоторое время, и это почти наверняка улучшится.
Проблема №2: Нарушение просмотра файлов
Я не уверен, что исправить это будет в ближайшем будущем. Если этот тип функциональности является ключом к вашему рабочему процессу разработки, я бы счел это делом. Это не стоит больших усилий R & D по сравнению с использованием только rbenv/bundler для управления установками jekyll/ruby и их локального использования на OSX, как люди успешно работали в течение последнего десятилетия +.
Точно так же, как "облако" имеет нулевое участие в моей локальной настройке разработки, на данный момент докер - это победа для тестирования/постановки/развертывания, а также для запуска баз данных и других сторонних компонентов, но приложения, которые я на самом деле кодирую запускайте прямо на OSX.
Ответ 3
Докер для Mac и Windows должен стать окончательным способом разработки с помощью Docker на OS X (и Windows). Программное обеспечение Docker - это "интегрированная, простая в развертывании среда для создания, сборки и доставки приложений с Mac или Windows". Он призван решить проблемы, возникающие в ОП. Из своего объявления 24 марта 2016 года:
- Быстрее и надежнее: больше нет VirtualBox! Двигатель Docker работает в дистрибутиве Alpine Linux поверх виртуальной машины xhyve в Mac OS X или на виртуальной машине Hyper-V в Windows, и эта виртуальная машина управляется приложением Docker. Вам не нужна докер-машина для запуска Docker для Mac и Windows.
- Интеграция с инструментами: Docker для Mac - это приложение для Mac, а Docker для Windows - это приложение Windows, включая собственный пользовательский интерфейс и возможность автоматического обновления. Набор инструментов Docker поставляется вместе с ним: командная строка Docker, команда Docker Compose и команда Docker Notary.
- Громкость для вашего кода и данных: доступ к данным объема данных работает правильно, в том числе уведомления об изменениях файлов (теперь Mac inotify работает без проблем внутри контейнеров для тома, установленных в каталогах). Это позволяет редактировать/тестировать циклы для разработки "в контейнере".
- Легкий доступ к работающим контейнерам в локальной сети: Docker для Mac и Windows включает DNS-сервер для контейнеров и интегрирован с сетевой системой Mac OS X и Windows. На Mac докеры могут использоваться даже при подключении к очень ограничительной корпоративной VPN.
- Docker для Mac был создан с нуля, чтобы соответствовать модели безопасности Sandbox для OS X, и мы тесно сотрудничаем с Apple для достижения этой цели.
Ответ 4
Отказ от ответственности: я мог бы быть предвзятым, так как я являюсь автором docker-sync.
Я, вероятно, пробовал все решения, названные здесь, в том числе и другие (см. compersion https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync), но они в основном либо не сработали на (большинство из них) или на докер-машине (или нет), используемой/принудительной.
http://docker-sync.io был создан для объединения всех решений и предоставления лучших стратегий (реализация нескольких, вы можете выбрать).
Он может использоваться с rsync (односторонняя синхронизация), включая исправления для пользователей, и с унисонной (2-сторонняя синхронизация). Он не принуждает вас к докер-машине или конкретному гипервизору и не требует, чтобы у вас был докер для Mac. Он работает со всеми из них.
Производительность EugenMayer/docker-sync/wiki/4.-Performance не зависит, так как у вас вообще нет акций.
docker-sync и его наблюдатели за изменениями оптимизированы и работают без проектов с файлами 12k.
Попробуйте, если хотите, я хотел бы услышать отзывы!
Ответ 5
Я чувствую тебя! Я думаю, что я пробовал почти все, что вы пробовали, и, к сожалению, он все еще был медленным. Затем я наткнулся на этот комментарий https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254, который предлагает использовать Vagrant и Parallels и вместо Virtualbox. Это позволило мне использовать nfs, и я действительно видел большой прирост производительности для моего проекта (Drupal).
Вот бродячий файл. Все, что вам нужно сделать, это установить бродяга, скопировать его в файл под названием Vagrantfile и поместить его в какую-то папку. Перейдите в эту папку и просто сделайте vagrant up
вместо обычного загрузочного устройства.
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
Ответ 6
Я также использую Vagrant с параллелями и 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
Ответ 7
Я развиваюсь в OS X (середина 2011 Macbook Air) + Boot2Docker + Docker-compose environment в течение нескольких недель. Не сталкивайтесь с серьезными проблемами производительности, но я избегаю использования какой-либо сборки при разработке (почему бы не использовать что-то вроде jekyll serve --skip-initial-build
?). Вот пример файла docker-compose.yml
, который я использую:
докер-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).
Ответ 8
Докер-унисон работает как шарм!
https://github.com/leighmcculloch/docker-unison
Двунаправленная синхронизация с очень хорошей производительностью!
Ответ 9
Возможно получение докеров для работы в качестве инструмента разработки. Но это будет больно. Я зарегистрировал этот процесс здесь:
http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html
Ответ 10
Этот метод является последним (сентябрь 2015 г.) и самым простым способом получить настройку Docker на Mac:
ссылка здесь:
Вы устанавливаете Docker, используя Docker Toolbox ссылку на инструкции:
Это полный пакет установки Docker,
который включает следующие инструменты Docker:
Докерная машина для запуска двоичной машины док-машины
Docker Engine для запуска двоичного файла docker
Docker Compose для запуска двоичного файла docker-compose
Kitematic, графический интерфейс Docker
оболочка, предварительно сконфигурированная для среды командной строки Docker
Oracle VM VirtualBox
![введите описание изображения здесь]()
Что в панели инструментов:
- Клиент Docker
- Докерная машина
- Docker Compose (только для Mac)
- Docker Kitematic
- VirtualBox