Как правильно настроить среду разработки на OS X с помощью Docker?

вступление

Я не могу найти хороший способ настроить среду разработки на OS X, используя Docker и Boot2Docker. Проблема, с которой я сталкиваюсь, заключается в том, как управлять исходным кодом, чтобы:

  1. Я могу изменить код в OS X, используя инструменты (текстовый редактор, IDE, git и т.д.), Которые я уже установил.
  2. Эти изменения отражаются в контейнере 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) и опробовал некоторые из них, но не нашел успешного:

  1. Я переключил Boot2Docker на использование NFS, но это было так же медленно.
  2. Я попробовал Vagrant + NFS, и это было так же медленно.
  3. Я пробовал монтировать Samba, но папка всегда отображалась пустой в контейнере Docker.
  4. Я пытался использовать файловую систему Unison, которая кратко работала для синхронизации файлов, но затем продолжала показывать ошибки соединения.
  5. Я включил опрос в Jekyll, но это значительно увеличило задержку, пока мои изменения не были подобраны.
  6. Я попробовал 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

Двунаправленная синхронизация с очень хорошей производительностью!

Ответ 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