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

94

вступление

Я не могу придумать хороший способ настроить среду разработки на 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

root@7aaea30d98a1:/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

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) и опробовал несколько из них, но не нашел успешного:

  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 .

Евгений Брикман
источник
Вы пробовали официальный установщик Docker для OS X вместе с NFS? AFAIK, это проблема не только для Docker на OS X, но и для разработки на основе Vagrant на OS X с большей (ыми) кодовой базой ( у нас есть аналогичная проблема, но с Vagrant ). Я считаю, что NFS - единственное жизнеспособное и приемлемое решение.
Джеймс Миллс
@JamesMills: Я выполнил официальные инструкции по установке Docker и Boot2Docker. Есть ли официальные инструкции по настройке NFS? Я нашел их только в сущности GitHub, и после их использования это не выглядело быстрее. Как вы настраивали NFS?
Евгений Брикман
Вы видели github.com/boot2docker/boot2docker/issues/64 ?
Джеймс Миллс
6
Правильный способ работы с Docker - запускать Linux изначально вместо OS X или выполнять всю работу по разработке внутри виртуальной машины Linux. Интеграция boot2docker - это большой уродливый хакер, который только сеет путаницу и разочарование.
larsks
7
@larsks: Это бесполезно.
Евгений Брикман

Ответы:

46

Я решил добавить свой собственный ответ с лучшим решением, которое я нашел до сих пор. Я обновлю это, если найду лучшие варианты.

Лучшее решение на данный момент

Лучшее решение, которое я нашел для создания продуктивной среды разработки с Docker в OS X, - это Boot2Docker + Rsync . При использовании rsync время сборки в контейнере Docker соответствует времени запуска сборки непосредственно в OSX! Более того, код наблюдателя за файлами не требует опроса ( inotifyработает, поскольку rsync использует обычные папки), поэтому горячая перезагрузка выполняется почти так же быстро.

Есть два способа настроить его: автоматическая и ручная.

Автоматическая установка

Я собрал все шаги по настройке Boot2Docker с помощью Rsync в проект с открытым исходным кодом под названием docker-osx-dev . Код немного грубоват, но я успешно использую его в течение нескольких недель, чтобы легко переключаться между 3 проектами с 3 разными техническими стеками. Попробуйте, сообщайте об ошибках и публикуйте PR! Также см. Мое сообщение в блоге «Продуктивная среда разработки с Docker на OS X» для получения дополнительной информации.

Ручная настройка

  1. Установить Boot2Docker : brew install boot2docker.
  2. Run Boot2Docker, но с VirtualBox общих папок отключены: boot2docker init && boot2docker start --vbox-share=disable.
  3. Запустите boot2docker shellinitи скопируйте переменные среды, которые он распечатывает, в свой ~/.bash_profileфайл.
  4. Установите Rsync на Boot2Docker VM: boot2docker ssh "tce-load -wi rsync".
  5. Создайте необходимые базовые папки на виртуальной машине Boot2Docker и правильно установите для них разрешения. Например, если вы будете синхронизировать /foo/barпапку из OS X, вам необходимо создать /foo/barна виртуальной машине Boot2Docker:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar" .
  6. Запуск Rsync для синхронизации файлов на Boot2Docker VM: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. Проверьте в документации по rsync различные настройки, которые вы можете включить, например, использование --exclude .gitдля исключения.git папки при синхронизации.
  7. Используйте средство отслеживания файлов для синхронизации файлов. Например, вы можете использовать fswatch (brew install fswatch ), к rsync.
  8. На этом этапе вы сможете использовать его docker runдля запуска контейнера Docker и использовать -vфлаг для монтирования папки, которую вы синхронизируете:docker run -v /foo/bar:/src some-docker-image .
  9. Обновите код в OS X как обычно. Изменения должны распространяться очень быстро с помощью rsync, обычный код наблюдателя за файлами должен улавливать изменения как обычно (т. Е. С помощьюinotify ), а сборка должна выполняться быстро, потому что все файлы являются «локальными» для контейнера.
  10. Если вам нужно протестировать работающий веб-сайт, запустите boot2docker ipкоманду, чтобы узнать, на каком IP он находится.
Евгений Брикман
источник
Спасибо, что поделился! Когда они говорят, что rsync является «только односторонним», означает ли это, что я не могу использовать файловую систему OS X для обмена файлами между двумя контейнерами? Пример: контейнер 1 наблюдает за исходными файлами и компилирует двоичный файл, контейнер 2 используется для запуска скомпилированного двоичного файла (в этом примере используется Haskell).
Николас Хери
1
@NicolasHery: Насколько я понимаю, rsync будет копировать изменения из OS X в контейнер Docker, но не наоборот. Следовательно, любые файлы, сгенерированные контейнером Docker (например, скомпилированный двоичный файл), не будут видны в OS X. Однако, если эти файлы созданы в папке, помеченной как a VOLUME, вы можете предоставить другому контейнеру доступ к этому тому, используя --volumes-fromфлаг. Я еще не пробовал, но подозреваю, что это сработает.
Евгений Брикман
1
Отличный ответ. Вы можете создать драйвер для док-машины ( github.com/docker/machine ), который сделает за вас большую часть шаблонов.
дом
1
@dom: Мне нравится эта идея, но знаете ли вы, как создать драйвер для докер-машины? Является ли запрос на перенос в репо единственным способом или возможно создание драйвера извне?
Евгений Брикман
1
Это руководство все еще актуально для новой версии 1.9.1 для Windows? Могу я его использовать, или, может быть, у Докера уже было новое решение этой «проблемы»?
18

Обновление : теперь, когда docker для Mac находится в стадии бета-тестирования с функцией, не связанной с взломом, этот путь может быть намного более разумным для локальной разработки без хакерских приемов и обходных путей для эссе.

Не надо . Я знаю, что это не тот ответ, на который вы, вероятно, надеетесь, но честно оцените затраты / выгоды от попытки получить локальный исходный код + выполнение в докере по сравнению с локальной разработкой на OSX.

В какой-то момент все проблемы, усилия по настройке и операционные болевые точки МОГУТ быть решены достаточно хорошо, но на данный момент я считаю, что это чистая потеря.

Проблема №1: подключенные тома на Virtual Box (которые используют vboxfs) очень медленные

Подождите немного, и это почти наверняка улучшится.

Проблема №2: просмотр файлов нарушен

Я не уверен, что это исправление в ближайшем будущем. Если этот тип функциональности является ключевым для вашего рабочего процесса разработки, я считаю, что это нарушает правила. Это не стоит серьезных исследований и разработок по сравнению с простым использованием rbenv / bundler для управления установками jekyll / ruby ​​и их запуском локально на OSX, как это делали люди в течение последнего десятилетия +.

Точно так же, как "облако" не участвует в моей локальной настройке разработки, на данный момент docker является преимуществом для тестирования / постановки / развертывания и для запуска баз данных и других сторонних компонентов, но приложения, которые я кодирую, запускаются прямо на OSX.

Питер Лайонс
источник
1
Я поддерживаю это. Мы разрабатываем на OSX и запускаем приложения прямо внутри системы (с живой перезагрузкой и т. Д.). Затем, когда приложение будет завершено, мы докеризуем его для тестирования, постановки и производства.
ItalyPaleAle
4
Хм, это немного разочаровывает. У меня всегда был паритет в моей среде постановки / производства. Когда я пишу код на OS X, разработчик всегда был исключением. Из документации Docker, безусловно, говорилось, что это решенная проблема. Я собираюсь дать ему еще один день усилий и посмотреть, смогу ли я заставить что-нибудь работать.
Евгений Брикман
Вы все еще считаете этот ответ актуальным, Питер? Всего через несколько месяцев, но, учитывая проект @Eevgeniy и всего 2 проблемы, которые теперь исправлены, возможно, затраты / выгода уже окупаются! Не так ли?
Cregox
1
Это дело личных предпочтений. Я все равно не стал бы связываться с этим из-за огромного количества проектов, между которыми я прыгаю в качестве консультанта. Если бы я работал на полную ставку, работая в основном над одним и тем же проектом в течение недель / месяцев, возможно, стоило бы настроить материал rsync / fswatch.
Питер Лайонс
Docker Toolbox - это правильный способ сделать это в настоящее время, потому что, если вы используете homebrew или другой менеджер пакетов, версии инструментов docker не будут синхронизироваться, если они не будут следовать управлению версиями как панели инструментов docker.
taco
12

Docker для 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 Docker можно использовать даже при подключении к корпоративной VPN с очень ограниченными возможностями.
  • Docker для Mac был разработан с нуля, чтобы соответствовать модели безопасности песочницы OS X, и мы тесно сотрудничаем с Apple для достижения этой цели.
Куинн Комендант
источник
Я только что видел это на днях, и это действительно кажется наиболее многообещающим решением. Я очень рад попробовать, как только он выйдет из бета-версии, и, если он будет работать хорошо, я изменю его на официально принятый ответ.
Евгений Брикман
4
К сожалению, текущая бета-версия (1.11.0-beta7) кажется такой же медленной, как и другие методы, поэтому может потребоваться некоторое время, прежде чем станет возможным использовать forum.docker.com/t/…
walterra
3

Отказ от ответственности: я могу быть предвзятым, так как я автор docker-sync.

Я, вероятно, пробовал все решения, названные здесь, в том числе некоторые другие (см. Сравнение https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), но они в основном либо потерпели неудачу на стороне производительность (большинство из них) или на докер-машине (или ни одной) используется / применяется.

http://docker-sync.io был создан для объединения всех решений и предоставления лучших стратегий (реализация нескольких, вы можете выбрать).

Его можно использовать с rsync (односторонняя синхронизация), включая исправления разрешений для пользователей, и с unison (двухсторонняя синхронизация). Он не заставляет вас использовать докер-машину или конкретный гипервизор, а также не требует наличия докера для Mac. Он работает со всеми из них.

На производительность EugenMayer / docker-sync / wiki / 4.-На производительность не влияет, как будто у вас вообще нет акций.

docker-sync и его наблюдатели за изменениями оптимизированы и без проблем работают с проектами с 12К файлами.

Попробуйте, если хотите, я хотел бы услышать отзывы!

Ойген Майер
источник
2

Я чувствую тебя! Думаю, я перепробовал почти все, что вы пробовали, но, к сожалению, все было медленно. Затем я наткнулся на этот комментарий https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254, который предлагает использовать Vagrant и Parallels вместо Virtualbox. Это позволило мне использовать nfs, и я действительно увидел большой прирост производительности моего проекта (Drupal).

Вот файл Vagrant. Все, что вам нужно сделать, это установить vagrant, скопировать его в файл с именем 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
Алекс Дисану
источник
Я предполагаю, что для этого требуется установка параллелей?
Евгений Брикман
2

Я также использую 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
Дэвид Хайдрих
источник
1

Я занимаюсь разработкой в ​​среде OS X (Macbook Air середины 2011 года) + 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 ).

Оливье Лалонде
источник
Даже если я пропущу начальную сборку с Jekyll, каждый раз, когда я изменяю файл, его придется перестраивать, что по-прежнему занимает порядка 1-3 минут, если исходный код смонтирован. Это делает невозможным разработку какого-либо стиля с изменением и перезагрузкой.
Евгений Брикман
@YevgeniyBrikman О, я не знал об этом :( Я полагаю, что последний вариант - разместить ваш код внутри виртуальной машины boot2docker и смонтировать его на вашем хост-компьютере с помощью sshfs. В противном случае, думаю, вам придется подождать улучшенная производительность смонтированных папок для использования докеров в качестве среды разработки.
Оливье Лалонде,
-1

Заставить докер работать как инструмент разработки возможно. Но будет больно. Я задокументировал этот процесс здесь:

http://harmingcola.blogspot.com/2015/05/how-to-setup-docker-as-development-tool.html

Harmingcola
источник
Спасибо за публикацию, но как это решить проблемы с производительностью с подключенными томами?
Евгений Брикман
Ах, извините, вам больше не нужно использовать vBox для монтирования чего-либо. Вы можете монтировать папки через обычный интерфейс докера
harmingcola
-4

Этот метод является последним (сентябрь 2015 г.) и самым простым способом установить Docker на Mac: ссылка здесь:

Вы устанавливаете Docker с помощью Docker Toolbox, ссылка на инструкции здесь:

Это полный пакет установки Docker, который включает следующие инструменты Docker:

Docker Machine для запуска двоичного файла docker-machine

Docker Engine для запуска двоичного файла докера

Docker Compose для запуска двоичного файла docker-compose

Kitematic, графический интерфейс Docker, оболочка, предварительно настроенная для среды командной строки Docker.

Oracle VM VirtualBox

введите описание изображения здесь

Что в панели инструментов:

  • Клиент Докера
  • Докер машина
  • Docker Compose (только Mac)
  • Docker Kitematic
  • VirtualBox
rootscript
источник
3
Да, но, к сожалению, это не решило первоначально возникшую проблему.
Ник