docker - media.formandome.es · node.js rust go microservices cassandra hadoop. 2.7 instalaciÓn de...

65
DOCKER JUANDA MAYO 2015

Upload: donga

Post on 26-Sep-2018

230 views

Category:

Documents


0 download

TRANSCRIPT

DOCKERJUANDAMAYO2015

1TALLERSOBREDOCKER

1.1ESTRUCTURATALLERExplicacióngeneralsobreDockerInstalaciónConfiguraciónRegistrodeimágenesdockerdelCPIFPLosEnlacesydescargadeimágenesPrácticaconDockerHaypocotiempo,peroDockeresmuyeficiente:-)

2INTRODUCCIÓN

2.1¿QUÉESDOCKER?Vamosaintentaraclararloantesdeempezareltaller

2.2DEFINICIONESDEDOCKERUnentornochrootUncontratoentredesarrolladoresyadministradoresdesistemasUnempaquetadordeaplicacionesUnsistemadevirtualización

2.3DOCKERESUNENTORNOCHROOTchrootseutilizanormalmenteparaconexionesftposshElusuarionoveciertapartedelamáquina,porejemploaotrosusuarios.Endockerseenjaulaporlasdependenciasentrepaquetes,noparaaislarusuarios

2.4DOCKERESUNCONTRATOENTREELSYSADMINYELDESARROLLADOR

Unaaplicaciónsehaceporpiezas,comolastelevisionesylosordenadoresPeroelensamblajesehacemásdeunavez:EnfasededesarrolloEnfasedetestingEnfasedeproducción

Ynotodoslasensamblandelamismamanera:-(

2.5¿CÓMOESUNADMINISTRADORDESISTEMAS?

LepreocupalaestabilidaddeSUmáquinaQuiereusarlodesiempreSialgofunciona,paraquecambiarlo

Tieneuntickyejecutaamenudocomandosdeltipo:topwhotail-f/var/log/sysloguptime...

2.6¿CÓMOESUNDESARROLLADOR?LepreocupalafuncionalidaddesusaplicacionesQuiereusarloúltimo:Node.jsRustGoMicroservicesCassandraHadoop

2.7INSTALACIÓNDEPAQUETESPARAUNSYSADMIN

InstalapaquetesaniveldeS.O.Seinstalandemaneraglobal,paratodoelsistema

Debeserrígidoycuidadosoconlasversiones:#apt-getinstallxxxx...Youmightwanttorun'apt-get-finstall'tocorrectthese:Thefollowingpackageshaveunmetdependencies:xxxxxxxxxxxx

2.8GESTIÓNDEPAQUETESPARAUNDESARROLLADOR

TrabajaenvariosproyectosUtilizansuspropiosgestoresdepaquetesInstalacióndepaquetesInstalaciónglobal,paratodoelsistema.Raro,raro,raro.Instalaciónlocal,específicaparacadaproyectoEnPythonpodríasermediantepipdentrodeunentornovirtualenvEnRubymedianteRubyGemsnodejsconsunpmbowerparadesarrolloenfrontend....

2.9¿QUÉPIENSAELSYSADMINDELDESARROLLADOR?

EldesarrolladorquiereentrarenSUmáquinaYademáslequieretocarSUSpaquetes

2.10¿QUÉPIENSAELDESARROLLADORDELADMINISTRADOR?

Unrarito:noquierecompartirsumáquinaElúltimoobstáculoparallegaralameta

2.11DOCKERESUNCONTRATOENTREELSYSADMINYELDESARROLLADOR

EladministradorsolosedebeencargardeldespliguedeloscontainersEldesarrolladorpuedehacerloquelevengaengana,siempreycuandolometaenuncontainer

2.12DOCKERESUNEMPAQUETADORDEAPLICACIONES

CreauncontainerparalaappdemodoqueseejecutenigualendistintasmáquinasBuild,ShipandRunAnyApp,AnywherePodríamospensarenuncontainercomounamáquinavirtualsinSOpropio

2.13DOCKERESUNSISTEMADEVIRTUALIZACIÓN

ElHostdebeserLinuxPodríamoshablardeunamáquinavirtualligeraLossistemasdevirtualizacióntradicionalesintentanoptimizar/adelgazarlacapacomún(HostOSyHypervisor).HostOSeHypervisorpuedenserunaúnicacapa

2.14VIRTUALIZACIÓNTRADICIONAL

Unsistemacompletamentevirtualizadoobtienesupropioconjuntoderecursos(cpu,ram,discoored)

2.15VIRTUALIZACIÓNENDOCKERElniveldeaislamientoesmenor:Losprocesosqueseejecutanencadacontainersepuedenverdesdeelhost:

pstreeDocker

Consumemenosrecursosyesmásligero(¡unúnicosistemaoperativo!)

2.16COMPARATIVACARACTERÍSTICAS

2.17TAMAÑOIMÁGENESDEDOCKERLasmáquinasvirtualesocupanbastante(variosGBytes)NosonlomásprácticoparaalmacenajeMenostodavíaparatransferencia

Lasimágenesdedockerocupanmenosde1GByte$dockerimagesREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEmongolatest5242d1368ac49daysago255.9MBnodelatestf709efdf393f9daysago710.9MBmysql556f320bd6adc2weeksago282.9MBmysqllatest56f320bd6adc2weeksago282.9MBwordpress4.1.2-fpme83a380ff3382weeksago432.9MBwordpressapache4cde06295aba2weeksago459.8MBubuntu14.04.2b7cf8f0d9e822weeksago188.3MBubuntulatestb7cf8f0d9e822weeksago188.3MBubuntutrustyb7cf8f0d9e822weeksago188.3MBitzg/minecraft-serverlatest94759ec42cdd5weeksago397.7MB

2.18TIEMPODEARRANQUEEltiempodearranquedeunamáquinavirtualsemideenminutos.Eltiempodearranquedeuncontaineramenudoesinferiora1segundoCuestalomismocrearuncontainernuevoquereiniciarlaaplicacióndelcontainerquesehaquedadocolgadaSeintroduceunconceptonuevo,containersdeunsolouso

2.19INTEGRACIÓNParaintegrarmáquinasvirtualesenunhost,debemosestablecerlared.MedianteDockerlaintegracióndecontainersesdirecta.

2.20OTRASVENTAJASComoconsumentanpocosrecursos,podemosgeneraruncontainerporcadaservicio:bbddservidorwebserviciodecachéserviciodebackup

Alsermenosespecíficos,sevuelvenmásreusablesAlserreusables,secompartenmedianterepositoriosLasarquitecturasdelasaplicacionessevuelvenmásdinámicasytesteablesPodemoscambiarnuestroservidorwebdeApacheaNginxencuestióndesegundos.

2.21HISTORIAYFUTUROAntesdelasVM:PorcadaaplicaciónseutilizabaunservidorSecumplianlasdependenciasdelasaplicacionesUnfalloenunaaplicaciónnoafectabaaotraEl95%deltiempoelservidorestabaocioso.

ConlasVM:Seusaunservidorenelqueseinstalaunamáquinavirtualporservicio:SeoptimizaelusodelservidorAúnasínecesitamosunamáquinavirtualporaplicaciónparadarestabilidadycumplirdependencias.

ConcontainersEvitamostenerqueusarunamáquinavirtual(SO)porservicio

2.22GOOGLETRENDSTendenciasdebúsquedaenSilliconValleydesdeJulio2013hastaahora

2.23QUIENUSADOCKERTodavíapocosEmpresaspionerasenInternetcomo:

3INSTALACIÓNDEDOCKER

3.1REQUERIMIENTOSWindowsoMacHacefaltavirtualizar:-(Peroesrápido:-)SeusaEsunadistribucióndeLinuxligera:24MBRAMconarranqueen~5s

Linux(Ubuntu):64bitsKernel3.10osuperiorPerfectoen14.04(Trusty)

¿Cuáleslaversióndemikernel?

boot2docker

$uname-r3.13.0-51-generic

3.2INSTALACIÓNENUBUNTU14.04Instalamoslospaquetesnecesarios:

$sudoapt-getupdate$wget-qO-https://get.docker.com/|sh

Comprobamosqueseestéejecutando:$sudoservicedockerstatus

Configuramosdockerparapoderlousarsinusuarioroot:$sudousermod-aGdockeradministrador

3.3ACTUALIZACIÓNNosinteresala quetienecambiossignificativos(Abril2015)Comprobamosquelaversiónquetenemosahoraseaactual:

versión1.6

$dockerversionClientversion:1.6.0ClientAPIversion:1.18Goversion(client):go1.4.2Gitcommit(client):4749651OS/Arch(client):linux/amd64Serverversion:1.6.0ServerAPIversion:1.18Goversion(server):go1.4.2Gitcommit(server):4749651OS/Arch(server):linux/amd64

¿Cómoactualizar?$wget-Nhttps://get.docker.com/|sh

Otraopción:$sudosu#servicedockerstop

4DOCKERHUB

4.1¿QUÉESELDOCKERHUB?Esunrepositorioparadescargarimágenes(nuestrasodeotros)Esunreporitoriodondesubirnuestrasimágenes(públicasoprivadas)Tieneserviciosautomatizados(webhooks)SeintegraconGitHubyBitBucket

4.2REGISTRO/LOGINENDOCKERHUBElregistronoesnecesarioparadescargarseimágenes(push)Elregistroesnecesarioparasubirimágenes(pull)Nospodemosregistrarvíaconsola,másrápidoqueporweb:$dockerlogin

4.3BÚSQUEDADEIMÁGENESMediantelíneadecomandos,porejemplodockersearchubuntuVíaweb:

Normalmenteutilizaremosrepositoriosoficiales(másgarantías)

https://registry.hub.docker.com/>

4.4¿YSIUTILIZAMOSNUESTROPROPIOREGISTRO?

Lonecesitamosparahacerpruebasdesdeaulayaqueelanchodebandanoessuficiente.

Nuestroregistroestáconfiguradoenlamáquinadockerreg.inf.enlacesComprobamosquenuestramáquinaresuelvelaIpdelregistro:dockerreg.inf.enlacesParapodertrabajarconnuestroregistro,necesitamoscomoDNSlaIP172.30.160.254Otraopciónesañadirlaentradaenelfichero/etc/hosts

¿Cómoconfigurarunregistroprivado?

4.5PRUEBADEACCESOANUESTROREGISTROIntentamosdescargarunaimágendenuestroregistro:$dockerpulldockerreg.inf.enlaces:5000/ubuntu

Lacosanovabien:FATA[0000]Errorresponsefromdaemon:v1pingattemptfailedwitherror:Gethttps://dockerreg.inf.enlaces:5000/v1/_ping:tls:oversizedrecordreceivedwithlength20527.IfthisprivateregistrysupportsonlyHTTPorHTTPSwithanunknownCAcertificate,pleaseadd`--insecure-registrydockerreg.inf.enlace:5000`tothedaemon'sarguments.InthecaseofHTTPS,ifyouhaveaccesstotheregistry'sCAcertificate,noneedfortheflag;simplyplacetheCAcertificateat/etc/docker/certs.d/dockerreg.inf.enlaces:5000/ca.crt

Nuestroregistroprivadodemomentoesmuybásico:Nosepuedeconsultar(dockersearch)Notienecertificados(accesosinhttps)

4.6CONFIGURACIÓNDEDOCKERPARAACCEDERALREGISTRO

Habilitamoslasconexionesinsegurasen/etc/defaul/dockermedianteestalínea:DOCKER_OPTS="--insecure-registrydockerreg.inf.enlaces:5000"

Reiniciamosdocker:$sudoservicedockerrestart

Probamossufuncionamiento$dockerpulldockerreg.inf.enlaces:5000/ubuntu

Podemoscomprobarqueyatenemosesaimagenalmacenadaenlocal$dockerimages

4.7IMÁGENESENNUESTROREPOSITORIOLasjustasparahacerlademo:

administrador@dockerreg:~$dockerimagesREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEwordpresslatest5ff368875b772daysago460.3MBdockerreg.inf.enlaces:5000/wordpresslatest5ff368875b772daysago460.3MBregistry2.02971b6ce766c9daysago548.1MBdockerreg.inf.enlaces:5000/ubuntulatest07f8e8c5e66010daysago188.3MBubuntulatest07f8e8c5e66010daysago188.3MBdockerreg.inf.enlaces:5000/mysqllatest56f320bd6adc2weeksago282.9MBmysqllatest56f320bd6adc2weeksago282.9MB

ObservaqueestánduplicadasCambiamossurepositorioparaqueesténaccesiblesdeformaprivada.

5TRABAJARCONCONTENEDORES

5.1EJECUCIÓNDEUNCONTENEDOR$dockerrundockerreg.inf.enlaces:5000/ubuntu/bin/echo'Helloworld'

Silaimagen(ubuntu:14.04)noexiste,sedescargarádeformaautomáticaUnavezdescargada,seintroduceenuncontenedoryseejecutaelcomandoecho.Utilizamosnuestroregistromediantedockerreg.inf.enlaces:5000/ubuntuperopodríamosusareldedockeryescribirsimplemente:$dockerrunubuntu/bin/echo'Helloworld'

5.2CONTENEDORESENEJECUCIÓNMedianteelcomando:

$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

¿Nuestrocontenedornoaparece?SoloaparecenloscontenedoresenejecuciónElcontenedorhahechoelcomandoechoysehaparado.

5.3LISTADODECONTENEDORESSiqueremosvertodosloscontenedores:

$dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES0e487f71a145ubuntu:14.04"/bin/bash"2daysagoExited(0)29hoursagoevil_ardinghelli

Sueleserútilenocasionesverelúltimocontenedorcreado,medianteelcomandodockerps-l(last)

5.4DARNOMBREALOSCONTENEDORESDockerdaunnombreacadacontenedorquearranca:$dockerps-aCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES41fce3d709d1mongo:latest"/entrypoint.sh/bin2daysagoExited(0)2daysagosuspicious_rosalinda51e9bf35ebemongo:latest"/entrypoint.shmong2daysagoExited(100)2daysagoangry_cori0e487f71a145ubuntu:14.04"/bin/bash"2daysagoExited(0)29hoursagomongo97579d465b6eitzg/minecraft-server:latest"/start"2daysagoExited(143)2daysagokickass_ptolemy76fb784e7ce2itzg/minecraft-server:latest"/start"2daysagoExited(143)2daysagoevil_ardinghellid8a4d884ca3ditzg/minecraft-server:latest"/start"2daysagoExited(1)2daysagodistracted_fermi3c950e258972itzg/minecraft-server:latest"/start"2daysagoExited(1)2daysagogoofy_archimedes35c33d510980secure_registry:latest"registrycmd/regist3daysagoExited(2)3daysagoinsane_ptolemyaa87743bd795secure_registry:latest"registrycmd/regist3daysagoExited(1)3daysagomodest_bartik

5.5COMUNICACIÓNCONUNCONTENEDORPodemosarrancarelcontenedoryaccedervíaterminal:$dockerrun-t-i--namemicontenedorubuntu:14.04/bin/bash

Lasalidaestandardelcontenedorsemandaaconsola:$dockerrun--nameholaMundoubuntu:14.04/bin/bash-c"whiletrue;doechoHolaMundo;sleep1;done"

5.6PARARUNCONTENEDORLopararemosmediantedockerstop:

$dockerstopholaMundo

5.7EJECUTARUNCONTENDORENBACKGROUNDElcasoanteriorhubierasidomásútilejecutarloenmodobackground$dockerrun-d--nameholaMundoubuntu:14.04/bin/bash-c"whiletrue;doechoHolaMundo;sleep1;done"

Nosdaunerroryaqueyatenemosuncontenedor(aunqueparado)conesenombre:FATA[0000]Errorresponsefromdaemon:Conflict.Thename"holaMundo"isalreadyinusebycontainer514041140ff2.Youhavetodelete(orrename)thatcontainertobeabletoreusethatname.

Podremosversusalidaestándarmediantedockerlogscontainer-id

5.8BORRADODEUNCONTENEDORParaborraruncontenedoresnecesarioqueesteparado.Recordemoscomandos:Vercontenedoresenejecución:dockerpsVercontenedoresparadosoenejecución:dockerps-aPararuncontenedordockerstopcontainer-idBorraruncontenedordockerrmcontainer-id

6TRABAJARCONIMAGENESDEDOCKER

6.1IMÁGENESENLOCALLasimágenessepuedenbajardelHubdeDocker(dockersearch)odenuestroregistroynuestroequipolasguardaenlocal.$dockerimagesREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEsecure_registrylatest87f01c32b0943daysago548.5MBjuanda/ubuntulatestf83eee4405606daysago202.7MBregistry2.02971b6ce766c8daysago548.1MBgolang1.4ca0f230b927e9daysago517.2MBmongolatest5242d1368ac410daysago255.9MBnodelatestf709efdf393f10daysago710.9MBmysql5.6.2456f320bd6adc2weeksago282.9MBmysqllatest56f320bd6adc2weeksago282.9MBwordpress4.1.2-fpme83a380ff3382weeksago432.9MB

6.2LOSCONTAINERSNOGUARDANDATOSCreamosuncontainernuevoeinstalamosunservidorwebApache:$dockerrun--nameubuntu-t-iubuntu:latest/bin/bashroot@5b973e0439da:/#apt-getinstall-yapache2root@5b973e0439da:/#exit

Unavezquesalimosdelcontainer,elprocesodejadecorreryelcontainersepara.$dockerps$dockerps-a

Silovolvemosaejecutar,lainstalacióndeApachehadesaparecido!!!!$dockerrun--nameubuntu-t-iubuntu:latest/bin/bash

6.3RUNVSSTARTElcomandodockerruncreauncontainernuevoapartirdelaimagenanteriorporesoApache2desapareceElcomandodockerstartarrancaelcontainerqueestáparado,ensuestadoactual.PodemosconectarnosposteriormenteycomprobarcomoApachepermaneceinstaladomedianteelcomandodockerexec

$dockerstartubuntu/bin/bash$dockerexec-t-i<contenedor>/bin/bash

6.4CREARMIIMAGEN:CONCEPTOSBÁSICOSNormalmentenoguardaremosdatosdenuestrasaplicacionesenlasimagenes:QueremosquelasimagenesseanreusablesQueremosqueseanligeras

Paraguardardatos,utilizaremosvolúmenesParacrearunaimagenhaydosmétodos:DeformamanualMedianteunscriptqueautomaticeelproceso:DockerfileAlgoparecidoalusodeVagrantparaVmwareyVirtualBox

6.5CREARUNAIMAGENDEFORMAMANUALDebemospartirdeunaimagenbase,enmicasoubuntu:latestArrancamoslaimagenentrandoenconsolaeinstalamoslospaquetesquequeramosparalaimagen$dockerrun-t-idockerreg.inf.enlaces:5000/ubunturoot@40457ff8d020:/#apt-getinstall-yapache2....root@40457ff8d020:/#exit

6.6COMMITDELAIMAGENUnavezquetenemoslaimagenbaseconlasmodificacionesrealizadas,haremoselcommitTendremosunanuevaimagenenlocal

$dockercommit-m"InstaladoApache2"-a"juanda"40457ff8d020juanda/ubuntu-apache13f1ed84dbcc46ea554e92a307041233252e436311fa88bd5e8c63027c770e1a

40457ff8d020eseliddelcontainerjuanda/ubuntu-apacheeselrepositorioparalaimagenOjo,siqueremossubirlaalHubdeDocker,debecoincidirconnuestrousuarioenDocker.

Posteriormentepodemosejecutaruncontenedorconlanuevaimagen$dockerrun-t-i-rmjuanda/ubuntu-apache

Elparámetrormloponemosparaqueborreelcontenedordespuésdeusarlo(containerdeunsolouso)

6.7COMANDOSPARAUNDOCKERFILE(I)FROM:ParadefinirlaimagenbaseMAINTAINER:NombreeemaildelmantenedordelaimagenCOPY:CopiarunficheroodirectorioalaimagenADD:Paracopiarficherosdesdeurls.Tambiéntars,quedescomprimie.RUN:Paraejecutaruncomandodentrodelcontainer.CMD:Comandopordefectocuandoejecutamosuncontainer.SepuedesobreescribirdesdelaCLI.ENV:Variablesdeentorno

6.8COMANDOSPARAUNDOCKERFILE(II)EXPOSE:Paradefinirlospuertosdelcontenedor.SedeberánañadirdeformaexplícitaenlallamadadesdelaCLI.VOLUME:Paradefinirdirectoriosdedatosquequedanfueradelaimagen.ENTRYPOINT:Comandoaejecutardeformaobligatoriaalcorrerunaimagen.USER:UsuarioparaRUN,CMDyENTRYPOINT.WORKDIR:DirectorioparaejecutarloscomandosRUN,CMD,ENTRYPOINT,ADDyCOPY

6.9CREARUNAIMAGENMEDIANTESCRIPTDockerizamosporejemplounservicio

Creamosel

apt-cacher-ng

[email protected]

VOLUME["/var/cache/apt-cacher-ng"]RUNapt-getupdate&&apt-getinstall-yapt-cacher-ng

EXPOSE3142CMDchmod777/var/cache/apt-cacher-ng&&/etc/init.d/apt-cacher-ngstart&&tail-f/var/log/apt-cacher-ng/*

Creolaimagen,quellamaréjuanda/apache-php:$dockerbuild-tjuanda/apt-cacher-ng.

Loejecutamos:$dockerrun-d-p9999:3142juanda/apa-cacher-ng

Probamoselaccesodesdeelnavegadorhttp://localhost:9999

6.10BORRADODEIMAGENESParaborrarunaimagenesnecesarioquenolauseningúncontenedorElcomandodeborradoesdockerrmiParaverellistadodeimágenesquetenemosutilizaremosdockerimages

7EJEMPLOPARAWORDPRESS:

7.1ELECCIÓNDEIMÁGENESWordpress

Mysql

TutorialparausarlaimagenDockerfileymásenGitHub

TutorialparausarlaimagenDockerfileymásenGitHub

7.2CREACIÓNDECONTAINERSCreodoscontenedoresparavolumenesdedatos:$dockercreate-v/home/juanda/project/bbdd:/var/lib/mysql--namebbdddockerreg.inf.enlaces:5000/ubuntu/bin/true$dockercreate-v/home/juanda/project/web:/var/www/html--namewebdockerreg.inf.enlaces:5000/wordpress/bin/true

Unoparamysql:$dockerrun--volumes-frombbdd--namemysql-eMYSQL_ROOT_PASSWORD="xxxx"-ddockerreg.inf.enlaces:5000/mysql

OtroparaApacheyphp:$dockerrun--volumes-fromweb--nameapache--linkmysql:mysql-d-p8080:80dockerreg.inf.enlaces:5000/wordpress

7.3PRUEBADEFUNCIONAMIENTOEjecutamoslocalhost:8080yvemosqueaccedemosaWordpressOtraopciónhubierasido,sinutilizarcontainersparadatos:MapeamoslosdatosdelwordpressalcontainerdelwordpressMapeamoslosdatosdelabbddalcontainerdemysql

dockerrun-v/home/juanda/project/mysql:/var/lib/mysql--namemysql-eMYSQL_ROOT_PASSWORD="xxxx"-ddockerreg.inf.enlaces:5000/mysqldockerrun-v/home/juanda/project/wordpress:/var/www/html--nameapache--linkmysql:mysql-d-pdockerreg.inf.enlaces:5000/wordpress

8BIBLIOGRAFÍA

8.1BIBLIOGRAFÍAhttps://docs.docker.com/https://www.digitalocean.com/community/tags/docker?type=tutorialshttp://www.jayway.com/2015/03/21/a-not-very-short-introduction-to-docker/http://stackoverflow.com/