Machine: Предложение: доля машины

Созданный на 30 дек. 2014  ·  68Комментарии  ·  Источник: docker/machine

machine share

Аннотация

machine превращается в отличный инструмент для быстрого и безболезненного создания и управления хостами Docker на различных платформах виртуализации и хостинг-провайдерах. По ряду причин желательна синхронизация файлов между компьютером, на котором выполняются команды machine , и самими машинами.

Мотивация

Контейнеры - отличный инструмент и единица развертывания, а машина делает создание места для запуска ваших контейнеров проще, чем когда-либо. Однако есть много причин, по которым кто-то хотел бы поделиться файлами, которые не были предварительно запечены в образ Docker, со своего клиентского компьютера machine на хост-машину. Вот несколько примеров:

  1. Хост machine - это виртуальная машина на портативном компьютере пользователя, и они разрабатывают веб-приложение внутри контейнера. Они хотят разрабатывать с привязкой исходного кода внутри контейнера, но все же редактировать на своем компьютере с помощью Sublime и т. Д.
  2. Пользователь хочет развернуть 10 хостов в облаке и провести на них научные вычисления с помощью Docker. У них есть контейнер, скажем, с необходимыми библиотеками Python, но им также необходимо отправить свои файлы .csv на хосты со своего ноутбука. Этот пользователь не знает деталей реализации machine или того, как найти ключи SSH для хостов и т. Д.
  3. Существует некоторый артефакт сборки, запущенной на машине (например, один или несколько скомпилированных двоичных файлов), и пользователь хочет получить этот артефакт с пульта дистанционного управления.

Как и в случае с остальной частью machine , было бы предпочтительнее иметь 80% случаев использования, в которых такие вещи происходят без проблем, интегрированных в рабочий процесс machine , при этом обеспечивая достаточную гибкость для пользователей, которые попадают в 20% не охвачены наиболее распространенными вариантами использования.

Интерфейс

Поразмыслив о механике и пользовательском интерфейсе этого, я думаю, нам следует отдать предпочтение явности перед неявностью и ошибиться в отношении _не_ создания случайных или неявных общих ресурсов.

Следует учесть несколько аспектов этой истории.

Командная строка

Синтаксис будет примерно таким:

$ pwd
/Users/nathanleclaire/website

$ machine ls
NAME           ACTIVE   DRIVER         STATE     URL
shareexample   *        digitalocean   Running   tcp://104.236.115.220:2376

$ machine ssh -c pwd
/root

$ machine share --driver rsync . /root/code
Sharing /Users/nathanleclaire/website from this computer to /root/code on host "shareexample"....

$ machine share ls
MACHINE      DRIVER SRC                           DEST
shareexample rsync  /Users/nathanleclaire/website /root/code

$ ls

$ echo foo >foo.txt

$ ls 
foo.txt

$ machine ssh -c "cat foo.txt"
cat: foo.txt: No such file or directory
FATA[0001] exit status 1

$ machine share push
[INFO] Pushing to remote...

$ machine ssh -c "cat foo.txt"
foo

$ machine share --driver scp / /root/client_home_dir 
ERR[0001] Sharing the home directory or folders outside of it is not allowed.  To override use --i-know-what-i-am-doing-i-swear

ИМО, мы должны запретить пользователям создавать общие ресурсы в или за пределами домашнего каталога клиента _или_ удаленного хоста. Существует веский аргумент в пользу запрета совместного использования самого домашнего каталога, чтобы предотвратить случайное совместное использование файлов, которые следует осторожно перемещать, например ~/.ssh и, конечно же, ~/.docker . Кроме того, клиенты могут совместно использовать каталоги в нескольких местах, но любые общие ресурсы, указывающие на одно и то же место назначения на удаленном компьютере, будут запрещены.

Полностью открытый для отзывов и изменений пользовательского интерфейса, это именно то, что я придумал до сих пор.

Драйверы

Существует огромное количество способов получить файлы из точки A в точку B и обратно, поэтому я бы предложил стандартный интерфейс, который драйверы должны реализовать, чтобы его можно было распознать как вариант для совместного использования (точно так же, как мы сделали с виртуализацией / облаком. платформы). По умолчанию будет что-то вроде scp (так как это так просто и довольно повсеместно), и пользователи также смогут указать его вручную. Пользователи могут выбрать драйвер, соответствующий их потребностям. Кроме того, это позволит команде machine начать с более простого ядра и двигаться дальше, например, просто rsync , scp и vboxsf могут быть вариантами в v1.0, а затем и другие драйверы могут быть добавлены.

Некоторые возможные драйверы: scp , vboxsf , fusionsf , rsync , sshfs , nfs , samba

Это было бы полезно, потому что разные варианты использования требуют разных способов перемещения файлов. NFS может хорошо работать для разработки на виртуальной машине, но вам может понадобиться rsync если вы часто отправляете большие файлы на сервер и так далее.

Частью интерфейса для общего драйвера может быть своего рода метод IsContractFulfilled() который возвращает логическое значение, указывающее, выполняется ли «контракт», необходимый для работы общего ресурса, как клиентом, так и удаленным хостом. Это позволит нам, например, проверить, установлен ли rsync на клиентском компьютере и удаленном хосте, и отказаться от создания общего ресурса, если это не так. Точно так же это предотвратит попытки пользователей сделать что-то глупое, например, использовать драйвер vboxsf на хосте, отличном от Virtualbox.

Возможные проблемы

  • Если machine переходит к модели клиент-сервер, которая кажется предпочтительной в данный момент, это вносит дополнительные сложности в реализацию machine share . А именно, machine share будет всей логикой на стороне клиента и не сможет делать те же предположения, которые может сделать сегодня, например, что все ключи SSH для хостов лежат повсюду и готовы к использованию на клиентском компьютере. .
  • machine share push и machine share pull имеют много смысла для некоторых драйверов, например rsync , но не так много смысла для vboxsf или nfs которые обновляются автоматически. Что происходит, когда пользователь делает machine share push на таком драйвере? "ERR: This driver is bidirectional" ?
  • Скорее всего, у него будет довольно большая область применения, поэтому мы могли бы рассмотреть возможность создания отдельного инструмента или введения какой-то модели для расширений, которые могли бы сохранить ядро ​​по-настоящему компактным.
  • Как обрабатываются символические ссылки? Разрешения? Что произойдет, если вы переместите, переименуете или удалите общий каталог на клиенте или удаленном компьютере?

    Прочие примечания

Я не привязан к предложению, я просто ищу обратную связь и хочу узнать, считает ли кто-нибудь это полезным. Я собрал код, который определяет предварительный интерфейс ShareDriver но он мне не очень нравится (и не реализована функция _real_ sync), поэтому я не поделился им.

kinenhancement

Все 68 Комментарий

@nathanleclaire спасибо за предложение - хорошо написано :)

Пара первоначальных мыслей: идея совместного использования, я думаю, имеет смысл для vbox (аналогично тому, что рекомендуется для fig), и мы уже делаем это для драйвера vbox. Однако, помимо этого, ИМО, они должны быть образами Docker. Я думаю, было бы удобно иметь возможность копировать файлы (возможно, machine scp или что-то в этом роде), но идея нажатия / синхронизации начинает входить в область управления системой, и я не уверен, что мы хотим туда идти .

Есть ли другие варианты использования, которые вы могли бы придумать, помимо кода приложения?

Чтобы было понятно, я не возражаю против этого, просто пытаюсь лучше понять использование :)

+1 за machine scp

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

Я полагаю, что эта проблема будет существовать для тех из нас, кто будет использовать эфемерные облачные демоны Docker точно так же, как и для демонов в стиле b2d.

так что я очень +1 к этому - так как это похоже на то, что я начал изучать в https://github.com/boot2docker/boot2docker-cli/pull/247

Возможно, местные драйверы могли бы реализовать для этого аргумент. Но у облачных провайдеров этого быть не должно.

scp и / или rsync были бы хороши, так же, как текущая машина ssh.

@sthulb , почему бы и нет? это будет частый вопрос, и поэтому он должен быть в документации (не так уж сложно представить себе оппортунистический rsync который может позволить серверу успешно работать, пока клиенты отсутствуют)

Локальные машины предназначены для сред разработки. Мне кажется, что удаленные (облачные) машины предназначены для производственных целей и, следовательно, их данные должны быть предоставлены с помощью контейнеров данных или с помощью chef / puppet / ansible / и т. Д.

Я понимаю, что требуется загрузить один файл на удаленный хост (различные секреты).

Я готов повлиять, если другие считают, что это то, что нам нужно.

Я должен согласиться с @sthulb. Я думаю, нам следует держаться подальше от синхронизации / совместного использования в удаленных средах. Я вижу, что это очень мощно для местных.

Я использую цифровой океан как среду разработки. У меня также есть 2 физических сервера boot2docker без vm, которые я использую для разработки и тестирования, где мой общий драйвер sshfs для b2d-cli очень полезен.

Возможно, дело в плагинах.

@sthulb, я думаю, это

+1 - если вы посмотрите на PR, который я сделал в репозитории b2d-cli, я скопировал модель драйвера, но запуск машины с плагинами будет лучше.

+1 для scp, и я согласен с приведенными выше комментариями, это предложение выглядит полезным для машин разработки (Vbox, fusion), но на других провайдерах я думаю, что это может очень быстро создать беспорядок.

+1 для scp (возможно sftp?)

+1 для локальных общих ресурсов виртуальных машин, NFS - переносимый вариант, если общие ресурсы для конкретных драйверов неудобны. Vagrant хорошо справляется с подобными вещами :) Я бы хотел увидеть это в этом проекте.

+1 для scp

Чтобы дать заинтересованным сторонам обновленную информацию о том, где я сейчас думаю с этим: я хотел бы создать команду machine scp которая просто предназначена для перемещения файлов из точки A в точку B в одну сторону через scp (Думаю, я хочу, чтобы для этого тоже был установлен флаг --delta , чтобы можно было использовать rsync вместо scp ).

Затем, для более сложного варианта использования, например NFS / Samba, будет отдельный (все еще docker-machine -центрический) инструмент полностью, поскольку объем управления им может стать довольно большим.

Я начинаю думать, что у нас должен быть интерфейс в стиле git, с исполняемыми файлами, запускающими docker-machine-foo, в этом случае foo будет общим.

Это было бы здорово для расширения машины.

Только что попробовал сегодня docker-machine v0.1.0 в первый раз. У меня есть рабочий процесс, включающий в себя живые обновления каталога хоста, которые распространяются на смонтированный том внутри контейнера. Для этого я использую стандартные аргументы CLI докера.

  • это отлично работает, если я использую docker-machine create -d virtualbox dev (неудивительно, поскольку это основано на работе boot2docker)
  • docker-machine create -d vmwarefusion dev приводит к монтированию пустого тома

Пока что я очень впечатлен докер-машиной. Модульные тесты моего проекта (те, которые не связаны с смонтированным томом) прошли так же, как и с boot2docker. Помимо этой проблемы, это был чрезвычайно плавный переход от boot2docker к docker-machine.

@jokeyrhyme проблема со слиянием известна и над ней работают. Спасибо за отличный отзыв!

+1 для scp

@jcheroske Сейчас он в мастерской !! https://github.com/docker/machine/pull/1140

Это невероятно. Вопрос новичка: есть ли бинарный файл osx последней и
величайший? В моем двоичном файле его еще нет. Я понял, копаясь
в каталоге .docker, как хранятся сертификаты. Затем я настроил свой
.ssh / config, чтобы я мог использовать обычные ssh и scp. Но имея его встроенным
гораздо лучше.

Во вторник, 19 мая 2015 г., в 13:05, Натан Леклер [email protected]
написал:

@jcheroske Сейчас он в мастерской !! # 1140

-
Ответьте на это письмо напрямую или просмотрите его на GitHub.

@jcheroske Вы всегда можете получить последние (основные) двоичные файлы отсюда: https://docker-machine-builds.evanhazlett.com/latest/ :)

Есть ли обновления по этому поводу?

Windows, rsync и проблемы с fswatch: чтобы уменьшить количество проблем, связанных с github, я прямо указываю:
https://github.com/boot2docker/boot2docker-cli/issues/66#issuecomment -120675231

Короче говоря, для серьезной разработки вам понадобится функционал inotify (или соответствующий ему) для работы. fswatch реализует https://github.com/thekid/inotify-win/ , но: thekid / inotify-win # 7

Я рвал волосы, пытаясь заставить тома работать с docker-compose (и docker-machine).

Моя цель - создать автоматический способ увеличения количества серверов веб-сайтов (для использования с горизонтальным масштабированием). Докер кажется хорошим инструментом для этого. Сначала я просто клонировал веб-код из github в Dockerfile, чтобы копии веб-кода жили в каждом образе / контейнере Docker. Казалось, это сработало нормально. Проблема заключалась в том, как загрузить обновления веб-кода, чтобы все веб-серверы обновлялись? Я мог бы перестроить образ докера, а затем повторно нажать его, но, как было указано в этом пункте, это очень медленно. Намного лучше просто смонтировать том с веб-кодом, чтобы изменения в веб-коде не требовали перестройки всего образа докера.

http://blog.ionic.io/docker-hot-code-deploys/

Итак, мой вопрос: возможно ли это даже с помощью docker-compose? Докер-машина тоже нужна?
Кажется, я столкнулся с этой проблемой: мне просто не удается смонтировать том.

http://stackoverflow.com/questions/30040708/how-to-mount-local-volumens-in-docker-machine

Если это неправильный вопрос / репозиторий git для этого вопроса, укажите мне правильное место.

Спасибо!

Проблема заключалась в том, как загрузить обновления веб-кода, чтобы все веб-серверы обновлялись? Я мог бы перестроить образ докера, а затем повторно нажать его, но, как было указано в этом пункте, это очень медленно.

Что ж, для продакшена монтирование вашего кода в том действительно не очень подходит. Повторное построение образа из кеша и отправка / извлечение из совместно размещенного частного реестра, хотя и не так быстро, как rsync, не должно быть так уж плохо. Монтирование тома с исходным кодом в контейнер опасно по разным причинам. У вас больше нет воспроизводимости вашей файловой системы, что является одной из самых надежных гарантий Docker, и вы открываете себя для целого класса головных болей, таких как проблемы с разрешениями (файлы принадлежат разным пользователям в контейнере и на хосте), проблемы с версией (какая версия приложения будет развернута снова?) и проблемы с безопасностью (если кто-то закроет файл на ваш том, он появится на хосте в дополнение к контейнеру).

Понятно, большое спасибо за быстрый и подробный ответ @nathanleclaire
Думаю, у меня такой вопрос: в чем смысл объемов? Только для разработки (непроизводственная)?
Ваши соображения имеют смысл, и у меня самого были те же мысли, когда я переходил от рабочего решения без объема к попытке добавить том - в некотором смысле добавление тома, казалось, в первую очередь противоречило цели Docker. Кажется, может, дело в этом?

В некотором смысле добавление объема, казалось, в первую очередь лишило Docker цели.

Во многих случаях да.

Есть три основных варианта использования томов:

  1. Чтение / запись в выбранную AUFS / файловую систему слишком медленно, например, для баз данных, поэтому вы можете обойти файловую систему CoW, указав -v /containerpath .
  2. Вы хотите обмениваться файлами между контейнером и хостом, например, для создания артефакта в контейнере и вывода его в файловую систему хоста или для совместного использования резервной копии / дампа базы данных.
  3. Совместное использование каталогов между контейнерами с помощью --volumes-from .

Многие люди используют тома в разработке для «горячей перезагрузки» кода, так как цикл сборки-перезапуска слишком длинный, и, возможно, это будет менее плохо, если вы запечете код прямо из CI => staging => production.

Понятно, спасибо @nathanleclaire
Я вернулся к тому, чтобы больше не использовать тома, и, похоже, все работает!

: +1:

+1

+1

+1

Об этом варианте использования:

  1. Хост машины - это виртуальная машина на портативном компьютере пользователя, и они разрабатывают веб-приложение внутри контейнера. Они хотят разрабатывать с привязкой исходного кода внутри контейнера, но все же редактировать на своем компьютере с помощью Sublime и т. Д.

Я думаю, что будет лучше (с точки зрения UX) просто исправить Machine для работы с томами, как ожидают пользователи - используйте тома, как будто нет Machine, просто хост (Win или Mac) и контейнеры. Хорошая ссылка на то, что люди ожидают, есть: boot2docker / boot2docker # 581

+1 к этому. Задумывались ли вы о таком двунаправленном инструменте, как унисон ?

Есть ли планы по выпуску этого ???

+2

ИМХО простого драйвера громкости, обсуждаемого в связанной проблеме, будет достаточно. С функциональной точки зрения нет необходимости в дополнительной команде: https://github.com/docker/docker/issues/18246

Возможно, немного сахара вокруг драйверов громкости докеров (скажем, выберите механизм, который подходит для ОС) находится на другой странице и может быть интересной функцией для модного словаря кикстарта с нулевым временем1234

Я определенно думаю, что будущее выглядит намного более оптимистичным для управления этим за пределами Machine, учитывая, что теперь доступны плагины Docker volume.

@nathanleclaire, а какие плагины, например?

Мне (просто?) Нужно смонтировать на моей докер-машине или контейнере папку, в которой находится Dockerfile. Как раз в разработке. Только на моих машинах для разработки (Windows, Mac OSX, Linux). Как?

В производстве Docker идеален.

Как этого добиться?

@ginolon Я использую Docker Compose для определения всего стека. У него также есть приятная функция - вы можете указать относительный путь в binging томах. (относительно docker-compose.yml)

@iBobik Вау! Как Бродяга? В самом деле?

@ginolon Я не знаю, как это работает в Vagrant, но в Compose это похоже
это:

web:
  image: php:7
  ports:
    - "8012:80"
  volumes:
    - ./web-sources:/var/www/html

Он будет привязан к каталогу веб-источников, который находится в том же месте, что и
это docker-compose.yml.

Ян Поборжил

2015-12-01 2:09 GMT-06: 00 ginolon [email protected] :

@iBobik https://github.com/iBobik Вау! Как Бродяга? В самом деле?

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/docker/machine/issues/179#issuecomment -160889549.

@iBobik Я пытаюсь то, что вы говорите. Оно работает. Но есть большое НО.

Если я помещаю в свою папку "веб-источники" файл (скажем, "test.rb") с некоторым текстом (например, "duigyjkgsdkg"), а затем запускаю

docker run -itP docker_web bash

Я нахожу папку с веб-исходниками, затем в ней запускаю

ruby test.rb

и он говорит мне:

test.rb:1:in `<main>': undefined local variable or method `duigyjkgsdkg' for main:Object (NameError)

Теперь я открываю свой SublimeText в Windows, изменяю файл test.rb следующим образом:

puts "Hello!"

но в bash в докере он не обновляет содержимое файла. Уже та же ошибка, что и раньше:

test.rb:1:in `<main>': undefined local variable or method `duigyjkgsdkg' for main:Object (NameError)

Как сделать?

Мне нужно использовать свой хост-компьютер для работы в разработке. Как это.

@ginolon Для его запуска необходимо использовать утилиту Docker Compose. Клиент докера
сам по себе не работает с docker-compose.yml.

Ян Поборжил

2015-12-01 3:30 GMT-06: 00 ginolon [email protected] :

@iBobik https://github.com/iBobik Я пытаюсь то, что вы говорите. Оно работает.
Но есть большое НО.

Если я помещу в свою папку "веб-источники" файл (скажем, "test.rb") с некоторыми
текст в нем (например: "duigyjkgsdkg"), а затем я запускаю

docker run -itP docker_web bash

Я нахожу папку с веб-исходниками, затем в ней запускаю

рубин test.rb

и он говорит мне:

test.rb: 1: в <main>': undefined local variable or method duigyjkgsdkg 'для main: Object (NameError)

Теперь я открываю свой SublimeText в Windows, изменяю файл test.rb следующим образом:

ставит "Привет!"

но в bash в докере он не обновляет содержимое файла. Уже то же самое
ошибка, как и раньше:

test.rb: 1: в <main>': undefined local variable or method duigyjkgsdkg 'для main: Object (NameError)

Как сделать?

Мне нужно использовать свой хост-компьютер для работы в разработке. Как это.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/docker/machine/issues/179#issuecomment -160907767.

@iBobik как начать с docker-compose?

Если я напишу:

docker-compose run web bash

он говорит мне:

docker-compose run web bash
ERROR: Interactive mode is not yet supported on Windows.
Please pass the -d flag when using `docker-compose run`.

Докер такой беспорядок. Я думаю, это не хорошо, как кажется.

Мы не на форуме поддержки Docker Compose, поэтому, пожалуйста, не обсуждайте это там. Люди подписаны на этот выпуск из-за другой темы.

Прочтите руководство по Docker Compose на docker.com. Это отличная утилита, вы просто неправильно ее используете.


    1. 2015, версия 4:36, ginolon [email protected] :

Докер такой беспорядок. Я думаю, это не хорошо, как кажется.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub https://github.com/docker/machine/issues/179#issuecomment -160929345.

+1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1

текущее совместное использование виртуальных ящиков ограничено по производительности и имеет проблемы с разрешениями для некоторых контейнеров (например, postgresql)

+1

+1

так что решение в чем? что мне делать на моем Mac? ヽ (゜ Q。) ノ?

Пожалуйста, пишите только конструктивные комментарии. Нет «+1», потому что отправлено
всем подписчикам, и они отпишутся, если будет слишком много.

Если вы хотите поддержать этот выпуск, просто подпишитесь на него.

Ян Поборжил

2016-01-11 5:03 GMT + 01: 00 daben1990 [email protected] :

+ 1 + 1 + 1 , так долго ждали.

-
Ответьте на это письмо напрямую или просмотрите его на GitHub
https://github.com/docker/machine/issues/179#issuecomment -170426671.

Выполнение этой команды отлично подходит для копирования между машинами разработки в одной сети:

rsync -chavzP --stats other-computer.local:~/.docker/machine/ ~/.docker/machine/ --exclude machines/default --exclude cache

+1

Наконец, я нашел правильную проблему, @nathanleclaire, я бы поспорил, что https://github.com/gondor/docker-volume-netshare, немедленно решат проблему. Однако их нужно будет легко интегрировать в boot2docker. Возможно ли это?

Я думаю, что https://github.com/docker/docker/pull/20262 может стать началом окончательного ответа на этот вопрос.
С этим PR в 1.11 совместное использование стало вопросом выставления правильных общих ресурсов nfs / samba на хостах. Или github.com/docker/docker/pkg/mount еще не поддерживает nfs / samba?

Я использую что-то в этой строке для синхронизации:

fswatch -o -e '.git' . | while read num ; \
do \
     rsync -avzh -e "ssh -i /path/to/home/.docker/machine/machines/machine-name/id_rsa" --progress --exclude '.git' . ubuntu@$(docker-machine ip machine-name):/home/ubuntu; \
done

изменить: опечатка

Очень заинтересован в этой функции, подписавшись на уведомления.

IMO - исходя из потока, кажется, что самая простая и полезная реализация - это использовать стандартные драйверы в образе для создания монтирования томов только локально, а не реализовывать эту функцию удаленно (если вы - вы вроде как делаете это неправильно, правда?).

Для меня ценность будет заключаться в локальной, оперативной разработке содержимого в контейнере без участия каких-либо шагов sftp / scp / rsync (или сценариев, подобных тому, который настроил MBuffenoir)

Тоже самое. Это необходимая вещь.

@ in10se извините, но Docker Machine кажется мертвым продуктом. Развитие и инновации застопорились, и я бы не стал рассчитывать на них в производственной среде. Я думаю, что Hashicorp Terraform или аналогичные инструменты - это то, что вам нужно.

@erkie ,

Каково состояние этого предложения?

Здесь мало что происходит.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги