2016-01-01 16 views
6

ho iniziato a studiare Docker oggi e sono stato in grado di creare la mia immagine prima personalizzato con un Python pila sulla base di ubuntu:14.04 dopo un paio d'ore, sperimentando sia Dockerfile accumulo e modificando un'immagine esistente e salvarla usando il comando commit.flusso di lavoro adeguata per lo sviluppo web con Docker

mio Dockerfile è il seguente:

FROM ubuntu:14.04 
MAINTAINER Davide Zanotti <***@gmail.com> 
ENV DEBIAN_FRONTEND noninteractive 
RUN apt-get update && apt-get install -y \ 
     software-properties-common \ 
     build-essential \ 
     automake \ 
     checkinstall \ 
     git \ 
    && add-apt-repository -y ppa:fkrull/deadsnakes && apt-get update && apt-get install -y python3.5 \ 
    && cd /usr/bin && ln -s python3.5 python \ 
    && apt-get clean && rm -rf /var/lib/apt/lists/* 

Fin qui tutto bene, ma ora mi chiedo, che dovrebbe essere il flusso di lavoro adeguato per lo sviluppo web utilizzando Docker!

ho provato l'applicazione di esempio costruita da Docker utilizzando Flask (docker hub, git source), ma hanno diverse preoccupazioni riguardo ... l'applicazione è fornito direttamente nella finestra mobile contenitore e IMO non è un approccio fattibile (almeno durante lo sviluppo!), perché ogni volta che modifico il codice dell'app devo ricostruire l'intero contenitore (giusto?).

Quello che mi piacerebbe ottenere è invece un contenitore di base, con una specifica installazione python e tutte le librerie di terze parti di cui la mia app ha bisogno (come i driver di database e così via), e in questo contenitore la mia app è stata iniettata dinamicamente (idealmente tramite git una volta implementato, ma forse in modo alternativo quando si sviluppa localmente per velocizzare le cose).

Quindi qual è il modo corretto di (o ... come si) approccio allo sviluppo web utilizzando Docker? (Non ho trovato nulla di utile riguardo questo argomento nella documentazione ufficiale e gli articoli online sembrano troppo IMO di base ... Mi piacerebbe sentire esempi reali di persone che sono in realtà utilizzando Docker per le loro app! : P)

+0

ho cancellato, perché io sono un idiota e ho semplicemente invertito utente/password, nel file di configurazione ... la mia messa a punto era giusto e ora funziona bene ... solo un manichino di supervisione: D – daveoncode

risposta

2

Ti propongo alcune cose riguardanti la tua domanda.

Nel tuo caso, è possibile utilizzare due opzioni:

  1. Sì, dovrete ricostruire l'intero contenitore. Per essere più corretto, dovrai ricostruire un'immagine, che viene utilizzata per l'avvio del contenitore. Ma Docker ti permette di ricostruire un'immagine in modo incrementale, usando livelli, che sono come fette che si trovano uno contro uno. Ciò consente di utilizzare meno spazio su disco e questa operazione richiederà meno tempo (poiché solo NUOVE modifiche vengono aggiunte all'immagine).

Pro: La tua immagine sarà completamente Disponibile per la spedizione - si può prepararlo ed utilizzarlo ovunque - tutto ciò che serve è in bundle all'interno.

Contro: Sì, è necessario ricostruire il contenitore. Nel caso di un processo di sviluppo attivo che potrebbe non essere così comodo e flessibile per te.

  1. È possibile montare le directory condivise dal computer host.Posso consigliarti di leggere questo guide, ma ti descriverò brevemente come funziona: le tue directory locali (con il tuo codice ad esempio), saranno "visibili" all'interno del tuo contenitore. L'applicazione, che dovrebbe usare quel codice, funzionerà come con un codice "locale", quindi non sarà necessario ricostruire il contenitore dopo ogni cambio di codice.

Pro: Sì, accelera il processo di sviluppo - si può verificare il codice immediatamente nel vostro contenitore.

Contro: Questa non è una soluzione portatile, spedibile e universale. Se utilizzi quel contenitore su più di un host (ad esempio, hai un flusso con Dev -> Staging -> Ambienti di produzione), non avrai la possibilità di utilizzare semplicemente lo stesso contenitore in bundle su questi host - dovrai anche consegnare il codice su quei nodi, che dovrebbero essere usati all'interno del contenitore.

Andando a riepilogare le cose, descritte sopra, è possibile utilizzare i contenitori Docker in un caso classico ("raggruppato") se si hanno le applicazioni stateless - se si intende implementare eventuali modifiche statiche in esso - si ricostruire l'immagine di origine e riavviare il contenitore.

Se desideri eseguire alcune applicazioni stateful o desideri memorizzare alcuni dati utilizzando i contenitori Docker (non dimenticare che non è possibile memorizzare alcun dato in un contenitore stesso: potrebbe essere eliminato e riavviato in qualsiasi momento, e il suo stato verrà ripristinato allo stato originale dell'immagine!), è possibile utilizzare i volumi condivisi in Docker o in questo caso è necessario rifiutare l'utilizzo di Docker.

Docker non è un proiettile argentato: è molto utile in molti casi, ma ci sono molti altri casi in cui è possibile utilizzare altre tecnologie più convenienti.

PS. Un campione di flusso, che ho utilizzato in uno dei miei progetti precedenti, in cui abbiamo dovuto creare un'applicazione complessa basata sul web con load balancer, frontend, backend e applicazioni di database. Non abbiamo usato i volumi condivisi di Docker - i tuoi sviluppatori hanno scritto il codice, l'hanno impegnato su Git repo, Jenkins lo ha catturato e ha creato una nuova immagine, che è stata assegnata al nostro self-hosted Docker Registry. Queste immagini sono state contrassegnate da etichette diverse, a seconda dell'ambiente, dove devono essere utilizzate (dev, stage, prod) e sono state distribuite sul "loro" ambiente dal sistema di gestione della configurazione.

PSS. Per l'intero flusso, potrei anche consigliarti di utilizzare alcuni strumenti di gestione dei container come Kubernetes, anziché l'uso puro Docker. Kubernetes ti fornirà la possibilità di gestire la tua rete inter-container, distribuire contenitori in più ambienti e/o con più providers, bilanciare il carico delle applicazioni basate su container, ecc.

+1

grazie mille per la risposta! :) – daveoncode

0

Per la creazione di applicazioni Python Flask con Docker, potrebbe voler controllare questo, ho creato un'immagine Docker pubblica (e open source) con tutti i campanelli e i fischietti che è possibile utilizzare per costruire un'applicazione web Python Flask.

E alla fine della pagina principale di quell'immagine Docker ho anche scritto un paio di trucchi eleganti che uso per lo sviluppo, consentendo ad esempio il debug e il ricaricamento live senza dover ricostruire l'immagine Docker completa, come se foste lavorando localmente.

Ha uWSGI per l'esecuzione dell'applicazione, Nginx per servire HTTP e Supervisord per controllarli, quindi non devi imparare come installare e configurare tutti quelli per costruire la tua app web Python Flask.

Sembra che uWSGI con Nginx sia uno dei modi più solidi (e con grandi prestazioni) per distribuire un'applicazione web Python. Ecco i parametri: http://nichol.as/benchmark-of-python-web-servers.

Esistono anche alcuni progetti di modelli che è possibile utilizzare per eseguire il bootstrap. Inoltre, non è necessario clonare il progetto completo o qualcosa del genere, puoi semplicemente usarlo come immagine di base.

Docker Hub: https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/

GitHub: https://github.com/tiangolo/uwsgi-nginx-flask-docker

Problemi correlati