docker - media.formandome.es · node.js rust go microservices cassandra hadoop. 2.7 instalaciÓn de...
Post on 26-Sep-2018
229 Views
Preview:
TRANSCRIPT
1.1ESTRUCTURATALLERExplicacióngeneralsobreDockerInstalaciónConfiguraciónRegistrodeimágenesdockerdelCPIFPLosEnlacesydescargadeimágenesPrácticaconDockerHaypocotiempo,peroDockeresmuyeficiente:-)
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.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
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
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.
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.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
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
ficherodockerfileFROMubuntuMAINTAINERSvenDowideit@docker.com
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
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
top related