Riot Games

In questo primo tutorial della serie Docker, imparerai:

  • Quello che stiamo cercando di realizzare Antisommossa

  • configurazione di Base per il Mobile

  • Base Mobile Comandi Pull

  • Come eseguire la finestra Mobile Contenitori di Demoni

  • di Base Jenkins opzioni di configurazione

Quando ho iniziato a conoscere la finestra Mobile di un anno fa e ad esplorare il suo utilizzo ho avuto difficoltà a trovare la documentazione e gli esempi – anche oggi molti descrivere in modo semplice i casi d’uso che, in definitiva, non sono pronti per la produzione. La produzione di applicazioni con contenitori Docker richiede l’adeguamento alla loro natura effimera e alla messa a fuoco del singolo processo. Ciò presenta sfide per le applicazioni con esigenze di persistenza dei dati o architetture multi-processo.

Come ho detto nel mio ultimo post, usiamo Jenkins come un pezzo fondamentale di software open source in cima al quale costruiamo la nostra automazione. Jenkins è anche una grande applicazione per dimostrare un modo per pensare a “Dockerizzare” le tue applicazioni. Implementiamo Jenkins con questi componenti architettonici in mente:

  • Jenkins master server (Java processo)

  • Jenkins dati anagrafici (Plugin, le Definizioni di Processo, ecc)

  • NGINX proxy web (SSL cert ecc, con NGINX è una scelta facile qui)

  • Costruire slave agenti (macchine o essere SSH piacerebbe o JNLP connette, Jenkins Master)

Questo è un buon posto per iniziare. In questa serie di post sul blog tratterò i modi per pensare a tutto quanto sopra come contenitori e finire con uno sguardo avanzato ai modi per utilizzare i contenitori Docker come slave di build. Per cominciare, creeremo un server master Jenkins in un contenitore Docker. Quindi passeremo alla gestione della persistenza dei dati e all’aggiunta di un proxy Web con NGINX.

Questa intera serie di blog coprirà i seguenti concetti Docker:

  • Fare il vostro proprio Dockerfiles

  • Minimizzando immagine dipendenze di pubbliche le immagini

  • Creazione e utilizzo di Dati-Volumi, tra cui backup

  • la Creazione di una alternativa “Costruire Ambienti” utilizzo di contenitori

  • Gestione “segreto” di dati con immagini e Jenkins

Se non hai dato un’occhiata al Cloudbees Jenkins Mobile immagine, come inizio non c’è davvero molto buono. Questo era il mio punto di riferimento quando pensavo di eseguire Jenkins in un contenitore Docker e per molte persone questo potrebbe essere sufficiente. Puoi trovare la loro documentazione qui e il loro Git repo/Dockerfile qui.

Questo primo blog è diviso in due piani di lezione. Ciascuno è dimensionato per richiedere circa 30 minuti per completare. Innanzitutto, la prima parte sta preparando il tuo ambiente di sviluppo e imparando a lavorare con il contenitore Docker Jenkins predefinito offerto da Cloudbees. La seconda parte riguarda la posa delle basi per avvolgere questa immagine nel tuo Dockerfile e assumere un controllo più elegante dell’immagine. Insieme sono progettati per iniziare, specialmente se non hai mai lavorato con Docker prima o sono relativamente nuovi a Docker, anche se presumono che tu sappia già e capisca come lavorare con Jenkins. Se hai esperienza con Docker, parte del materiale nella Lezione 1 sarà un po ‘ un rimaneggiamento di cose che probabilmente già conosci.

LEZIONE 1: IMPOSTA ED ESEGUI LA TUA PRIMA IMMAGINE

Prepariamoci al lancio. Qui a Riot lavoriamo con Docker (e Jenkins) su Windows, Mac OSX e Linux. Preferisco lavorare con Docker su OSX, anche se è perfettamente funzionale su Windows da Docker 1.6. In questi giorni ci sono installatori eccellenti per entrambi i sistemi operativi. Lavorerò da una prospettiva OSX ma gli stessi strumenti esistono per Windows.

PRE-REQUISITI:

1. Avrai bisogno di Windows 10 Pro o Mac OSX Yosemite 10.10.3 (o versioni successive)

2. Se si utilizza Windows è necessario assicurarsi di aver abilitato la virtualizzazione di Windows (vedere la documentazione fornita da Docker)

Una BREVE NOTA SU KITEMATIC

Con Docker 1.8 e il rilascio di Docker Toolbox, Docker ora include “Kitematic”, uno strumento GUI elegante per aiutare a gestire e visualizzare ciò che sta accadendo con le immagini e i contenitori Docker. La maggior parte di questo tutorial si concentra sull’utilizzo di argomenti della riga di comando e sul lavoro con Docker senza la GUI Kitematic. Questo per esporvi meglio ai meccanismi sottostanti. Allo stesso modo, nei blog successivi inizio a coprire l’uso di Compose per avviare e arrestare più contenitori contemporaneamente.

PASSO 1: INSTALLARE DOCKER

1. Vai a: https://www.docker.com/docker-mac oppure https://www.docker.com/docker-windows

2. Scaricare e installare la versione appropriata di Docker per il sistema operativo

3. Seguire tutte le istruzioni di installazione.

4. Verificare che l’installazione funzioni aprendo la shell consigliata per il sistema operativo (Terminale per OSX, Powershell per Windows) eseguendo “Docker Quickstart Terminal”. Su Windows, questo sarà un collegamento sul desktop. Su OSX, lo troverai nella cartella applicazioni/Docker. Controlla i seguenti comandi e assicurati di non avere errori

docker ps
docker info

5. Prima di fare qualsiasi altra cosa, dovremmo aumentare la memoria predefinita e le impostazioni della CPU utilizzate dalla finestra mobile. Più tardi sintonizzeremo Jenkins per utilizzare più memoria e se non regoliamo prima queste impostazioni, Jenkins potrebbe bloccarsi.

  • Vai al tuo Pannello widget nella barra degli strumenti e selezionare “Preferenze”

  • Vai alla scheda configurazione Avanzata

  • Aumentare l’utilizzo della CPU per almeno 4 core

6. Aumenta l’utilizzo della memoria ad almeno 8 GB, preferibilmente di più, qualcosa come 12 GB per essere sicuro(se lo hai disponibile)

PASSO 2: TIRARE ED ESEGUIRE IL CONTENITORE CLOUDBEES JENKINS

1. Rimani nella finestra del terminale Docker.

2. Tirare Jenkins dal repository pubblico eseguendo:

docker pull jenkins/jenkins
docker run -p 8080:8080 --name=jenkins-master jenkins/jenkins

3. Nota che il messaggio “Jenkins initial setup” nella finestra della shell genererà una password per te. Scrivilo come ne avrai bisogno più tardi. Se lo perdi, puoi eseguire ‘ docker exec jenkins-master cat / var/jenkins_home/secrets / initialAdminPassword` con il tuo contenitore in esecuzione per recuperarlo.

4. Apri il tuo browser preferito e puntalo a http://localhost:8080

Si prega di notare, vedrete che io uso il flag Docker name name e il nome del contenitore jenkins-master – questa è una convenzione che userò in tutto questo blog. Nominare i contenitori è una pratica pratica utile con tre vantaggi:

1. Li rende facili da ricordare e interagire con

2. Docker non consente a due contenitori di avere lo stesso nome, il che impedisce errori come l’avvio accidentale di due identici

3. Molti strumenti Docker comuni (come Docker Compose) utilizzano nomi di contenitori specifici, quindi abituarsi a nominare i contenitori è una buona pratica.

PASSAGGIO 3: RENDERE QUESTO UN PO ‘ PIÙ PRATICO

Il passaggio precedente avvia Jenkins con le impostazioni di avvio più basilari. Puoi anche vedere che Jenkins ha bisogno di configurazione di base e ti sta chiedendo una password di amministratore (che puoi ottenere dai log visualizzati sullo schermo durante l’avvio). Se sei come Riot, è improbabile che tu esegua Jenkins sulle impostazioni predefinite. Camminiamo attraverso l’aggiunta di alcune opzioni utili. Non ci preoccuperemo ancora di configurare Jenkins; è sufficiente sapere che può essere avviato ed eseguito.

PASSO 3A: DEMONIZZARE

Probabilmente non vuoi vedere i log di Jenkins vomitare per la maggior parte del tempo. Quindi usa il flag del demone Docker per avviare il contenitore (- d).

1. Ctrl-c sulla finestra del terminale che esegue il contenitore per fermarlo

2. Eseguire i seguenti comandi

docker rm jenkins-master
docker run -p 8080:8080 --name=jenkins-master -d jenkins/jenkins

Ora dovresti solo visualizzare una stringa hash e tornare al tuo terminale. Se sei nuovo in Docker, quella stringa hash è in realtà l’ID univoco del tuo contenitore (utile se inizi ad automatizzare questi comandi).

PASSO 3B: IMPOSTAZIONI DI MEMORIA

Tendiamo a eseguire Jenkins con alcune impostazioni muscolose su Riot. Ricorda quando hai aumentato la finestra mobile CPU / Memoria utilizzata in precedenza? Questo è il motivo principale per cui. Per un avvio di base, eseguire i seguenti comandi

docker stop jenkins-master
docker rm jenkins-master
docker run -p 8080:8080 --name=jenkins-master -d --env JAVA_OPTS="-Xmx8192m" jenkins/jenkins

Ciò dovrebbe dare a Jenkins un bel pool di memoria 8 GB e spazio per gestire la raccolta dei rifiuti.

PASSO 3C: AUMENTARE IL POOL DI CONNESSIONI

A Riot, riceviamo molto traffico sul nostro server Jenkins, quindi abbiamo imparato a dare a Jenkins un po ‘ più di respiro. Eseguire quanto segue

docker stop jenkins-master
docker rm jenkins-master

Questo darà a Jenkins un bel gruppo di gestori e un berretto. Per coincidenza ora hai imparato come usare sia JAVA OPTS che JENKINS OPTS come variabili di ambiente in modo significativo. Si prega di notare, questo funziona a causa di come Cloudbees comodamente strutturato il loro Jenkins Dockerfile.

PASSAGGIO 4: METTERE TUTTO INSIEME

Ho inserito tutto ciò che abbiamo imparato qui in un semplice makefile in modo da poter utilizzare i comandi make per controllare l’esecuzione del contenitore docker Jenkins. Lo puoi trovare qui:

  • https://github.com/maxfields2000/docker Jenkins_tutorial / albero / maestro / tutorial_01

È possibile utilizzare i seguenti comandi:

  • make build – Tira la Jenkins immagine

  • fare eseguire – Esegue il contenitore

  • make stop – Arresta il contenitore

  • make clean – Ferma e cancella il contenitore esistente

non È necessario utilizzare il makefile, Ho appena trovo più facile che scrivere tutto il comando esegui. Si potrebbe facilmente mettere questi in uno script di vostra scelta, invece.

Speriamo che tu veda quanto sia facile essere installato e funzionante con Docker e Jenkins. Ho provato a darti alcune opzioni di base per prendere il contenitore Jenkins Cloudbees predefinito e renderlo un po ‘ più utilizzabile. Cloudbees ha molti tutorial utili per l’esecuzione del loro contenitore, come ad esempio come preinstallare i plugin e memorizzare i dati Jenkins.

Questo mi porta a futuri post sull’argomento. Questo contenitore / immagine è utile ma presenta alcuni inconvenienti: nessuna registrazione coerente, nessuna persistenza, nessun proxy del server Web di fronte ad esso e nessun modo pulito per garantire l’utilizzo della versione di Jenkins desiderata. Questo porta in primo piano domande come: cosa succede se si desidera attenersi a una versione precedente? O se si desidera utilizzare l’ultimo periodo di rilascio disponibile?

Nella prossima lezione tratterò rendendo questo contenitore un po ‘ più robusto. Soprattutto:

  • la Creazione di propri Dockerfile per avvolgere il Cloudbees base

  • lo Spostamento di alcune delle variabili di ambiente in questa nuova immagine

  • Creazione di una cartella di registro, l’impostazione di autorizzazioni e altre utili Jenkins directory, e il recupero di Jenkins registri mentre è in esecuzione

LEZIONE 2 – JENKINS BASE IMAGE WRAPPER

Nella lezione precedente ho parlato della creazione di un ambiente di sviluppo per eseguire Mobile e sperimentato con la Jenkins Mobile immagine fornita da Cloudbees. Abbiamo scoperto che era semplice e facile da usare, con alcune grandi caratteristiche fuori dalla scatola. Per rendere il progresso e il miglioramento di aree che abbiamo individuato la finestra Mobile concetti trattati in questa lezione sono:

  • Fare il vostro proprio Dockerfile

  • Impostazione delle variabili di ambiente in un Dockerfile

  • Creazione di cartelle e autorizzazioni in Dockerfile

  • Utilizzando la finestra mobile exec per eseguire comandi su un container in esecuzione

RENDENDO la VOSTRA BASE DOCKERFILE

vogliamo fare alcune modifiche alle modalità di Jenkins si avvia per impostazione predefinita. Nell’ultimo blog abbiamo gestito questo creando un makefile che passava in argomenti come variabili di ambiente. Dato che vogliamo farlo ogni volta, possiamo semplicemente spostarli nel nostro Dockerfile. Inoltre, il nostro Dockerfile ci consentirà di bloccare la versione di Jenkins che stiamo utilizzando nel caso in cui Cloudbees aggiorni il loro e non siamo pronti per l’aggiornamento.

Lo facciamo in quattro passaggi:

1. Creare una directory di lavoro

2. Nel tuo editor di testo preferito, crea un nuovo file chiamato”Dockerfile”

3. Aggiungere quanto segue al file e salvarlo:

FROM jenkins/jenkins:2.112LABEL maintainer=""

4. Quindi alla riga di comando inserisci:

docker build -t myjenkins .

Quello che abbiamo fatto qui è stato estrarre una particolare versione dell’immagine di Jenkins dal repository docker pubblico. Qui troverai tutte le versioni disponibili:

  • È sempre possibile impostare la clausola FROM come versione dell’immagine disponibile. Tuttavia, non puoi semplicemente impostare la versione su qualsiasi versione di Jenkins desideri. Questa è la versione dell’immagine ” tag ” o “etichetta”, e Cloudbees è abbastanza bello da farlo corrispondere alla versione di Jenkins all’interno dell’immagine. Cloudbees offre ” jenkins / jenkins “come un modo conveniente per ottenere l’ultima versione, o” jenkins/jenkins:lts “per ottenere la versione più recente” Supporto a lungo termine”. In questo esempio uso una versione specifica. Questi tag che etichettano i tipi di release sono fantastici, ma il loro utilizzo significa che la versione di Jenkins potrebbe cambiare sotto di te, il che può causare complicazioni se non eri pronto per l’aggiornamento. Raccomando “blocco versione” come best practice generale quando si tratta di dipendenze in Docker o altri strumenti di gestione delle dipendenze. Vuoi che le cose cambino quando vuoi, non prima. Ecco perché io uso una versione specifica qui.

    TEST DEL NUOVO DOCKERFILE

    Possiamo passare all’immagine molto facilmente modificando il nostro comando docker run nel modo seguente:

    docker run -p 8080:8080 --name=jenkins-master -d --env JAVA_OPTS="-Xmx8192m" --env JENKINS_OPTS=" --handlerCountMax=300" myjenkins

    Ora possiamo pulire quelle variabili di ambiente inserendole nel nostro Dockerfile.

    AGGIUNTA DI VARIABILI D’AMBIENTE AL NOSTRO DOCKERFILE

    È facile aggiungere impostazioni predefinite per cose come variabili d’ambiente ai Dockerfile. Questo fornisce anche un bel pezzo di auto-documentazione. E, poiché puoi sempre sovrascriverli quando esegui il contenitore Docker, non c’è davvero alcun inconveniente.

    1. Nel tuo Dockerfile aggiungi le seguenti righe dopo la riga” MAINTAINER”:

    ENV JAVA_OPTS="-Xmx8192m"ENV JENKINS_OPTS=" --handlerCountMax=300"

    2. Salva e ricostruisci la tua immagine:

    • docker costruire-t myjenkins .

    docker build -t myjenkins .

    Abbastanza semplice! È possibile verificare che funzioni ancora inserendo i seguenti tre comandi:

    docker stop jenkins-master
    docker rm jenkins-master
    docker run -p 8080:8080 --name=jenkins-master -d myjenkins

    La tua immagine dovrebbe iniziare a destra! Ma come fai a sapere che le variabili d’ambiente hanno funzionato? Semplice: allo stesso modo in cui controlleresti per vedere quali argomenti hanno avviato la tua app Jenkins normalmente usando ps. E questo funziona anche se si sta sviluppando su Windows.

    ESECUZIONE di UN COMANDO di BASE CONTRO IL CONTENITORE

    Per confermare che il Java e Jenkins opzioni sono impostate correttamente, possiamo eseguire ps nel nostro contenitore e vedere il Jenkins processo Java utilizzando la finestra mobile exec

    docker exec jenkins-master ps -ef | grep java

    Si dovrebbe vedere qualcosa di simile a questo tornare

    jenkins 1 0 99 21:28 ? 00:00:35 java -Xmx8192m -jar /usr/share/jenkins/jenkins.war --handlerCountMax=300

    Da questo, si può facilmente vedere le nostre impostazioni hanno bloccato. docker exec è un modo semplice per eseguire comandi di shell all’interno del tuo contenitore e anche un modo incredibilmente semplice per ispezionarli. Questo funziona anche su Windows perché, ricorda, il comando dopo “exec” viene eseguito all’interno del tuo contenitore e quindi si basa su qualsiasi immagine di base utilizzata dal tuo contenitore.

    IMPOSTAZIONE DI UNA CARTELLA DI LOG

    Nel blog precedente abbiamo notato che abbiamo perso visibilità nei log di Jenkins durante l’esecuzione del nostro contenitore con il flag daemonize (-d). Vogliamo utilizzare la funzione Jenkins integrata per impostare una cartella di registro. Avremo bisogno di farlo nel nostro Dockerfile e quindi passare l’opzione di registrazione a Jenkins.

    Modifichiamo di nuovo il nostro Dockerfile. Tra il “MAINTAINER” e la prima riga ENV aggiungeremo il seguente

    RUN mkdir /var/log/jenkins

    Posizioniamo il comando in questa posizione nel file per seguire le best practice. È più probabile che cambieremo le variabili di ambiente rispetto a queste directory di installazione e ogni riga di comando in un Dockerfile diventa essenzialmente il proprio livello di immagine. Massimizza il riutilizzo dei livelli mettendo gli elementi modificati frequentemente vicino al fondo.

    Ora costruisci di nuovo la tua immagine:

    docker build -t myjenkins

    Si otterrà un errore simile

    ---> Running in 0b5ac2bce13bmkdir: cannot create directory '/var/log/jenkins': Permission denied

    Nessun problema. Questo perché il contenitore Cloudbees predefinito imposta l’utente in esecuzione all’utente “Jenkins”. Se guardi il loro Dockerfile (trovato qui: https://github.com/ Jenkinsci/docker/blob/master/Dockerfile) dovresti vedere, vicino al fondo

    USER ${user}

    Questa sintassi potrebbe essere un po ‘ confusa. Utilizza gli “argomenti” di Docker per consentire di definire l’utente. Se guardi più in alto il file Docker troverai il valore predefinito. Guarda vicino alla parte superiore del Dockerfile per

    ARG user=jenkins

    Questo crea l’argomento “utente” (ARG) e lo imposta all’utente Jenkins. Ciò consente di modificare il nome utente utilizzato da Jenkins quando si chiama docker build build build-arg somevariable=somevalue. Si noti che questo funziona solo se si sta costruendo il Dockerfile da zero. Non è possibile modificare questi valori con un pull docker o un’esecuzione docker. Puoi leggere di più sugli argomenti di build qui. Poiché stiamo usando una versione precompilata nella nostra clausola FROM, finiamo con l’utente predefinito: “jenkins”.

    In Linux normale dovresti usare SUDO o altri mezzi per creare la cartella (/var / log è di proprietà di root). Fortunatamente per noi Docker ci permette di cambiare gli utenti.

    Aggiungi quanto segue al tuo Dockerfile:

    1. Prima di ESEGUIRE la riga mkdir aggiungi

    USER root

    2. Dopo la tua CORSA mkdir line aggiungi

    RUN chown -R jenkins:jenkins /var/log/jenkins

    3. Dopo la tua CORSA chown linea aggiungi:

    USER jenkins

    Si noti che abbiamo dovuto aggiungere anche un comando chown perché vogliamo che l’utente Jenkins sia in grado di scrivere nella cartella. Successivamente, impostiamo root e quindi ripristiniamo Jenkins in modo che il comportamento del Dockerfile sia preservato.

    Ora costruisci di nuovo la tua immagine:

    docker build -t myjenkins .

    E… i tuoi errori dovrebbero essere spariti.

    Con il set di directory log (nota: puoi posizionare questa cartella dove vuoi, usiamo /var/log per coerenza) ora possiamo dire a Jenkins di scrivere in quella cartella all’avvio modificando le variabili di ambiente JENKINS_OPTS.

    Nel tuo Dockerfile modifica la riga JENKINS_OPTS in modo che assomigli a questa:

    • Per maggiori informazioni, consulta la nostra informativa sulla privacy.registro”

    ENV JENKINS_OPTS="--handlerCountMax=300 --logfile=/var/log/jenkins/jenkins.log"

    Ora costruisci la tua immagine ancora una volta

    docker build -t myjenkins .

    Testiamo la nostra nuova immagine e se possiamo eseguire la coda del file di registro! Prova i seguenti comandi

    docker stop jenkins-master
    docker rm jenkins-master
    docker run -p 8080:8080 --name=jenkins-master -d myjenkins

    Con il contenitore in esecuzione possiamo eseguire la coda del file di registro se tutto ha funzionato

    docker exec jenkins-master tail -f /var/log/jenkins/jenkins.log

    RECUPERARE I REGISTRI SE JENKINS SI BLOCCA

    Tempo per un round bonus! Finché stiamo discutendo i log, Docker presenta un problema interessante se Jenkins si blocca. Il contenitore smetterà di funzionare e docker exec non funzionerà più. Quindi cosa fare?

    Discuteremo modi più avanzati di persistere il file di registro in seguito. Per ora, poiché il contenitore è fermo, possiamo copiare i file da esso utilizzando il comando docker cp. Simuliamo un arresto anomalo arrestando il contenitore, quindi recuperando i registri:

    1. ctrl-c per uscire dalla coda del file di registro

    2. Eseguire i seguenti comandi

    docker stop jenkins-master
    docker cp jenkins-master:/var/log/jenkins/jenkins.log jenkins.log
    cat jenkins.log

    PENSIERI CONCLUSIVI

    Puoi trovare tutto il lavoro nel mio tutorial Git repo (e il makefile di convenienza aggiornato) qui:

    • https://github.com/maxfields2000/docker Jenkins_tutorial / albero / maestro / tutorial_02

    Facendo il nostro Dockerfile che avvolge il file Cloudbees, siamo stati in grado di rendere la vita un po ‘ più facile per noi stessi. Abbiamo creato un posto conveniente per memorizzare i registri e imparato a guardarli con il comando docker exec. Abbiamo spostato le nostre impostazioni predefinite nel Dockerfile e ora possiamo memorizzarlo nel controllo del codice sorgente come un buon pezzo di auto-documentazione.

    Abbiamo ancora una sfida di persistenza dei dati. Abbiamo imparato come estrarre i file di registro da un contenitore fermato (utile quando Jenkins si blocca). Ma in generale se il nostro contenitore si ferma stiamo ancora perdendo tutti i posti di lavoro che abbiamo creato. Quindi, senza persistenza, questa immagine di Jenkins è utile solo per lo sviluppo e il test locali.

    Questo ci porta al prossimo articolo. Con le nostre basi sul posto – il nostro wrapper Dockerfile, bloccato su una comoda versione di Jenkins – possiamo risolvere il problema di persistenza. Il prossimo articolo esplorerà questi concetti:

    • Preservare Jenkins Lavoro e Plugin dati

    • la finestra Mobile per la Persistenza dei Dati con Volumi

    • Fare un Volume di Dati contenitore

    • la Condivisione dei dati in volumi con altri contenitori

    Per ulteriori informazioni, controllare il resto di questa serie:

    Parte I: il Pensiero all’Interno del Contenitore
    Parte II: Mettere Jenkins in un Mobile Contenitore (in questo articolo)
    Parte III: Mobile & Jenkins: i Dati Che Persiste
    Parte IV: Jenkins, Mobile, Proxy e Comporre
    Parte V: Prendendo il controllo della tua immagine Docker
    Parte VI: Costruire con Jenkins all’interno di un contenitore Docker effimero
    Parte VII: Tutorial: Costruire con Jenkins all’interno di un contenitore Docker effimero
    Parte VIII: DockerCon Talk e la storia finora

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.