Da quando ho notato che l'applicazione che abbiamo preparato si è espansa in modo significativo, ho deciso di trovare un metodo completamente nuovo per automatizzare il processo di lancio. Per me era importante trovare una soluzione che permettesse di attivare nuove funzionalità in modo isolato.
Introduzione
La scoperta di un metodo più semplice per l'automazione dei processi rappresenterebbe un miglioramento significativo del mio lavoro e di quello di tutto il mio staff. squadra. Ho pensato: "Perché non usare Docker?".
Durante la fase di preparazione, ho creato due setup: uno per l'applicazione front-end e l'altro per l'API. Di seguito potete vedere una presentazione di ciò che ho imparato durante il processo di sviluppo.
Il primo problema
Voglio avere un repository clonato nel contenitore, quindi ho aggiunto una chiave ssh tramite il comando ADD nel Dockerfile:
aggiungere ~/.ssh/testowy
E bam! Il file non viene trovato. Perché?
Supponiamo di avere la seguente struttura di cartelle:
docker/
|-- roba/
|-- test.txt
|-- Dockerfile
server/
|-- dati
|-- setup.yml
Eseguire il comando costruire
nel coda di accesso
e si possono aggiungere solo i file della cartella locale e delle sue sottocartelle locali, ad esempio le cose.
Se si vuole aggiungere l'opzione server
riceverete un messaggio: "Impossibile preparare il contesto".
Dockerignore
Vi siete mai chiesti perché l'immagine impiega così tanto tempo a costruirsi? Forse non avete usato .dockerignore
per ignorare i file non necessari nell'immagine. Il .git
dovrebbe essere rimossa automaticamente, così come tutti i file temporanei.
Ordine dei comandi nel file Docker
Docker salva ogni riga nel file Docker e dopo la costruzione ogni riga viene salvata come livello. È molto importante non cambiare troppo spesso l'ordine di determinati comandi.
DA ubuntu
ESEGUIRE apt-get install -y software-properties-common pitone
RUN add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
ESEGUIRE apt-get update
ESEGUIRE apt-get install -y nodejs
ESEGUIRE apt-get install -y nodejs=0.6.12~dfsg1-1ubuntu1
ESEGUIRE mkdir /var/www
AGGIUNGI app.js /var/www/app.js
CMD ["/usr/bin/node", "/var/www/app.js"]
Ad esempio, se si modifica l'ultima riga del file Docker, tutte le righe precedenti verranno scaricate dalla cache mentre l'ultima riga verrà modificata. Se si sostituisce la riga n. 4, verranno modificate tutte le righe a partire dalla riga 4 fino alla fine. Per questo motivo è opportuno inserire i comandi che non verranno modificati all'inizio del file.
Copia dei file nell'immagine
Vale la pena di considerare l'uso che si farà di una determinata immagine. Se serve per lanciare un servizio una volta, basta copiare il file codice direttamente all'immagine:
COPIA . /workdir
Sfortunatamente, questo rende impossibile modificare i file e ogni volta che si vuole modificare il codice, si deve costruire di nuovo l'immagine.
Se si usa MacOS e si vuole usare l'immagine costruita per lo sviluppo, bisogna affrontare la questione in modo leggermente diverso. Se si usano i volumi, bisogna essere preparati al fatto che si tratta di una soluzione estremamente lenta (ad esempio, la copia di un file dall'host al contenitore avviene alla velocità di 4,5 MB/s, mentre la copia interna al contenitore ha una velocità 10-20 volte superiore). Fortunatamente, come si può vedere in linkIl problema è noto e la sua soluzione è il punto chiave per il team responsabile dello sviluppo di Docker per Mac.
Come si può utilizzare Docker per lo sviluppo in questa situazione?
È possibile utilizzarlo per servizi esterni, ad esempio Redis/PSQL/Elasticsearch o utilizzare soluzioni già pronte che offrono rsync: https://github.com/brikis98/docker-osx-dev
Per riassumere
Se avete un grande team e volete testare una nuova funzionalità, docker è lo strumento ideale! Tuttavia, lo utilizzerei per il lancio in produzione di un server? Non sono ancora del tutto convinto...
Inoltre, vi raccomando alcuni articoli eccezionali: