Riot Games

i denne første opplæringen I Docker-serien, vil du lære:

  • Hva vi prøver å oppnå På Riot

  • Grunnleggende oppsett For Docker

  • Grunnleggende Docker Pull Kommandoer

  • hvordan kjøre Docker Containere som Daemons

  • Grunnleggende jenkins konfigurasjonsalternativer

Da jeg først begynte å lære Om Docker for et år siden og utforske bruken, hadde jeg problemer med å finne god dokumentasjon og eksempler – selv i dag beskriver mange enkle brukssaker som til slutt ikke er produksjonsklare. Produksjon av Applikasjoner med Docker-beholdere krever tilpasning til deres flyktige natur og enkeltprosess fokus. Dette gir utfordringer til applikasjoner med data persistence behov eller multi-prosess arkitekturer.

som jeg nevnte i mitt siste innlegg, bruker Vi Jenkins som et grunnleggende stykke åpen kildekode, på toppen av hvilken vi bygger vår automatisering. Jenkins er også et flott program for å demonstrere en måte å tenke på «Dockerizing» dine applikasjoner. Vi distribuerer Jenkins med disse arkitektoniske komponentene i tankene:

  • Jenkins master server (Java prosess)

  • jenkins masterdata (Plugins, Jobbdefinisjoner, etc)

  • NGINX web proxy (vi bruker SSL certs etc, MED NGINX er et enkelt valg her)

  • Bygg slaveagenter (maskiner som ENTEN ER SSH ‘ d inn, ELLER JNLP kobler Til, Jenkins Master)

Dette er et godt sted å begynne. Over denne serien av blogginnlegg vil jeg dekke måter å tenke på alle de ovennevnte som containere og avslutte med et avansert blikk på måter å bruke Docker containere som bygge slaver. For det første lager vi En Jenkins master server i En Docker-beholder. Deretter fortsetter vi å håndtere data utholdenhet og legge til en web proxy MED NGINX.

Hele denne bloggserien vil dekke Følgende Docker-konsepter:

  • Lag dine Egne Dockerfiles

  • Minimere bildeavhengigheter på offentlige bilder

  • Opprette Og bruke Datamengder, inkludert sikkerhetskopier

  • Opprette containerized» Bygge Miljøer «ved hjelp av containere

  • Håndtering av «hemmelige» data med bilder og Jenkins

hvis du ikke har tatt en titt på Cloudbees Jenkins Docker-bildet, start det som det er egentlig ganske bra. Dette var mitt referansepunkt da jeg først tenkte på å kjøre Jenkins i En Docker-beholder, og for mange mennesker kan dette være tilstrekkelig. Du finner dokumentasjonen deres her og deres Git repo/Dockerfile her.

denne første bloggen er delt inn i to leksjonsplaner. Hver er dimensjonert for å ta ca 30 minutter å fullføre. Først opp, del en er å få utviklingsmiljøet ditt klart og lære å jobbe med standard Jenkins Docker-beholderen Som Cloudbees tilbyr. Del to handler om å legge grunnlaget for å pakke dette bildet i din egen Dockerfile og ta mer elegant kontroll over bildet. Sammen er De designet for å komme i gang, spesielt hvis Du aldri har jobbet med Docker før eller er relativt ny For Docker-selv om de antar at du allerede vet og forstår hvordan du skal jobbe med Jenkins. Hvis Du har erfaring Med Docker, vil noe av materialet I Leksjon 1 være litt av en rehash av ting du sikkert allerede vet.

LEKSJON 1: SETT OPP og KJØR DITT FØRSTE BILDE

La oss få deg klar til å rulle. Her på Riot jobber Vi Med Docker (Og Jenkins) På Windows, Mac OSX og Linux. Jeg foretrekker Å jobbe Med Docker PÅ OSX, selv om Den er perfekt funksjonell På Windows siden Docker 1.6. I disse dager er det gode installatører for begge operativsystemene. Jeg skal jobbe FRA ET OSX-perspektiv, men de samme verktøyene finnes For Windows.

FORHÅNDSKRAV:

1. Du trenger Windows 10 Pro Eller Mac OSX Yosemite 10.10.3 (eller nyere)

2. Hvis Du bruker Windows, må Du sørge For At Du har Windows Virtualisering aktivert (se dokumentasjonen Docker gir)

ET RASKT NOTAT PÅ KITEMATIC

Med Docker 1.8 Og utgivelsen Av Docker Toolbox, Inkluderer Docker nå «Kitematic», et greit GUI-verktøy for å administrere og visualisere hva som skjer med Docker-bildene og beholderne. Mesteparten av denne opplæringen fokuserer på å bruke kommandolinjeargumenter og arbeide Med Docker uten Kitematic GUI. Dette er for å bedre utsette deg for de underliggende mekanismene. På samme måte, i senere blogger begynner jeg å dekke Bruken Av Compose for å starte og stoppe flere beholdere samtidig.

TRINN 1: INSTALLER DOCKER

1. Gå til: https://www.docker.com/docker-mac eller https://www.docker.com/docker-windows

2. Last ned Og installer Den riktige Versjonen Av Docker for operativsystemet

3. Følg alle oppsettinstruksjonene.

4. Kontroller at installasjonen fungerer ved å åpne det anbefalte skallet FOR OS (Terminal FOR OSX, Powershell for windows) ved å kjøre «Docker Quickstart Terminal». På Windows vil dette være en snarvei på skrivebordet ditt. PÅ OSX finner du den i mappen programmer / Docker. Kontroller følgende kommandoer og sørg for at du ikke får noen feil

docker ps
docker info

5. Før vi gjør noe annet, bør Vi øke standardminne Og CPU-innstillingene Docker bruker. Senere skal Vi stille Inn Jenkins for å bruke mer minne, og hvis Vi ikke justerer disse innstillingene først, Kan Jenkins krasje.

  • Gå Til Docker-widgeten i verktøylinjen og velg «Innstillinger»

  • Gå Til Fanen Avansert konfigurasjon

  • Øk CPU-bruken til minst 4 kjerner

6. Øk minnebruken til MINST 8GB, helst mer, noe SOM 12GB for å være trygg (hvis du har den tilgjengelig)

TRINN 2: TREKK OG KJØR CLOUDBEES JENKINS-BEHOLDEREN

1. Bo i Docker terminal vinduet.

2. Trekk Jenkins fra det offentlige repo ved å kjøre:

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

3. Merk at meldingen» Jenkins initial setup » i shell-vinduet vil generere et passord for deg. Skriv det ned som du trenger det senere. Hvis du mister det, kan du kjøre `docker exec jenkins-master cat /var/jenkins_home/secrets/initialAdminPassword` med beholderen kjører for å hente den.

4. Åpne din favoritt nettleser og pek den til http://localhost:8080

Vær oppmerksom på at du vil se at jeg bruker Docker-navn flagg og navn container jenkins-master-dette er en konvensjon jeg vil bruke i hele denne bloggen. Å navngi beholderne er en praktisk beste praksis med tre fordeler:

1. Det gjør dem enkle å huske og samhandle med

2. Docker tillater ikke at to beholdere har samme navn, noe som forhindrer feil som ved et uhell å starte to identiske

3. Mange vanlige Docker-verktøy (Som Docker Compose) bruker bestemte containernavn, så det er en god beste praksis å bli vant til å navngi beholderne dine.

TRINN 3: GJØR dette LITT MER PRAKTISK

det forrige trinnet starter Jenkins med sine mest grunnleggende oppstartsinnstillinger. Du kan til Og med se At Jenkins trenger grunnleggende config og ber deg om Et Administratorpassord (som du kan få fra loggene som vises på skjermen under oppstart). Hvis Du er Som Riot, er det lite sannsynlig at Du kjører Jenkins på standardinnstillinger. La oss gå gjennom å legge til noen nyttige alternativer. Vi vil ikke bry deg med å konfigurere Jenkins ennå; det er nok å vite at det kan starte og løpe.

TRINN 3A: DAEMONIZING

du vil sannsynligvis ikke se Jenkins logger spy til standard ut mesteparten av tiden. Så bruk Docker daemon flagget for å starte beholderen (-d).

1. Ctrl-c på terminalvinduet kjører beholderen din for å stoppe den

2. Kjør følgende kommandoer

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

Nå bør du bare få en hash-streng vist og bli returnert til terminalen din. Hvis Du er ny Til Docker, er hash-strengen faktisk den unike IDEN til beholderen din (nyttig hvis du begynner å automatisere disse kommandoene).

TRINN 3B: MINNEINNSTILLINGER

Vi pleier å kjøre Jenkins med noen tykke innstillinger på Riot. Husk da du økte CPU / Minne Docker bruker tidligere? Dette er den primære grunnen til at. For en grunnleggende start, kjør følgende kommandoer

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

Det burde gi Jenkins et fint 8 GB minnebasseng og plass til å håndtere søppelsamling.

TRINN 3C: ØKE TILKOBLINGSBASSENGET

På Riot får vi mye trafikk til Jenkins-serveren vår, så vi har lært Å gi Jenkins litt mer pusterom. Kjør følgende

docker stop jenkins-master
docker rm jenkins-master

Det vil gi Jenkins en fin base pool av handlers og en cap. Tilfeldigvis har du nå lært å bruke BÅDE JAVA OPTS og JENKINS OPTS som miljøvariabler på en meningsfylt måte. Vær oppmerksom på, dette fungerer på grunn av hvordan Cloudbees praktisk strukturert Deres Jenkins Dockerfile.

TRINN 4: SETTE ALT sammen

jeg plasserte alt vi lærte her i en enkel makefile, slik at du kan bruke lag kommandoer for å kontrollere å kjøre Jenkins docker-beholderen. Du finner den her:

  • https://github.com/maxfields2000/docker Jenkins_tutorial / tre / master / tutorial_01

du kan bruke følgende kommandoer:

  • gjør bygge-Trekker Jenkins bilde

  • gjør run-Kjører beholderen

  • gjør stopp-Stopper beholderen

  • gjør rent-Stopper og sletter den eksisterende beholderen

Du trenger ikke å bruke makefile, jeg finner det bare enklere enn å skrive ut hele kjørekommandoen. Du kan enkelt sette disse i et skript du velger i stedet.

Forhåpentligvis ser Du hvor lett Det er å komme i gang Med Docker og Jenkins. Jeg har prøvd å gi deg noen grunnleggende alternativer for å ta standard Cloudbees Jenkins-beholderen og gjøre den litt mer brukbar. Cloudbees har mange nyttige opplæringsprogrammer for å kjøre beholderen, for eksempel hvordan du forhåndsinstallerer plugins og lagrer Jenkins-data.

det bringer meg til fremtidige innlegg om emnet. Denne beholderen / bildet er nyttig, men har noen ulemper: ingen konsekvent logging, ingen utholdenhet, ingen webserver proxy foran den, og ingen ren måte å garantere at du bruker den versjonen Av Jenkins du vil ha. Dette bringer opp spørsmål som: hva om du vil holde fast i en eldre versjon? Eller hva om du vil bruke den nyeste tilgjengelige utgivelsesperioden?

i neste leksjon vil jeg dekke å gjøre denne beholderen litt mer robust. Spesielt:

  • Opprette din egen Dockerfile å pakke Cloudbees basen

  • Flytte noen av miljøvariablene inn i dette nye bildet

  • Opprette en loggmappe, angi tillatelser og andre nyttige jenkins-kataloger, og hente Jenkins-loggene mens den kjører

LEKSJON 2-EN JENKINS BASE IMAGE WRAPPER

i forrige leksjon diskuterte jeg å sette opp et utviklingsmiljø for å kjøre Docker og eksperimenterte med Jenkins Docker-bildet levert av Cloudbees. Vi fant ut at det var enkelt og lett å bruke, med noen flotte funksjoner ut av boksen. For å gjøre fremskritt i forbedringsområdene vi identifiserte, Er Docker-konseptene dekket i denne leksjonen:

  • Lag din Egen Dockerfile

  • Angi miljøvariabler i En Dockerfile

  • Opprette mapper og tillatelser i En Dockerfile

  • bruke docker exec til å kjøre kommandoer mot en løpende beholder

GJØR DIN BASE DOCKERFILE

Vi vil gjøre noen endringer i Hvordan Jenkins starter som standard. I den siste bloggen håndterte vi dette ved å lage en makefile som passerte i argumenter som miljøvariabler. Gitt at vi vil gjøre dette hver gang, kan vi bare flytte dem inn i vår egen Dockerfile. I tillegg vil vår egen Dockerfile la oss låse versjonen Av Jenkins vi bruker i tilfelle Cloudbees oppdaterer deres, og vi er ikke klar til å oppgradere.

Vi gjør dette i fire trinn:

1. Opprett en arbeidskatalog

2. I din favoritt tekstredigerer, opprett en ny fil som heter»Dockerfile»

3. Legg til følgende i filen og lagre den:

FROM jenkins/jenkins:2.112LABEL maintainer=""

4. Deretter på kommandolinjen skriv inn:

docker build -t myjenkins .

Det vi gjorde her var å trekke en bestemt versjon Av Jenkins-bildet fra den offentlige docker repo. Du finner alle tilgjengelige versjoner her:

  • DU kan alltid angi FROM-klausulen for å være hvilken versjon av bildet som er tilgjengelig. Du kan imidlertid ikke bare sette versjonen til hvilken versjon Av Jenkins du vil ha. Dette er bildeversjonen » tag «eller » label», og Cloudbees er hyggelig nok til å få det til Å matche jenkins-versjonen inne i bildet. Cloudbees tilbyr «jenkins/jenkins» som en praktisk måte å få den nyeste versjonen på, eller «jenkins / jenkins:lts» for å få den nyeste «Long Term Support» – versjonen. I dette eksemplet bruker jeg en bestemt versjon. Disse kodene som merker typer utgivelser er gode, men ved å bruke Dem betyr at versjonen Av Jenkins kan endres under deg, noe som kan føre til komplikasjoner hvis du ikke var klar til å oppgradere. Jeg anbefaler «versjonslåsing» som en generell beste praksis når det gjelder avhengigheter I Docker eller andre avhengighetsstyringsverktøy. Du vil at ting skal endres når du har tenkt dem til, ikke før. Derfor bruker jeg en bestemt versjon her.

    TESTING AV DEN NYE DOCKERFILE

    Vi kan bytte over til bildet veldig enkelt ved å endre vår docker run-kommando til følgende:

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

    Nå kan vi rydde disse miljøvariablene ved å plassere dem i vår egen Dockerfile.

    LEGGE TIL MILJØVARIABLER I VÅR DOCKERFILE

    det er enkelt å legge til standardinnstillinger for ting som miljøvariabler Til Dockerfiles. Dette gir også et fint stykke selvdokumentasjon. Og fordi du alltid kan overskrive disse når Du kjører Docker-beholderen, er det egentlig ingen ulemper.

    1. I Dockerfile legger du til følgende linjer etter» VEDLIKEHOLDER » – linjen:

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

    2. Lagre og gjenoppbygge bildet:

    • docker bygge-t myjenkins .

    docker build -t myjenkins .

    Ganske enkelt! Du kan teste at det fortsatt fungerer ved å skrive inn følgende tre kommandoer:

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

    bildet ditt skal starte rett opp! Men hvordan vet du at miljøvariablene fungerte? Enkel: på samme måte som du ville sjekke for å se hvilke argumenter som startet Jenkins-appen din, normalt ved hjelp av ps. Og dette fungerer selv om du utvikler På Windows.

    KJØRER EN GRUNNLEGGENDE KOMMANDO MOT BEHOLDEREN

    for å bekrefte At Java-og Jenkins-alternativene er riktig angitt, kan vi kjøre ps i vår beholder og se den løpende Jenkins Java-prosessen ved å bruke docker exec

    docker exec jenkins-master ps -ef | grep java

    du bør se noe som ligner på dette komme tilbake

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

    Fra dette, du kan enkelt se våre innstillinger har fast. docker exec er en enkel måte å utføre shell kommandoer inne i beholderen og også en utrolig enkel måte å inspisere dem. Dette fungerer selv På Windows fordi, husk, kommandoen etter «exec» blir kjørt inne i beholderen og dermed er basert på hva base bilde beholderen bruker.

    SETTE OPP EN LOGGMAPPE

    i forrige blogg bemerket vi at vi mistet synligheten til jenkins-loggene når vi kjørte vår beholder med daemonize-flagget (- d). Vi vil bruke den innebygde Jenkins-funksjonen til å sette en loggmappe. Vi må gjøre dette i Vår Dockerfile og deretter passere i loggingsalternativet Til Jenkins.

    la oss redigere Vår Dockerfile igjen. Mellom» VEDLIKEHOLDER » og første ENV-linje skal vi legge til følgende

    RUN mkdir /var/log/jenkins

    vi plasserer kommandoen på dette stedet i filen for å følge beste praksis. Det er mer sannsynlig at vi vil endre miljøvariablene enn disse oppsettkatalogene, og hver kommandolinje i En Dockerfile blir i hovedsak sitt eget bildelag. Du maksimerer gjenbruk av lag ved å sette ofte endrede elementer nær bunnen.

    bygg nå bildet ditt igjen:

    docker build -t myjenkins

    du får en feil som ser ut som

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

    Ingen bekymringer. Dette skyldes at Standard Cloudbees-beholderen setter den kjørende brukeren til» Jenkins » – brukeren. Hvis du ser på Deres Dockerfile (funnet her: https://github.com/ Jenkinsci/docker/blob/master / dockerfile) bør du se, nær bunnen

    USER ${user}

    denne syntaksen kan være litt forvirrende. Den bruker Docker bygge «argumenter» for å tillate deg å definere brukeren. Hvis du ser lenger Opp Docker-filen, finner du standardverdien. Se nær toppen av Dockerfile for

    ARG user=jenkins

    dette skaper» bruker » argumentet (ARG) og setter Det Til jenkins brukeren. Dette lar deg endre brukernavnet Som Jenkins bruker når du ringer docker build –build-arg somevariable=somevalue. Merk at dette bare fungerer hvis Du bygger Dockerfile fra bunnen av. Du kan ikke endre disse verdiene med en docker pull eller en docker run. Du kan lese mer om bygge argumenter her. Fordi vi bruker en forhåndsbygd versjon i VÅR FROM-klausul, ender vi med standardbrukeren: «jenkins».

    i normal Linux vil du bare bruke SUDO eller andre måter å lage mappen (/var / log eies av root). Heldigvis For Oss Docker lar oss bytte brukere.

    Legg til Følgende I Dockerfilen:

    1. Før KJØR mkdir linje legg

    USER root

    2. Etter KJØR mkdir linje legge

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

    3. Etter KJØR chown linje legge:

    USER jenkins

    Merk at vi måtte også legge til en chown-kommando fordi Vi vil At jenkins-brukeren skal kunne skrive til mappen. Deretter setter vi rot og tilbakestiller Jenkins slik at dockerfilens oppførsel blir bevart.

    bygg nå bildet ditt igjen:

    docker build -t myjenkins .

    Og… dine feil skal være borte.

    med loggkatalogsettet (merk: du kan plassere denne mappen hvor du vil, vi bruker /var / log for konsistens) vi kan nå fortelle Jenkins å skrive til den mappen ved oppstart ved å endre MILJØVARIABLENE JENKINS_OPTS.

    i Dockerfile rediger JENKINS_OPTS-linjen for å se slik ut:

    • ENV JENKINS_OPTS=» — handlerCountMax = 300 — loggfil= / var / logg / jenkins / jenkins.logg inn»

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

    bygg nå bildet ditt en gang til

    docker build -t myjenkins .

    La oss teste vårt nye bilde, Og hvis vi kan hale loggfilen! Prøv følgende kommandoer

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

    med beholderen kjører vi kan hale loggfilen hvis alt fungerte

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

    HENTE LOGGER HVIS JENKINS KRASJER

    tid for en bonusrunde! Så lenge Vi diskuterer logger, Presenterer Docker et interessant problem hvis Jenkins krasjer. Beholderen vil slutte å kjøre og docker exec vil ikke lenger fungere. Så hva skal jeg gjøre?

    vi vil diskutere mer avanserte måter å fortsette loggfilen senere. For nå, fordi beholderen er stoppet, kan vi kopiere filer ut av det ved hjelp av docker cp-kommandoen. La oss simulere en krasj ved å stoppe beholderen, og deretter hente loggene:

    1. ctrl-c for å gå ut av loggfilens hale

    2. Kjør følgende kommandoer

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

    AVSLUTTENDE TANKER

    du finner alt arbeidet i min opplæring Git repo (og den oppdaterte bekvemmeligheten makefile) her:

    • https://github.com/maxfields2000/docker Jenkins_tutorial / tre / master / tutorial_02

    Ved å lage vår egen Dockerfile som bryter Cloudbees-filen, kunne vi gjøre livet litt enklere for oss selv. Vi satte opp et praktisk sted å lagre loggene og lærte å se på dem med docker exec-kommandoen. Vi flyttet våre standardinnstillinger i Dockerfile og nå kan vi lagre dette i kildekontroll som et godt stykke selvdokumentasjon.

    vi har fortsatt en data utholdenhet utfordring. Vi har lært å trekke loggfiler ut av en stoppet beholder (praktisk når Jenkins krasjer). Men generelt hvis vår container stopper, mister vi fortsatt alle jobbene vi opprettet. Så uten utholdenhet Er dette Jenkins-bildet bare nyttig for lokal utvikling og testing.

    det fører oss til neste artikkel. Med våre stiftelser på plass-vår egen Dockerfile wrapper, låst til en praktisk versjon Av Jenkins – vi kan løse utholdenhet problemet. Den neste artikkelen vil utforske disse konseptene:

    • Bevare Jenkins Jobb og Plugin data

    • Docker Data Utholdenhet Med Volumer

    • Å Lage En Data-Volum container

    • Dele data i volumer med andre beholdere

    for mer informasjon, sjekk ut resten av denne serien:

    Del I: Tenker Inne I Beholderen
    Del II: Sette Jenkins i En Docker Container (denne artikkelen)
    Del III: Docker & Jenkins: Data Som Vedvarer
    Del IV: Jenkins, Docker, Proxyer Og Komponere
    Del V: Ta Kontroll Over Docker-Bildet
    Del VI: Bygg Med Jenkins Inne I En Ephemeral Docker-Beholder
    Del VII: Opplæring: Bygg Med Jenkins Inne I En Ephemeral Docker-Beholder
    Del VIII: DockerCon Talk og Historien Så Langt

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.