Riot Games

în acest prim tutorial din seria Docker, veți învăța:

  • ce încercăm să realizăm La Riot

  • configurare de bază pentru Docker

  • comenzi de bază Docker Pull

  • cum să rulați containerele Docker ca daemoni

  • Opțiuni de configurare Jenkins de bază

când am început să învăț despre Docker acum un an și să explorez utilizarea acestuia, am avut probleme în a găsi documentație și exemple excelente – chiar și astăzi mulți descriu cazuri simple de utilizare care în cele din urmă nu sunt pregătite pentru producție. Aplicațiile de producție cu containere Docker necesită adaptarea la natura lor efemeră și focalizarea cu un singur proces. Acest lucru prezintă provocări pentru aplicațiile cu nevoi de persistență a datelor sau arhitecturi multi-proces.

așa cum am menționat în ultima mea postare, folosim Jenkins ca o piesă fundamentală de software open source pe care ne construim automatizarea. Jenkins este, de asemenea, o aplicație excelentă pentru a demonstra o modalitate de a vă gândi la „Dockerizarea” aplicațiilor dvs. Implementăm Jenkins cu aceste componente arhitecturale în minte:

  • Jenkins master server (proces Java)

  • Jenkins master data (plugin-uri, definiții de locuri de muncă, etc)

  • NGINX web proxy (folosim certificate SSL etc, cu NGINX este o alegere ușoară aici)

  • construiți agenți sclavi (mașini fie fiind SSH ‘ D în, sau JNLP conectarea la, Jenkins Master)

acesta este un loc bun pentru a începe. Peste această serie de postări pe blog voi acoperi modalități de a gândi la toate cele de mai sus ca containere și de a termina cu o privire avansată asupra modalităților de utilizare a containerelor Docker ca sclavi construiți. Pentru început, vom crea un server Jenkins master într-un container Docker. Apoi vom trece la tratarea persistenței datelor și la adăugarea unui proxy web cu NGINX.

întreaga serie de bloguri va acoperi următoarele concepte Docker:

  • efectuarea propriilor Dockerfiles

  • minimizarea dependențelor de imagine pe imaginile publice

  • crearea și utilizarea volumelor de date, inclusiv a copiilor de rezervă

  • crearea de „medii de construire” containerizate folosind containere

  • manipularea datelor „secrete” cu imagini și Jenkins

dacă nu ați aruncat o privire la imaginea Cloudbees Jenkins Docker, începeți acolo, deoarece este într-adevăr destul de bună. Acesta a fost punctul meu de referință când m-am gândit mai întâi să alerg Jenkins într-un container Docker și pentru mulți oameni acest lucru ar putea fi suficient. Puteți găsi documentația lor aici și git repo/Dockerfile aici.

acest prim blog este împărțit în două planuri de lecție. Fiecare este dimensionat pentru a dura aproximativ 30 de minute pentru a finaliza. În primul rând, prima parte este pregătirea mediului dvs. de dezvoltare și învățarea de a lucra cu containerul Jenkins Docker implicit pe care Cloudbees îl oferă. Partea a doua se referă la punerea bazelor pentru a înfășura această imagine în propriul fișier Dockerfile și pentru a prelua un control mai elegant al imaginii. Împreună sunt concepute pentru a vă începe, mai ales dacă nu ați mai lucrat niciodată cu Docker sau sunteți relativ nou pentru Docker—deși presupun că știți deja și înțelegeți cum să lucrați cu Jenkins. Dacă aveți experiență cu Docker, o parte din materialul din lecția 1 va fi un pic de rehash de lucruri pe care probabil le cunoașteți deja.

lecția 1: Configurați și rulați prima imagine

să vă pregătim să rulați. Aici la Riot lucrăm cu Docker (și Jenkins) pe Windows, Mac OSX și Linux. Prefer să lucrez cu Docker pe OSX, deși este perfect funcțional pe Windows de la Docker 1.6. În zilele noastre există instalatori excelenți pentru ambele sisteme de operare. Voi lucra dintr-o perspectivă OSX, dar aceleași instrumente există Pentru Windows.

PRE-CERINȚE:

1. Veți avea nevoie de Windows 10 Pro sau Mac OSX Yosemite 10.10.3 (sau o versiune ulterioară)

2. Dacă utilizați Windows, trebuie să vă asigurați că aveți virtualizarea Windows activată (consultați documentația oferită de Docker)

o notă rapidă despre KITEMATIC

cu Docker 1.8 și lansarea Docker Toolbox, Docker include acum „Kitematic”, un instrument GUI puturos pentru a vă ajuta să gestionați și să vizualizați ce se întâmplă cu imaginile și containerele Docker. Cea mai mare parte a acestui tutorial se concentrează pe utilizarea argumentelor din linia de comandă și lucrul cu Docker fără GUI Kitematic. Acest lucru este pentru a vă expune mai bine la mecanismele de bază. La fel, în blogurile ulterioare încep să acopăr utilizarea Compose pentru a porni și opri mai multe containere simultan.

PASUL 1: INSTALAȚI DOCKER

1. Mergi la: https://www.docker.com/docker-mac sau https://www.docker.com/docker-windows

2. Descărcați și instalați versiunea corespunzătoare a Docker pentru sistemul dvs. de operare

3. Urmați toate instrucțiunile de configurare.

4. Verificați dacă instalarea dvs. funcționează deschizând shell-ul recomandat pentru sistemul dvs. de operare (Terminal pentru OSX, Powershell pentru windows) rulând „Docker Quickstart Terminal”. Pe Windows, aceasta va fi o comandă rapidă pe desktop. Pe OSX, îl veți găsi în folderul Aplicații/Docker. Verificați următoarele comenzi și asigurați-vă că nu primiți erori

docker ps
docker info

5. Înainte de a face orice altceva, ar trebui să creștem setările implicite de memorie și CPU pe care le folosește Docker. Mai târziu vom regla Jenkins pentru a folosi mai multă memorie și dacă nu ajustăm mai întâi aceste setări, Jenkins se poate prăbuși.

  • accesați widgetul Docker din bara de instrumente și selectați „Preferințe”

  • accesați fila Configurare avansată

  • creșteți utilizarea procesorului la cel puțin 4 nuclee

6. Creșteți utilizarea memoriei la cel puțin 8 GB, de preferință mai mult, ceva de genul 12 GB pentru a fi în siguranță (dacă îl aveți disponibil)

pasul 2: Trageți și rulați containerul CLOUDBEES JENKINS

1. Rămâi în fereastra terminalului Docker.

2. Trage Jenkins din repo publice de funcționare:

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

3. Rețineți că mesajul” Jenkins initial setup ” din fereastra shell va genera o parolă pentru dvs. Notează asta, după cum vei avea nevoie mai târziu. Dacă îl pierzi, poți rula `Docker exec jenkins-master cat / var/jenkins_home/secrets / initialAdminPassword` cu containerul tău care rulează pentru a-l recupera.

4. Deschideți browserul preferat și indicați-l spre http://localhost:8080

vă rugăm să rețineți, veți vedea că eu folosesc Docker — numele steagului și numele containerului jenkins-master – aceasta este o convenție voi folosi pe tot parcursul acestui blog. Denumirea containerelor dvs. este o bună practică la îndemână, cu trei avantaje:

1. Le face ușor să-și amintească și să interacționeze cu

2. Docker nu permite ca două containere să aibă același nume, ceea ce previne greșeli precum pornirea accidentală a două identice

3. Multe instrumente Docker obișnuite (cum ar fi Docker Compose) folosesc nume specifice de containere, așa că obișnuirea cu denumirea containerelor dvs. este o bună practică.

Pasul 3: făcând acest lucru puțin mai practic

pasul anterior începe Jenkins cu cele mai elementare setări de pornire. Puteți vedea chiar că Jenkins are nevoie de configurare de bază și vă solicită o parolă de Administrator (pe care o puteți obține din jurnalele afișate pe ecran în timpul pornirii). Dacă sunteți ca Riot, este puțin probabil să rulați Jenkins pe setările implicite. Să trecem prin adăugarea unor opțiuni utile. Nu ne vom deranja încă să configurăm Jenkins; este suficient să știm că poate începe și rula.

pasul 3A: demonizarea

probabil că nu doriți să vedeți jurnalele Jenkins care se aruncă la standard în majoritatea timpului. Deci, utilizați steagul daemon Docker pentru a porni containerul (-d).

1. Ctrl-C în fereastra terminalului care rulează containerul pentru a-l opri

2. Rulați următoarele comenzi

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

acum ar trebui să obțineți doar un șir hash afișat și să fiți returnat la terminalul dvs. Dacă sunteți nou la Docker, acel șir de hash este de fapt ID-ul unic al containerului dvs. (util dacă începeți să automatizați aceste comenzi).

pasul 3B: setări de memorie

avem tendința de a rula Jenkins cu unele setări musculos La Riot. Amintiți-vă când ați crescut CPU/memorie Docker utilizează mai devreme? Acesta este motivul principal. Pentru o pornire de bază, executați următoarele comenzi

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

asta ar trebui să dea Jenkins un frumos 8 piscină de memorie GB și o cameră să se ocupe de colectare a gunoiului.

pasul 3C: creșterea bazei de conexiuni

La Riot, obținem mult trafic către serverul nostru Jenkins, așa că am învățat să-i oferim lui Jenkins un pic mai mult spațiu de respirație. Rulați următoarele

docker stop jenkins-master
docker rm jenkins-master

asta îi va oferi lui Jenkins o bază de stivuitoare și o șapcă. Întâmplător ați învățat acum cum să utilizați atât JAVA OPTS, cât și JENKINS OPTS ca variabile de mediu într-un mod semnificativ. Vă rugăm să rețineți, acest lucru funcționează din cauza modului în care Cloudbees și-a structurat convenabil Jenkins Dockerfile.

pasul 4: punerea totul împreună

am plasat tot ce am învățat aici într-un makefile simplu, astfel încât să puteți utiliza face comenzi pentru a controla rularea containerului Jenkins docker. O puteți găsi aici:

  • https://github.com/maxfields2000/docker Jenkins_tutorial / copac / maestru / tutorial_01

puteți utiliza următoarele comenzi:

  • face construi-trage Jenkins imagine

  • faceți run-rulează containerul

  • asigurați-stop-oprește containerul

  • face curat-se oprește și șterge containerul existent

nu trebuie să utilizați makefile, mi se pare mai ușor decât tastarea întregii comenzi run. Ai putea pune cu ușurință aceste într-un script de alegerea ta în schimb.

sperăm că veți vedea cât de ușor este să te ridici și să fie difuzate cu Docker și Jenkins. Am încercat să vă ofer câteva opțiuni de bază pentru a lua containerul implicit Cloudbees Jenkins și a-l face puțin mai utilizabil. Cloudbees are multe tutoriale utile pentru rularea containerului lor, cum ar fi modul de preinstalare a pluginurilor și stocarea datelor Jenkins.

asta mă aduce la postările viitoare pe această temă. Acest container / imagine este util, dar are câteva dezavantaje: nici o logare consistentă, nici o persistență, nici un proxy server web în fața ei, și nici un mod curat pentru a garanta că utilizați versiunea de Jenkins pe care doriți. Acest lucru aduce întrebări precum: Ce se întâmplă dacă doriți să rămâneți la o versiune mai veche? Sau dacă doriți să utilizați cea mai recentă perioadă de lansare disponibilă?

în următoarea lecție voi acoperi acest container un pic mai robust. În special:

  • crearea propriului Dockerfile pentru a înfășura baza Cloudbees

  • mutarea unor variabile de mediu în această nouă imagine

  • crearea unui folder jurnal, setarea permisiuni și alte directoare Jenkins utile, și regăsirea jurnalele Jenkins în timp ce se execută

lecția 2-un JENKINS bază imagine WRAPPER

în lecția anterioară am discutat crearea unui mediu de dezvoltare pentru a rula Docker și experimentat cu Jenkins Docker imagine furnizate de Cloudbees. Am constatat că a fost simplu și ușor de utilizat, cu unele caracteristici de mare din cutie. Pentru a face progrese în domeniile de îmbunătățire pe care le-am identificat, conceptele Docker acoperite în această lecție sunt:

  • efectuarea propriul Dockerfile

  • setarea variabilelor de mediu într-un fișier Dockerfile

  • crearea de foldere și permisiuni într-un fișier Dockerfile

  • utilizarea Docker exec pentru a rula comenzi împotriva unui container care rulează

efectuarea DOCKERFILE de bază

dorim să facem unele modificări la modul în care Jenkins începe în mod implicit. În ultimul blog am tratat acest lucru creând un fișier makefile care a trecut în argumente ca variabile de mediu. Având în vedere că vrem să facem acest lucru de fiecare dată, putem muta doar cele în propriul nostru Dockerfile. În plus, propriul nostru Dockerfile ne va permite să blocăm versiunea Jenkins pe care o folosim în cazul în care Cloudbees le actualizează și nu suntem pregătiți să facem upgrade.

facem acest lucru în patru pași:

1. Creați un director de lucru

2. În editorul de text preferat, creați un fișier nou numit „Dockerfile”

3. Adăugați următoarele în fișier și salvați-l:

FROM jenkins/jenkins:2.112LABEL maintainer=""

4. Apoi, la linia de comandă introduceți:

docker build -t myjenkins .

ceea ce am făcut aici a fost trage o anumită versiune a imaginii Jenkins din docker publice repo. Veți găsi toate versiunile disponibile aici:

  • puteți seta întotdeauna clauza FROM să fie orice versiune a imaginii este disponibilă. Cu toate acestea, nu puteți seta doar versiunea la orice versiune de Jenkins doriți. Aceasta este versiunea de imagine „etichetă” sau „etichetă”, iar Cloudbees este suficient de drăguță pentru a se potrivi cu versiunea Jenkins din interiorul imaginii. Cloudbees oferă ” jenkins / jenkins „ca o modalitate convenabilă de a obține cea mai recentă versiune sau” jenkins/jenkins:lts „pentru a obține cea mai recentă versiune” Suport pe termen lung”. În acest exemplu folosesc o versiune specifică. Aceste etichete care etichetează tipurile de versiuni sunt excelente, dar utilizarea lor înseamnă că versiunea Jenkins se poate schimba sub dvs., ceea ce poate provoca complicații dacă nu ați fost gata să faceți upgrade. Recomand „blocarea versiunii” ca o bună practică generală atunci când se ocupă de orice dependențe în Docker sau alte instrumente de gestionare a dependenței. Vrei ca lucrurile să se schimbe atunci când intenționezi, nu înainte. De aceea folosesc o versiune specifică aici.

    testarea noului DOCKERFILE

    putem trece la imagine foarte ușor modificând comanda noastră Docker run la următoarele:

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

    acum putem curăța acele variabile de mediu plasându-le în propriul nostru fișier Dockerfile.

    adăugarea variabilelor de mediu la DOCKERFILE-ul nostru

    este ușor să adăugați setări implicite pentru lucruri precum variabilele de mediu la Dockerfiles. Acest lucru oferă, de asemenea, o bucată frumoasă de auto-documentare. Și, pentru că le puteți suprascrie întotdeauna atunci când rulați containerul Docker, nu există niciun dezavantaj.

    1. În fișierul Dockerfile adăugați următoarele linii după linia „MAINTAINER:

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

    2. Salvați și reconstruiți imaginea:

    • docker construi-t myjenkins .

    docker build -t myjenkins .

    destul de simplu! Puteți testa dacă funcționează în continuare introducând următoarele trei comenzi:

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

    imaginea ta ar trebui să înceapă imediat! Dar de unde știi că variabilele de mediu au funcționat? Simplu: în același mod în care ați verifica pentru a vedea ce argumente au pornit aplicația Jenkins folosind în mod normal ps. Și acest lucru funcționează chiar dacă vă dezvoltați pe Windows.

    rularea unei comenzi de bază împotriva containerului dvs.

    pentru a confirma că opțiunile Java și Jenkins sunt setate corect, putem rula ps în containerul nostru și putem vedea procesul java Jenkins care rulează utilizând Docker exec

    docker exec jenkins-master ps -ef | grep java

    ar trebui să vedeți ceva similar cu acest lucru reveniți

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

    din aceasta, puteți vedea cu ușurință setările noastre s-au blocat. Docker exec este un mod simplu de a executa comenzi shell în interiorul containerului și, de asemenea, un mod incredibil de simplu de a le inspecta. Acest lucru funcționează chiar și pe Windows, deoarece, amintiți-vă, comanda după „exec” este rulată în interiorul containerului dvs. și, prin urmare, se bazează pe orice imagine de bază pe care o folosește containerul dvs.

    configurarea unui FOLDER jurnal

    în blogul anterior am observat că am pierdut vizibilitatea în jurnalele Jenkins atunci când rulăm containerul nostru cu steagul daemonize (-d). Vrem să folosim funcția Jenkins încorporată pentru a seta un folder de jurnal. Vom avea nevoie pentru a face acest lucru în Dockerfile nostru și apoi trece în opțiunea de logare la Jenkins.

    să ne edităm din nou fișierul Dockerfile. Între „MAINTAINER” și prima linie ENV vom adăuga următoarele

    RUN mkdir /var/log/jenkins

    plasăm comanda în această locație în fișier pentru a urma cele mai bune practici. Este mai probabil să schimbăm variabilele de mediu decât aceste directoare de configurare și fiecare linie de comandă dintr-un fișier Dockerfile devine în esență propriul strat de imagine. Maximizați reutilizarea stratului punând elemente modificate frecvent în partea de jos.

    acum construiește-ți din nou imaginea:

    docker build -t myjenkins

    veți primi o eroare care arata ca

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

    nu vă faceți griji. Acest lucru se datorează faptului că containerul implicit Cloudbees setează utilizatorul care rulează la utilizatorul „Jenkins”. Dacă te uiți la Dockerfile lor (găsit aici:https://github.com/ Jenkinsci/docker/blob/master/Dockerfile) ar trebui să vedeți, în partea de jos

    USER ${user}

    această sintaxă poate fi un pic confuz. Acesta utilizează construi Docker „argumente” pentru a vă permite să definiți utilizatorul. Dacă căutați mai departe fișierul Docker, veți găsi valoarea implicită. Uită-te în partea de sus a fișierului Dockerfile pentru

    ARG user=jenkins

    acest lucru creează argumentul „utilizator” (ARG) și îl setează la utilizatorul Jenkins. Acest lucru vă permite să schimbați numele de utilizator pe care Jenkins îl folosește atunci când apelați docker build –build-arg somevariable=somevalue. Rețineți că acest lucru funcționează numai dacă construiți fișierul Dockerfile de la zero. Nu puteți modifica aceste valori cu un Docker pull sau un Docker run. Puteți citi mai multe despre construiți argumente aici. Deoarece folosim o versiune precompilată în clauza noastră FROM, ajungem la utilizatorul implicit:”jenkins”.

    în Linux normal ai folosi doar SUDO sau alte mijloace pentru a crea folderul (/var/log este deținut de root). Din fericire pentru noi Docker ne permite să comutăm utilizatorii.

    adăugați următoarele la fișierul Docker:

    1. Înainte de a rula linia mkdir adăugați

    USER root

    2. După linia de rulare mkdir adăugați

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

    3. După linia RUN chown adăugați:

    USER jenkins

    rețineți că a trebuit să adăugăm și o comandă chown, deoarece dorim ca utilizatorul Jenkins să poată scrie în folder. Apoi, setăm root și apoi resetăm Jenkins, astfel încât comportamentul Dockerfile să fie păstrat.

    acum construiește-ți din nou imaginea:

    docker build -t myjenkins .

    și… erorile tale ar trebui să dispară.

    cu setul de directoare log (vă rugăm să rețineți: puteți plasa acest folder oriunde doriți, folosim /var/log pentru consecvență) acum îi putem spune lui Jenkins să scrie în acel folder la pornire modificând variabilele de mediu JENKINS_OPTS.

    în fișierul Dockerfile editați linia JENKINS_OPTS pentru a arăta astfel:

    • ENV JENKINS_OPTS=” — handlerCountMax = 300 — fișier jurnal = /var/jurnal/jenkins / jenkins.jurnal”

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

    acum construiește-ți imaginea încă o dată

    docker build -t myjenkins .

    să testăm noua noastră imagine și dacă putem urmări fișierul jurnal! Încercați următoarele comenzi

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

    cu containerul de funcționare putem coada fișierul jurnal dacă totul a lucrat

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

    prelua jurnalele dacă JENKINS accidente

    timp pentru o rundă de bonus! Atâta timp cât discutăm jurnalele, Docker prezintă o problemă interesantă dacă Jenkins se prăbușește. Containerul se va opri din funcționare și docker exec nu va mai funcționa. Deci, ce să fac?

    vom discuta mai târziu modalități mai avansate de persistență a fișierului jurnal. Deocamdată, deoarece containerul este oprit, putem copia fișiere din acesta folosind comanda docker cp. Să simulăm un accident oprind containerul, apoi recuperând jurnalele:

    1. ctrl-c pentru a ieși din coada fișierului jurnal

    2. Rulați următoarele comenzi

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

    concluzionând gânduri

    puteți găsi toate lucrările în tutorialul meu git repo (și confortul actualizat makefile) aici:

    • https://github.com/maxfields2000/docker Jenkins_tutorial / copac / maestru / tutorial_02

    făcând propriul nostru fișier Dockerfile care înfășoară fișierul Cloudbees, am reușit să ne facem viața puțin mai ușoară. Am creat un loc convenabil pentru a stoca jurnalele și am învățat cum să le privim cu comanda Docker exec. Ne-am mutat setările implicite în Dockerfile și acum putem stoca acest lucru în controlul sursei ca o piesă bună de auto-documentare.

    avem încă o provocare de persistență a datelor. Am învățat cum să extragem fișierele jurnal dintr-un container oprit (la îndemână atunci când Jenkins se blochează). Dar, în general, dacă containerul nostru se oprește, tot pierdem toate locurile de muncă pe care le-am creat. Deci, fără persistență, această imagine Jenkins este utilă doar pentru dezvoltarea și testarea locală.

    asta ne conduce la următorul articol. Cu fundațiile noastre în loc-propriul nostru Dockerfile wrapper, blocat la o versiune la îndemână a Jenkins – putem rezolva problema persistenței. Următorul articol va explora aceste concepte:

    • păstrarea Jenkins de locuri de muncă și de date Plugin

    • persistența datelor Docker cu volume

    • realizarea unui container de volum de date

    • partajarea datelor în volume cu alte containere

    pentru mai multe informații, consultați restul acestei serii:

    Partea I: gândirea în interiorul containerului
    Partea II: punerea Jenkins într-un Container Docker (acest articol)
    Partea III: Docker & Jenkins: date care persistă
    Partea IV: Jenkins, Docker, proxy-uri, și compune
    Partea V: Preluarea controlului asupra imaginii Docker
    Partea VI: construirea cu Jenkins în interiorul unui container Docker efemer
    partea VII: Tutorial: construirea cu Jenkins în interiorul unui container Docker efemer
    partea VIII: DockerCon Talk și povestea de până acum

Lasă un răspuns

Adresa ta de email nu va fi publicată.