Как правильно настроить среду разработки на 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?
— Евгений Брикман


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


Спасибо за публикацию, но как это решить проблемы с производительностью с подключенными томами?
— Евгений Брикман

Ах, извините, вам больше не нужно использовать 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

3
Да, но, к сожалению, это не решило первоначально возникшую проблему.
— Ник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.