Quale sarebbe un buon flusso di lavoro Docker WebDev?


121

Ho la sensazione che docker potrebbe migliorare notevolmente il mio flusso di lavoro webdev, ma non sono riuscito a capire come affrontare un progetto aggiungendo docker allo stack.

Lo stack del software di base sarebbe simile a questo:

Software

  • Immagini Docker che forniscono stack LAMP personalizzato

    • Apache con diversi moduli
    • MYSQL
    • PHP
    • Alcuni CMS, ad esempio Silverstripe
  • IDIOTA

Flusso di lavoro

Potrei immaginare che il flusso di lavoro assomigli in qualche modo al seguente:

Sviluppo

  1. Scrivi un Dockerfileche definisce un contenitore LAMP che soddisfa i requisiti sopra indicati
    • REQ: La macchina dovrebbe avviare apache / mysql subito dopo l'avvio
  2. Costruisci l'immagine docker
  3. Copiare i file richiesti per eseguire il CMS ad es ~/dev/cmsdir
    • Metti ~/dev/cmsdir/sotto controllo della versione
  4. Eseguire il contenitore finestra mobile, e in qualche modo montare ~/dev/cmsdira /var/www/sul contenitore
  5. Popolare il database
  6. Lavora /dev/cmsdir/
  7. Eseguire il commit e l'arresto del container docker

Distribuzione

  1. Configura host remoto (ad es. Con ansible)
  2. Invia l'immagine del contenitore all'host remoto
  3. Recupera cmsdir-project tramite git
  4. Esegui il container docker, inserisci il database e monta cmsdirin/var/www

Ora, sembra tutto abbastanza carino sulla carta, MA non sono del tutto sicuro se questo sarebbe l'approccio giusto.

Domande:

  1. Durante lo sviluppo in locale, come faccio a mantenere il database tra i riavvii dell'istanza del contenitore? O dovrei eseguire sql-dump ogni volta prima di eseguire lo spin down del contenitore?

  2. Devo avere istanze di container separate per il db e il server Apache? O sarebbe sufficiente avere un unico contenitore per il caso d'uso sopra?

  3. Se si utilizzano contenitori separati per database e server, come è possibile automatizzare la rotazione su e giù allo stesso tempo?

  4. Come potrei effettivamente montare /dev/cmsdir/nella /var/www/directory dei contenitori ? Dovrei utilizzare i volumi di dati per questo?

  5. Mi sono perso qualche trappola? Qualcosa che potrebbe essere semplificato?


1
Questa domanda sembra interessare parecchie persone. Qualcuno sembra aver scritto recentemente una serie di post sul blog sull'argomento. Dal momento che non è finita fin d'ora, vi posterò il link in questo commento: project-webdev.blogspot.de/2015/05/...
jottr

Risposte:


46
  1. Se hai bisogno della persistenza del database indipendentemente dal tuo contenitore CMS, puoi utilizzare un contenitore per MySQL e un contenitore per il tuo CMS. In tal caso, puoi avere il tuo contenitore MySQL ancora in esecuzione e ridistribuire il tuo CMS tutte le volte che vuoi in modo indipendente.

    Per lo sviluppo, un'altra opzione è mappare le directory di dati mysql dal computer host / di sviluppo utilizzando i volumi di dati. In questo modo puoi gestire i file di dati per mysql (nella finestra mobile) usando git (sull'host) e "ricaricare" lo stato iniziale ogni volta che vuoi (prima di avviare il contenitore mysql).

  2. Sì, penso che dovresti avere un contenitore separato per db.

  3. Sto usando solo uno script di base:

    #!/bin/bash
    
    $JOB1 = (docker run ... /usr/sbin/mysqld)
    $JOB2 = (docker run ... /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2
    
  4. Sì, puoi utilizzare l'opzione data-volumi -v. Lo userei per lo sviluppo. Puoi utilizzare il montaggio in sola lettura, quindi non verranno apportate modifiche a questa directory se lo desideri (la tua app dovrebbe comunque memorizzare i dati da qualche altra parte).

    docker run -v=/home/user/dev/cmsdir:/var/www/cmsdir:ro image /usr/sbin/apache2
    

    Ad ogni modo, per la distribuzione finale, creerei un'immagine utilizzando dockerfile con ADD /home/user/dev/cmsdir /var/www/cmsdir

  5. Non lo so :-)


6
ho scritto un tutorial sulla scrittura di un contenitore mysql che implementa ciò di cui stai parlando in # 1 txt.fliglio.com/2013/11/creating-a-mysql-docker-container
ben schwartz

48
Ci devono essere sicuramente più tutorial / best practice su questo processo. :(
Reza S

Questo tutorial potrebbe darti qualche direzione ..
Pithikos

Se desideri estrarre codice da Github in Docker, questo link suggerisce chiavi SSH di sola lettura (quindi l'immagine Docker può essere elencata pubblicamente) slash-dev-blog.me/docker-git.html
jhtong

4
@RoyTruelove a partire dal 2015, fig è ora deprecato a favore di docker-compose
allan.simon


4

Capisco che questo post abbia più di un anno in questo momento, ma recentemente mi sono posto domande molto simili e ho molte ottime risposte alle tue domande.

  1. Puoi configurare un'istanza docker MySQL e fare in modo che i dati persistano su un contenitore di dati senza stato, ovvero il contenitore di dati non deve essere attivamente in esecuzione

  2. Sì, consiglierei di avere un'istanza separata per il tuo server web e database. Questo è il potere di Docker.

  3. Dai un'occhiata a questo repo che ho costruito. Fondamentalmente è semplice come make build& make rune puoi avere un server web e un contenitore di database in esecuzione localmente.

  4. Si utilizza l' -vargomento quando si esegue il contenitore per la prima volta, questo collegherà una cartella specifica sul contenitore all'host che esegue il contenitore.

  5. Penso che le tue idee siano fantastiche ed è attualmente possibile ottenere tutto ciò che chiedi.

Ecco una soluzione chiavi in ​​mano che soddisfa tutte le esigenze che hai elencato.


1

Ho messo insieme una configurazione di composizione docker facile da usare che dovrebbe corrispondere ai requisiti del flusso di lavoro di sviluppo.

https://github.com/ehyland/docker-silverstripe-dev

Caratteristiche principali

  • DB persistente
  • La tua scelta di HHVM+ NGINXo Apache2+PHP5
  • Eseguire il debug e impostare i punti di interruzione con xDebug

Il file README.md dovrebbe essere abbastanza chiaro per iniziare.

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.