Ci sono vantaggi nell'esecuzione del mio ambiente di sviluppo in un contenitore Docker?


12

Sviluppo principalmente utilizzando Visual Studio su Windows. Il problema è che dopo un po 'Windows si impantana e devo affrontare la necessità di reinstallare Windows. Allo stesso modo il passaggio a nuove macchine è un problema.

La reinstallazione di Windows è dolorosa perché il mio ambiente di sviluppo ha molte dipendenze (come file di configurazione MSBuild extra, estensioni VS, npm, Java ecc.). Non immagino di essere solo ad avere un sistema complesso, e il suo ripristino probabilmente richiederebbe un minimo di un giorno.

Non ho davvero usato Docker, ma in teoria sembra che potrei configurare il mio ambiente di sviluppo in un contenitore di Windows e quindi semplicemente spedirlo in giro (ad es. Copia sul mio laptop, inserire una nuova installazione di Windows) e dovrebbe essere indolore .

Ciò che sto descrivendo è possibile? Ci sono aspetti negativi, come prestazioni, affidabilità? Altri gotchas?


Sono curioso di sapere cosa potresti fare con un ambiente di sviluppo che fa "impantanare" Windows. L'installazione di Node, VS e alcuni plugin non dovrebbero causare problemi.
neilsimp1,

@ neilsimp1 hai ragione, ma la realtà è qualcosa di più simile a 4 versioni di VS, editor, strumenti di disegno, Android Studio, Netbeans, Office, CrashPlan, Git, TortoiseSVN, Fiddler, desktop remoto, conferenze, skype, WireShark, VMware e ancora e ancora.
Jim W dice di ripristinare Monica l'

Come nota a margine, dovresti esaminare le utility di clonazione del disco. Puoi installare il tuo sistema operativo + tutto il software necessario e configurare tutto nel modo giusto. Quindi crea un clone del tuo disco e esegui il backup da qualche parte. Quando è necessario "ripristinare" tutto, è sufficiente ripristinare da quel clone e il gioco è fatto. Ci sono molti strumenti che possono farlo e nella tua situazione può farti risparmiare decine di ore :).
Radu Murzea,

Risposte:


13

Questo non è un problema raro, ma Docker non è davvero lo strumento giusto per risolverlo. I container in generale (incluso Docker) hanno lo scopo di fornire un runtime dell'applicazione per un singolo processo , come un server Web, non per uno scenario multi-processo come un ambiente di sviluppo. In può essere fatto, ma non è una soluzione molto elegante.

Un approccio migliore (e più comune) è quello di creare macchine virtuali tramite un hypervisor tradizionale come VirtualBox o Hyper-V (dal momento che sei su Windows). Un flusso di lavoro tipico è:

  • Trova o crea un'immagine VM di base in base al tuo stile di sistema operativo preferito. Questo può essere fatto direttamente con l'ISO dell'installatore o qualcuno sul posto di lavoro potrebbe già averne uno.
  • Una volta creata l'immagine di base, aggiungi tutti gli strumenti e le impostazioni di sviluppo di cui hai bisogno. Snapshot o salvarlo come immagine separata.
  • Ora puoi eseguire questa immagine, RDP o remoto in esso e lavorare fino a quando non arrivi a un punto in cui "impantanarsi", quindi salvare i file necessari (impegnarsi nel controllo del codice sorgente, ecc.), Quindi saltare allontanare l'immagine e ricominciare da una delle due istantanee / immagini create. Questo può essere fatto in pochi secondi, fino a un giorno alla vecchia maniera.
  • In qualsiasi momento lungo la linea, creare ulteriori istantanee quando si verificano situazioni in cui è possibile eseguire il rollback per riprodurre un problema, ecc.

Vagrant è anche uno strumento fantastico per eseguire gran parte di quanto sopra in modo più strutturato.

Un vantaggio secondario di tutto ciò è che ora disponi di ambienti standardizzati che possono essere condivisi con tutto il tuo team, risparmiando a tutti lo sforzo. Questo è particolarmente utile per far entrare rapidamente nuove persone.

Tornando alla tua domanda originale, Docker non è davvero destinato a questo, ma se avessi un ambiente di sviluppo abbastanza piccolo (diciamo PHP su Linux), potresti farlo in un contenitore e il vantaggio sarebbe un'immagine molto più piccola (potenzialmente meno di 100 MB contro molti GB per una macchina virtuale Windows con disco virtuale).


2

non in un contenitore docker ma sì in n contenitori docker.

Sebbene tu potessi - teoricamente - assemblare l'intero ambiente di sviluppo in un singolo contenitore, la docker non era pensata per farlo.

Dovresti invece distribuire ogni servizio in contenitori separati, usando la composizione docker , gestendo l'intera infrastruttura in un singolo file, dove ogni servizio avrà il suo file di log, spazio utente, rete, ecc.

Lascia che ti faccia un esempio, questa è una mia bozza docker-compose.yml

version: '2'
services:

  myproxy:
    build: myproxy
    container_name: ppproxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      default:
        aliases:
          - www.domain1.it
          - www.domain2.it
          - www.domain4.it

  mydb1:
    build: mydb
    environment:
      DB_USER: sdffdssdf
      DB_PASSWORD:  fdsfsdsdf
      DB_NAME: dbanme1
      DB_ENCODING: UTF-8    
      VIRTUAL_HOST: myhost1.net.lan
      VIRTUAL_PORT: 5432

  mydb2:
    build: mydb
    environment:
      DB_USER: ssdfsdfs
      DB_PASSWORD:  sffdssd
      DB_NAME: dbanme2
      DB_ENCODING: UTF-8    
      VIRTUAL_HOST: myhost2.net.lan
      VIRTUAL_PORT: 5432

  www:
    image: myimages/oldservice:v1.1
    container_name: www
    command: /bin/bash /root/launch
    environment:
        VIRTUAL_HOST: www.domain1.it
        VIRTUAL_PORT: 80
    ports:
      - 80
    depends_on:
      - mydb1
      - mydb1
      - myws

  myws:
    build: myjettycontainer
    environment:
        HTTPS_METHOD: noredirect
        VIRTUAL_HOST: www.domain2.it
        VIRTUAL_PORT: 8080
    ports:
      - 8080
    depends_on:
      - mydb1
      - mydb2
      - myproxy
      - mypostfix

  mypostfix:
    image: catatnight/postfix
    container_name: mailer
    environment:
      maildomain: domain1.it
      smtp_user: mymail:sfsfdfds
    ports:
      - 25

C'è un proxy nginx (myproxy), due database postgres simili (mydb1 e 2), un vecchio server di applicazioni web java (www), un contenitore jetty java che fornisce un servizio web di riposo e infine un contenitore postfix SMTP molto semplice.

Tutto inizia - di solito :) - con docker-compose up, sulla mia macchina di sviluppo o in produzione; i file di registro sono aggregati in un file di facile lettura ed è possibile replicare localmente quasi tutte le funzionalità con la garanzia che, se funziona sul mio laptop, funzionerà.


2

Uso macchine virtuali VirtualBox per questo tipo di cose.

La portabilità di avere il tuo ambiente di sviluppo in un contenitore è utile, ma la cosa davvero bella è che posso eseguire l'istantanea della cosa prima di qualsiasi tentativo di aggiornamento, e se lo rovino non è un problema tornare indietro e ricominciare.

Trovo anche utile farlo perché lavoro spesso con più versioni di cose come Qt, e non ho voglia di capire come far coesistere le due versioni, invece le metto su macchine virtuali diverse e Non devo preoccuparmi delle interazioni perché ho installato qualcosa in modo errato.

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.