Qual è il modo giusto per configurare un ambiente di sviluppo su OS X con Docker?


94

Intro

Non riesco a trovare un buon modo per configurare un ambiente di sviluppo su OS X utilizzando Docker e Boot2Docker. Il problema che sto riscontrando è come gestire il codice sorgente in modo che:

  1. Posso modificare il codice su OS X utilizzando gli strumenti (editor di testo, IDE, git, ecc.) Che ho già installato.
  2. Tali modifiche si riflettono nel contenitore Docker, quindi se riesco a eseguire i test o aggiorno una pagina Web, posso vedere immediatamente le mie modifiche.

In teoria, questo dovrebbe essere facile da fare montando il mio codice sorgente come volume:

docker run -it -v /path/to/my/source/code:/src some-docker-image

Sfortunatamente, questo ha due problemi principali che lo rendono completamente inutilizzabile su OS X:

Problema n. 1: i volumi montati su VirtualBox (che utilizzano vboxsf) sono estremamente lenti

Ad esempio, ecco quanto tempo impiega Jekyll per compilare la mia homepage se il codice sorgente fa parte dell'immagine 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

Ecco la stessa identica immagine Docker, tranne che questa volta, monto il codice sorgente da 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

Problema n. 2: la visualizzazione dei file è interrotta

I meccanismi di controllo predefiniti in SBT, Jekyll e grunt utilizzano tecnologie come inotify, che non funzionano se sono in esecuzione in un contenitore Docker e le modifiche vengono apportate in OS X a una cartella montata.

Soluzioni alternative che ho provato

Ho cercato soluzioni (comprese tutte quelle su SO) e ne ho provate alcune, ma non ne ho trovata una di successo:

  1. Ho cambiato Boot2Docker per utilizzare NFS , ma è stato altrettanto lento.
  2. Ho provato Vagrant + NFS , e anche questo è stato altrettanto lento.
  3. Ho provato una montatura Samba , ma la cartella è sempre risultata vuota nel contenitore Docker.
  4. Ho provato a utilizzare il file system Unison , che ha funzionato brevemente per sincronizzare i file, ma poi ha continuato a mostrare errori di connessione .
  5. Ho abilitato il polling in Jekyll , ma ciò ha aumentato significativamente il ritardo fino a quando le mie modifiche non sono state raccolte.
  6. Ho provato Dinghy , un "Docker più veloce e più amichevole su OS X con Vagrant" e ho ottenuto qualche miglioramento. Invece di essere 10-15 volte più lenta, la compilazione Jekyll era 2-3 volte più lenta. È meglio, ma ancora non del tutto utilizzabile.

Qualcuno ha trovato una soluzione che funziona davvero e ti consente di sviluppare codice in modo produttivo con Docker e OS X?

Aggiornamento: finalmente una soluzione!

Finalmente ho trovato una soluzione che sembra produttiva utilizzando Boot2Docker + rsync. Ho catturato i dettagli su come impostarlo nella mia risposta e in un progetto open source chiamato docker-osx-dev .


Hai provato il programma di installazione Docker ufficiale per OS X insieme a NFS? Per quanto ne so, questo non è un problema limitato a Docker su OS X ma anche allo sviluppo basato su Vagrant su OS X con codebase più grandi ( abbiamo un problema simile ma con Vagrant ). Ho scoperto che NFS è l'unica soluzione praticabile e accettabile.
James Mills

@ JamesMills: ho seguito le istruzioni ufficiali per installare Docker e Boot2Docker. Esistono istruzioni ufficiali per configurare NFS? Li ho trovati solo in una sintesi di GitHub e, dopo averli usati, non sembravano più veloci. Come hai configurato NFS?
Yevgeniy Brikman


6
Il modo giusto per lavorare con Docker è eseguire Linux in modo nativo anziché OS X oppure eseguire tutto il lavoro di sviluppo all'interno di una VM Linux. L'integrazione "boot2docker" è un brutto trucco che non fa altro che seminare confusione e delusione.
Larsks

7
@larsks: non è utile.
Yevgeniy Brikman

Risposte:


46

Ho deciso di aggiungere la mia risposta con la migliore soluzione che ho trovato finora. Lo aggiornerò se trovo opzioni migliori.

La migliore soluzione finora

La migliore soluzione che ho trovato per configurare un ambiente di sviluppo produttivo con Docker su OS X è: Boot2Docker + Rsync . Con rsync, i tempi di compilazione in un container Docker sono alla pari con l'esecuzione della compilazione direttamente su OSX! Inoltre, il codice del file watcher lo fa non necessita di polling ( inotifyfunziona poiché rsync utilizza cartelle normali), quindi il ricaricamento a caldo è quasi altrettanto veloce.

Ci sono due modi per configurarlo: un'installazione automatica e un'installazione manuale.

Installazione automatizzata

Ho raggruppato tutti i passaggi per configurare Boot2Docker con Rsync in un progetto open source chiamato docker-osx-dev . Il codice è un po 'approssimativo, ma l'ho usato con successo per diverse settimane per passare facilmente tra 3 progetti con 3 diversi stack tecnologici. Provalo, segnala bug e invia alcune PR! Inoltre, vedi il mio post sul blog, Un ambiente di sviluppo produttivo con Docker su OS X per maggiori informazioni.

Configurazione manuale

  1. Installa Boot2Docker :brew install boot2docker .
  2. Esegui Boot2Docker, ma con le cartelle condivise di VirtualBox disabilitate: boot2docker init && boot2docker start --vbox-share=disable .
  3. Esegui boot2docker shellinite copia le variabili di ambiente che stampa nel tuo file~/.bash_profile file.
  4. Installa rsync sulla VM Boot2Docker: boot2docker ssh "tce-load -wi rsync" .
  5. Crea le cartelle di base necessarie sulla VM Boot2Docker e imposta correttamente le autorizzazioni per esse. Ad esempio, se sincronizzerai la /foo/barcartella da OS X, devi creare/foo/bar sulla VM Boot2Docker:boot2docker ssh "mkdir -p /foo/bar && chown -R docker /foo/bar" .
  6. Eseguire rsync per sincronizzare i file sul Boot2Docker VM: rsync --archive --rsh="ssh -i $HOME/.ssh/id_boot2docker -o StrictHostKeyChecking=no" /foo/bar docker@dockerhost:/foo. Controlla la documentazione di rsync per le varie impostazioni che potresti voler abilitare, come l'utilizzo --exclude .gitper escludere il file.git cartella durante la sincronizzazione.
  7. Utilizza un file watcher per mantenere i file sincronizzati. Ad esempio, potresti usare fswatch (brew install fswatch ) in rsync.
  8. A questo punto, dovresti essere in grado di utilizzare docker runper avviare il contenitore Docker e utilizzare il -vflag per montare la cartella che stai sincronizzando:docker run -v /foo/bar:/src some-docker-image .
  9. Aggiorna il codice su OS X come al solito. Le modifiche dovrebbero propagarsi molto rapidamente usando rsync, il normale codice del file watcher dovrebbe raccogliere le modifiche come al solito (cioè, usandoinotify ) e la compilazione dovrebbe essere eseguita velocemente perché tutti i file sono "locali" nel contenitore.
  10. Se è necessario testare un sito Web in esecuzione, eseguire il boot2docker ipcomando per scoprire su quale IP si trova.

Grazie per la condivisione! Quando dicono che rsync è "unidirezionale", significa che non posso utilizzare il file system OS X per condividere file tra due contenitori? Esempio: il contenitore 1 controlla i file sorgente e compila un binario, il contenitore 2 viene utilizzato per eseguire il binario compilato (usando Haskell in questo esempio).
Nicolas Hery

1
@NicolasHery: La mia comprensione è che rsync copierà le modifiche da OS X al contenitore Docker, ma non il contrario. Pertanto, tutti i file generati dal contenitore Docker (ad esempio un binario compilato) non saranno visibili in OS X. Tuttavia, se tali file vengono generati in una cartella contrassegnata come a VOLUME, è possibile concedere a un altro contenitore l'accesso a quel volume utilizzando il --volumes-frombandiera. Non l'ho ancora provato, ma sospetto che funzionerebbe.
Yevgeniy Brikman

1
Bella risposta. Potresti creare un driver per docker-machine ( github.com/docker/machine ) che esegue la maggior parte del boilerplate per te.
dom

1
@dom: mi piace l'idea, ma sai come creare un driver per docker-machine? Una richiesta pull nel repository è l'unico modo o è possibile creare un driver esternamente?
Yevgeniy Brikman

1
Questo tutorial è ancora valido per una nuova versione 1.9.1 su Windows? Posso usarlo o forse Docker aveva già una nuova soluzione per questo "problema"?

18

Aggiornamento : ora che la finestra mobile per Mac è in beta con funzionalità non di hacking, seguire quella strada potrebbe essere molto più ragionevole per lo sviluppo locale senza un saggio di hack e soluzioni alternative.

Non farlo . So che non è la risposta che probabilmente speri, ma prendi una valutazione onesta del costo / beneficio del tentativo di ottenere codice sorgente locale + esecuzione dockerizzata rispetto allo sviluppo locale su OSX.

Ad un certo punto tutti i problemi, lo sforzo di installazione e i punti deboli operativi POSSONO essere risolti abbastanza bene, ma al momento la mia opinione su questo è una perdita netta.

Problema n. 1: i volumi montati su Virtual Box (che utilizzano vboxfs) sono estremamente lenti

Aspetta un po 'e quasi sicuramente migliorerà.

Problema n. 2: la visualizzazione dei file è interrotta

Non sono sicuro che una soluzione per questo sia nel prossimo futuro. Se questo tipo di funzionalità è fondamentale per il tuo flusso di lavoro di sviluppo, lo considererei un problema. Non vale la pena fare un grande sforzo di ricerca e sviluppo rispetto al solo utilizzo di rbenv / bundler per gestire le installazioni di jekyll / ruby ​​e eseguirle localmente su OSX come la gente ha fatto con successo negli ultimi dieci anni +.

Proprio come "il cloud" non ha alcun coinvolgimento nella mia configurazione di sviluppo locale, al momento, docker è una vittoria per test / staging / distribuzione e per l'esecuzione di database e altri componenti di terze parti, ma le applicazioni che sto codificando vengono eseguite direttamente su OSX.


1
Sono d'accordo con questo. Sviluppiamo su OSX ed eseguiamo le app direttamente all'interno del sistema (con ricarica live ecc.). Quindi, una volta completata l'app, la dockerizziamo per il test, lo staging e la produzione.
ItalyPaleAle

4
Hm, è un po 'deludente. Ho sempre avuto la parità nei miei ambienti di messa in scena / produzione. È lo sviluppo che è sempre stato il valore anomalo, dato che codice su OS X. La documentazione di Docker ha sicuramente fatto sembrare che questo fosse un problema risolto. Darò un altro giorno di sforzi e vedrò se riesco a far funzionare qualcosa.
Yevgeniy Brikman

Senti ancora questa risposta valida oggi, Peter? Solo pochi mesi dopo, ma dato il progetto di @ Yevgeniy e solo 2 problemi ora risolti, forse il rapporto costi / benefici ora vale già la pena! Non è vero?
cregox

1
È una questione di preferenze personali. Continuo a non scherzare con questo a causa dell'enorme quantità di progetti in cui salto come consulente. Se fossi un full-timer che lavorasse principalmente sullo stesso progetto per settimane / mesi, potrebbe valere la pena impostare la roba rsync / fswatch.
Peter Lyons

Docker Toolbox è il modo giusto per farlo al giorno d'oggi perché se usi homebrew o un altro gestore di pacchetti, le versioni dello strumento docker non saranno sincronizzate, a meno che non seguano il controllo delle versioni come casella degli strumenti docker.
taco

12

Docker per Mac e Windows sarà il modo definitivo di sviluppare con Docker su OS X (e Windows). Un prodotto Docker, il software è un "ambiente integrato e facile da distribuire per la creazione, l'assemblaggio e la spedizione di applicazioni da Mac o Windows". Si propone di essere in grado di risolvere i problemi presentati dal PO. Dal suo annuncio del 24 marzo 2016 :

  • Più veloce e più affidabile: niente più VirtualBox! Il motore Docker è in esecuzione in una distribuzione Linux Alpine su una macchina virtuale xhyve su Mac OS X o su una VM Hyper-V su Windows e quella VM è gestita dall'applicazione Docker. Non è necessario docker-machine per eseguire Docker per Mac e Windows.
  • Integrazione degli strumenti: Docker per Mac è un'applicazione Mac e Docker per Windows è un'applicazione Windows, che include un'interfaccia utente nativa e funzionalità di aggiornamento automatico. Il set di strumenti Docker viene fornito in bundle con esso: riga di comando Docker, Docker Compose e riga di comando Docker Notary.
  • Montaggio del volume per il codice e i dati: l'accesso ai dati del volume funziona correttamente, comprese le notifiche di modifica dei file (su Mac inotify ora funziona perfettamente all'interno dei contenitori per le directory montate sul volume). Ciò consente di modificare / testare i cicli per lo sviluppo "in container".
  • Facile accesso ai contenitori in esecuzione sulla rete host locale: Docker per Mac e Windows include un server DNS per i contenitori e sono integrati con il sistema di rete Mac OS X e Windows. Su un Mac, Docker può essere utilizzato anche se connesso a una VPN aziendale molto restrittiva.
  • Docker per Mac è stato progettato da zero per essere in grado di adattarsi al modello di sicurezza sandbox di OS X e stiamo lavorando a stretto contatto con Apple per raggiungere questo obiettivo.

L'ho visto solo l'altro giorno e sembra di gran lunga la soluzione più promettente. Sono molto entusiasta di provarlo una volta che uscirà dalla beta e, se funziona bene, la cambierò per essere la risposta ufficialmente accettata.
Yevgeniy Brikman

4
Sfortunatamente l'attuale versione Beta (1.11.0-beta7) sembra essere lenta quanto gli altri metodi, quindi potrebbe volerci un po 'prima che sia possibile utilizzare forums.docker.com/t/…
walterra

3

Dichiarazione di non responsabilità: potrei essere di parte, poiché sono l'autore di docker-sync.

Probabilmente ho provato tutte le soluzioni qui nominate, incluse alcune altre (vedere la compersione https://github.com/EugenMayer/docker-sync/wiki/Alternatives-to-docker-sync ), ma fondamentalmente hanno fallito sul lato di prestazioni (la maggior parte di esse) o sulla docker-machine (o nessuna) utilizzata / applicata.

http://docker-sync.io è stato creato per unire tutte le soluzioni e fornire le migliori strategie (implementandone diverse, puoi scegliere).

Può essere utilizzato con rsync (sincronizzazione a 1 via) comprese le correzioni di autorizzazioni per gli utenti e con unisono (sincronizzazione a 2 vie). Non ti obbliga a entrare nella finestra mobile o in un hypervisor specifico, né richiede di avere una finestra mobile per Mac. Funziona con tutti loro.

Le prestazioni EugenMayer / docker-sync / wiki / 4.-Performance non sono influenzate, è come se non avessi alcuna condivisione.

docker-sync e i suoi change-watcher sono ottimizzati e funzionano con progetti con file 12k senza problemi.

Fai un tentativo, se vuoi, mi piacerebbe ricevere feedback!


2

Ti capisco! Penso di aver provato praticamente tutto ciò che hai provato e purtroppo è stato ancora lento. Poi mi sono imbattuto in questo commento https://github.com/boot2docker/boot2docker/issues/64#issuecomment-70689254 che suggerisce di usare Vagrant e Parallels e invece di Virtualbox. Questo mi ha permesso di utilizzare nfs e ho effettivamente visto un grande aumento delle prestazioni per il mio progetto (Drupal).

Ecco il file Vagrant. Tutto quello che devi fare è installare vagrant, copiarlo in un file chiamato Vagrantfile e metterlo in una cartella. Vai in quella cartella e fai semplicemente un al vagrant upposto del tuo normale 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

Presumo che questo richieda un'installazione parallela?
Yevgeniy Brikman

2

Sto anche usando Vagrant con paralleli e boot2docker ( https://github.com/Parallels/boot2docker-vagrant-box ). Lo sviluppo non è mai stato così facile per me. Funziona davvero bene con docker-composeconfigurazioni di grandi dimensioni. Non sento davvero un ritardo o un enorme consumo di risorse.

Questo è il mio Vagrantfileaspetto:

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

Sto sviluppando in un OS X (metà 2011 Macbook Air) + Boot2Docker + ambiente Docker-compose da alcune settimane. Non ho riscontrato grossi problemi di prestazioni ma evito di eseguire qualsiasi tipo di build durante lo sviluppo (perché non usare qualcosa di simile jekyll serve --skip-initial-build?). Ecco un docker-compose.ymlfile di esempio che sto usando:

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

A volte uso NFS ( http://syskall.com/using-boot2docker-using-nfs-instead-of-vboxsf/ ) ma non ho notato una grande differenza di prestazioni quando lo faccio.

Per me la comodità di un semplice docker-compose up test per far funzionare il mio ambiente ha valso il costo in termini di prestazioni (lavoro regolarmente su più progetti con stack diversi).

PS: nodemonè uno dei pochi file watcher che funzionano con vboxsf (vedi https://github.com/remy/nodemon/issues/419 ).


Anche se salto la build iniziale con Jekyll, ogni volta che cambio un file, dovrà essere ricostruito, il che richiede comunque nell'ordine di 1-3 minuti se il codice sorgente è montato. Ciò rende impossibile eseguire qualsiasi tipo di sviluppo dello stile di modifica e ricarica.
Yevgeniy Brikman

@YevgeniyBrikman Oh, non ne ero a conoscenza :( Immagino che l'ultima opzione sarebbe quella di avere il tuo codice nella VM boot2docker e montarlo sulla tua macchina host usando sshfs. Altrimenti, immagino che dovrai aspettare per migliori prestazioni della cartella montata per utilizzare Docker come ambiente di sviluppo.
Olivier Lalonde



-4

Questo metodo è l'ultimo (settembre 2015) e il modo più semplice per ottenere la configurazione di Docker su Mac: link qui:

Installa Docker usando il link Docker Toolbox alle istruzioni qui:

È un pacchetto completo di installazione Docker, che include i seguenti strumenti Docker:

Docker Machine per eseguire il file binario docker-machine

Docker Engine per l'esecuzione del file binario docker

Docker Compose per eseguire il file binario docker-compose

Kitematic, la Docker GUI, una shell preconfigurata per un ambiente a riga di comando Docker

Oracle VM VirtualBox

inserisci qui la descrizione dell'immagine

Cosa c'è nella cassetta degli attrezzi:

  • Client Docker
  • Docker Machine
  • Docker Compose (solo Mac)
  • Docker Kitematic
  • VirtualBox

3
Sì ma purtroppo non ha risolto il problema originariamente presentato.
Nick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.