Академический Документы
Профессиональный Документы
Культура Документы
youtube.com/linuxtips
LinuxTipsTrainingCenter
Sumrio
1.
2.
3.
4.
Criandoegerenciandoimagens
1.1.
Ok!Agoraeuquerocriarminhaimagem,posso?
1.2.
Vamoscomeardocomeoento,Dockerfile!
1.3.
BoraaprenderumpoucomaissobreDockerfile?
1.4.
Vamoscustomizarumaimagembaseagora?
Compartilhandoasimagens
2.1.
OqueoDockerHub?
2.2.
Vamoscriarumacontalento?
2.3.
Agoraboracompartilharessasimagensnainterwebs!
2.4.
Noconfionainternet,possocriaromeuregistrylocal?
Gerenciandoarededoscontainers
3.1.
Consigofazercomqueaportadocontainerrespondanaportadohost?
3.2.
Ecomoelefazisso,mgica?
3.3.
SempreoDockerutiliza172.16.X.Xoupossoconfiguraroutra?
ControlandooDaemondoDocker
4.1.
OpesdeSockets
4.2.
OpesdeStorage
4.3.
Opesdiversas
youtube.com/linuxtips
LinuxTipsTrainingCenter
Criandoegerenciandoimagens
Ok!Agoraeuquerocriarminhaimagem,posso?
Claroquepode!
Edigomais,vamosaprenderdeduasformas,muitosimpleseintuitivas.
Uma das coisas mais interessantes do Docker, a possibilidade de voc usar imagens
criadas por outras pessoas ao redor do mundo atravs de algum registry como o
DockerHub, isso agiliza muito a sua vida, ainda mais quando voc precisa apenas testar
uma determinada tecnologia. O POC se torna muito mais gil e fazendo com que voc
consiga testar diversas ferramentas no mesmo tempo que levaria paratestarsomenteuma
semoDocker.
Agora vamos ver os dois casos, como montar um distribuio praticamente do zero
utilizando somente instrues atravs do Dockerfile e outra realizando modificaes em
umaimagemjexistenteesalvandoemumaimagemnova.
Vamoscomeardocomeoento,Dockerfile!
Vamos montar a nossa primeira imagem utilizando como roteiro de criao um Dockerfile,
vocirveroquantosimplesacriaodeumDockerfilebemcompletoeprtico.:)
Paracomear,vamoscriarumdiretriochamado
"/root/Dockerfiles".
#mkdir/root/Dockerfiles
youtube.com/linuxtips
LinuxTipsTrainingCenter
#cd/root/Dockerfiles/
#mkdirapache
Por enquanto, vamos apenas criar um arquivo chamado Dockerfile e adicionar o contedo
conformeexemploabaixo:
#cdapache
#vimDockerfile
Muito bom! Agora que voc j adicionou as informaes conforme o exemplo, vamos
entendercadaseoutilizadanessenossoprimeiroDockerfile:
FROM
=>Indicaaimagemaservircomobase
MAINTAINER
=>QuemomantenedordesseDockerfile/Imagem
RUN
=>Listadecomandosquedesejaexecutarnacriaodaimagem
Bem, por enquanto est bem bsico, apenas indicando qual ser a nossa imagem base,
nesseexemplovamosutilizaroUbuntu.
Tambm informamos quem o autor da imagem e por fim vamos instalar o Apache2 via
aptget
.
youtube.com/linuxtips
LinuxTipsTrainingCenter
#dockerbuild.
youtube.com/linuxtips
LinuxTipsTrainingCenter
#dockerimages
Anossaimagemfoicriada,aprimeiradalista!Pormtemosumproblema.:/
Vamosajustarconformeoexemploaseguir:
youtube.com/linuxtips
LinuxTipsTrainingCenter
#dockerbuildtlinuxtips/apache:1.0.
Agoravamosverserealmenteajustouaimagem,adicionandoumnomeeversoaela:
#dockerimages
Maravilha!Funcionouconformeespervamos!
Vamoscriarumcontainerutilizandoessaimagemcomobase:
#dockerruntilinuxtips/apache:1.0
#psef
#/etc/init.d/apache2start
#psef
#netstatatunp
#ifconfigeth0
youtube.com/linuxtips
LinuxTipsTrainingCenter
No
host
digite:
#curl<IPDOCONTAINER>
Como notaram, o
curl retornou a pgina de boas vindas do Apache2, ou seja, tudo est
funcionandomuitobemeoApache2respondendoconformeesperado!
youtube.com/linuxtips
LinuxTipsTrainingCenter
BoraaprenderumpoucomaissobreDockerfile?
Vamos agora aprender um pouco mais sobre as opes que podemos utilizar quando
estamoscriandoumDockerfile:
ADD => Copia novos arquivos, diretrios, arquivos TAR ou arquivos remotos e os
adicionamao
filesystem
docontainer
LABEL
=>Adicionametadadosaimagemcomoverso,descrioefabricante
COPY
=>Copianovosarquivosediretrioseosadicionamao
filesystem
docontainer
ENV
=>Informavariveisdeambienteaocontainer
EXPOSE
=>Informaqualportaocontainerestarouvindo
FROM => Indica qual imagem ser utilizada como base, ela precisa sera primeiralinhado
Dockerfile
MAINTAINER
=>Autordaimagem
USER
=>Determinaqualousurioserutilizadonaimagem.Por
default
oroot
VOLUME
=>Permiteacriaodeumpontodemontagemnocontainer
WORKDIR
=>Responsvelpormudardodiretrio/(raiz)paraoespecificadonele
youtube.com/linuxtips
LinuxTipsTrainingCenter
Vamoscustomizarumaimagembaseagora?
Vamos agora criar uma nova imagem, porm no vamos utilizar o Dockerfile. Vamos
executar um container com uma imagem base e realizar as modificaes que desejarmos,
depoisvamossalvaressecontainercomoumanovaimagem!
Simples,rpidoefcil!
Bem, primeiro precisamos criar um container. Vamos dessa vez utilizar um container
Debian,somenteparavariar.:D
#dockerruntidebian:8/bin/bash
Agora vamos fazer as alteraes que desejamos. Vamos fazer o mesmo que fizemos
quando montamos nossa primeira imagem com o Dockerfile, ou seja, fazer ainstalaodo
Apache2.:D
#aptgetupdate&&aptgetinstallyapache2&&aptgetclean
Agora que j instalamos o Apache2, vamos sair do container para que possamos
"
commitar
"anossaimagembaseadanessecontaineremexecuo:
#dockercommitm"meucontainer"CONTAINERID
#dockerimages
LinuxTipsTrainingCenter
#dockertagIMAGEIDlinuxtips/apache_2:1.0
Agorasim!!!Temosanossaimagemcriadaecomonomeeversoespecificados.
Vamosiniciarumcontainerutilizandoessaimagemqueacabamosdecriar:
#dockerruntilinuxtips/apache_2:1.0/bin/bash
VamossubiroApacheetestaracomunicaodocontainer:
#/etc/init.d/apache2start
#psef
#sstl
#ipaddr
youtube.com/linuxtips
LinuxTipsTrainingCenter
#curl172.17.0.30
youtube.com/linuxtips
LinuxTipsTrainingCenter
Compartilhandoasimagens
Bem,japrendemoscomocriarumaimagemdecontainer,sejaviaDockerfile ouatravsda
modificao de um container. Aprendemos alguns comando interessantes como o "
docker
build
"eo"
dockercommit
".
OqueoDockerHub?
Provavelmentevocnovaiquererbaixardainternet,mesmoquedoregistrydoprprio
docker(srio)esubirnoseuambientedeproduoalgodoqualvocnotemcertezade
comofunciona,oque,etc.PraresolveresseproblemaoDockerdisponibilizaalgumas
funcionalidades,comoocomando
dockerinspect
,quejvimosantes,quandofalavamos
devolumes,lembra?Naquelemomentousamosaflagfeespecificamosumcampode
pesquisapoisointuitoeramostrarsomenteapartequeestavasendodiscutidanaquele
capitulo,pormodockerinspectvaimuitoalmdisso,sempassarofelevaiteretornar
todosasinformaescontidasnaquelaimagem,desdeaimagembasequefoiutilizada,
pontosdemontagem,configuraes,enfim,muitacoisa.Testaai
youtube.com/linuxtips
LinuxTipsTrainingCenter
#dockerinspectdebian
AsvezesserdisponibilizadojuntocomaimagemoseurespectivoDockerfileeaificabem
maisfcil,bastaleressearquivoprasaberexatamentecomoelefoicriado:)
#dockerhistorylinuxtips/apache:1.0
Perceba que as duas primeiras linhas da sada do comando acima so referente as duas
informaes que pedimosparaadicionarimagemnoDockerfile,quemomantenedorea
instalao do Apache2. As demais camadas so originais da imagem que pegamos do
DockerHubatravsdainstruoFROM.
ExistetambmumsitechamadoImageLayers,elefazexatamenteamesmacoisaqueo
dockerhistory,pormvocnoprecisabaixaraimagem,e,bom,web.OImageLayers
podeseracessadoem:https://imagelayers.io/
O DockerHub, como j falamos, tem muitos componentes, dentre eles o responsvel pelo
repositriodeimagensumcarachamado
registry
.
youtube.com/linuxtips
LinuxTipsTrainingCenter
Para que voc possa utilizar o DockerHub para gerenciar as suas imagens,necessrioa
criao de sua conta. Existem duas formas para se criar a conta, uma atravs da url
http://hub.docker.com/account/signup ou ento atravs da linha de comando utilizando o
comando"dockerlogin".
Vamoscriarumacontalento?
Para que consiga realizar a criao da sua conta, necessrio utilizar o comando "
docker
login
". O comando "
docker login"
tambm utilizado para autenticar no DockerHub aps a
criaodaconta.
Vamoscriarumcontacomoexemplo:
#dockerlogin
#dockerlogin
youtube.com/linuxtips
LinuxTipsTrainingCenter
Voc consegue criar repositrios pblicos vontade, porm na conta free voc somente
tem direito a um repositrio privado. Caso precise demaisdoqueumrepositrioprivado,
necessriooupgradedasuacontaecomissoopagamentodeumamensalidade.:)
#dockerloginregistry.seilaqual.com
Agoraboracompartilharessasimagensnainterwebs!
UmavezquejcriamosanossacontanoDockerHub,podemoscomearautilizla!
Como exemplo, vamos utilizar a imagem que montamos com o Dockerfile no capitulo
anterior chamada
linuxtips/apache.
Quando realizarmos o
upload dessa imagem para o
DockerHub,orepositrioteromesmonomedaimagem,ouseja,
linuxtips/apache.
#dockerimages
#dockerpushlinuxtips/apache
Acessando a url
https://hub.docker.com/ voc conseguir visualizar o repositrio que
acaboudecriar,conformeaimagemabaixo:
youtube.com/linuxtips
LinuxTipsTrainingCenter
Porpadro,elecriaorepositriocomopblico.)
Caso voc queria visualizar o seu novo repo pela linha de comando bastante simples,
bastautilizarocomando"dockersearch"seguidodeseuusuriodoDockerHub:
#dockersearchlinuxtips
Primeirovamospararoscontainersqueutilizamaimagem"
linuxtips/apache"
:
#dockerps|greplinuxtips/apache
#dockerstopCONTAINERID
youtube.com/linuxtips
LinuxTipsTrainingCenter
Para que voc possa remover uma imagem necessrio utilizar o comando "
docker rmi
",
responsvelporremoverimagensdodiscolocal.
Importante mencionar que, caso possua containers parados que a utilizam essa imagem
comobase,necessrioforararemoodaimagemutilizandooparmetro"
f
":
#dockerrmiflinuxtips/apache:1.0
Pronto!Removemosaimagem!
#dockerpulllinuxtips/apache:1.0
Agora,podemosnovamentevisualizlaatravsdocomando"
dockerimages
".
#dockerimages
youtube.com/linuxtips
LinuxTipsTrainingCenter
Paracriarocontainer:
#dockerruntilinuxtips/apache:1.0/bin/bash
Simplescomovoar,no?
Noconfionainternet,possocriaromeuregistrylocal?
A
url do projeto fica em
https://github.com/docker/distribution
. O
DockerDistribution um
registry para que voc consiga guardar e compartilhar suas imagens. Ele substitui o
DockerRegistry
quesetornouobsoleto.
#dockerrundp5000:5000restart=alwaysnameregistryregistry:2
LinuxTipsTrainingCenter
Vamosverificaronossocontaineremexecuo:
#dockerps
#dockerimages
Primeiramente, teremos que adicionar uma nova TAG baseada em nossa imagem,
mencionandooendereodonovoregistry:
#dockertagIMAGEMIDlocalhost:5000/apache
#dockerimages
Agorabastafazero"
push
"paraonosso
registry
localdaseguinteforma:
#dockerpushlocalhost:5000/apache
youtube.com/linuxtips
LinuxTipsTrainingCenter
Pronto!Agoranspossumosum
registry
local!
Evidente que dessa forma fizemos um
registry totalmente funcional, porm simples. Caso
queira utilizar outros recursos como controle de usurios, certificados, outras opes de
storage,
etc...
Visite
a
url:
https://github.com/docker/distribution/blob/master/docs/deploying.md
.
youtube.com/linuxtips
LinuxTipsTrainingCenter
Gerenciandoarededoscontainers
dns
=>indicaoservidorDNS
hostname
=>indicaumhostname
link
=>Criaumlinkentreoscontainers,semanecessidadedesesaberoipumdooutro.
expose
=>Expeaportadocontainerapenas
publish
=>Expeaportadocontaineredohost
defaultgateway
=>Determinaarotapadro
macaddress
=>Determinaummacaddress
Quandoocontaineriniciadotemosalgumasetapasreferentearedeatasuainicializaocompleta:
1Criaumpardeinterfacesvirtuais
2 Cria umainterface com nomenicocomo
veth1234 e emseguida"
linka"comabridgedoDocker,a
docker0
3Comisso,disponibilizadaainterfaceeth0dentrodocontaineremumnetworknamespacenico
4Configuraseo
macaddress
dainterfacevirtualdocontainer
5AlocaumIPna
eth0
docontainer.EsseIPtemquepertenceraorangedabridge
docker0
Com isso, o container j possui uma interface de rede e j est apto a se comunicar com outros
containersoucomohost.:D
youtube.com/linuxtips
LinuxTipsTrainingCenter
Consigofazercomqueaportadocontainerrespondanaporta
dohost?
Sim,issopossvelebastanteutilizado.
Vamos conhecer um pouco mais sobre isso em um exemplo utilizando aquela nossa imagem do
linuxtips/apache
.
Para que eu consiga fazer esse encaminhamento, eu preciso utilizar o parmetro "
p
" do comando
"
dockerrun
"conformafaremosnoexemploaseguir:
#dockerruntip8080:80linuxtips/apache:1.0/bin/bash
youtube.com/linuxtips
LinuxTipsTrainingCenter
Reparequepassamosoparmetro"
p
"daseguinteforma:
p 8080:80 =>Onde o
8080 aportado
hostea
80ado
container
. Comissoestoudizendoquetoda
container.
A partir do
host
, vamos realizar um
curl com destino ao IP do container na porta
80 e depois com
destinoaporta
8080
dohost,evamosanalisarassadas:
#curl172.17.0.34:80
youtube.com/linuxtips
LinuxTipsTrainingCenter
#curllocalhost:8080
Comopuderamvisualizar,asduassadastrouxeramapginadeboasvindasdoApache2.
Muitofcil,chegaaserlacrimejante!
youtube.com/linuxtips
LinuxTipsTrainingCenter
Ecomoelefazisso,mgica?
No, no mgica! Na verdade ele apenas utiliza um mdulo bastante antigo do kernel do Linux
chamadoNetfilter,quedisponibilizaaferramentaiptablesquetodosnsjcansamosdeusar.
Vamosdarumaolhadanasregrasdeiptablesreferenteaessenossocontainer:
#iptablesL
#iptablesLtnat
Comopodemosnotar,temosregrasde
NATconfiguradasquepermitemo
DNAT daporta
8080do
host
paraa
80
do
container
,vejaabaixo:
youtube.com/linuxtips
LinuxTipsTrainingCenter
SempreoDockerutiliza172.16.X.Xoupossoconfiguraroutra?
Sim, voc pode configurar outro range para serem utilizados pela bridge
docker0 e tambm pelas
interfacesdoscontainers.
Para que voc consiga configurar um range diferente para utilizao doDocker necessrio inicilo
comoparmetro"
bip
".
#dockerdbip192.168.0.1/24
#dockerdfixedcidr192.168.0.0/24
youtube.com/linuxtips
LinuxTipsTrainingCenter
ControlandooDaemondoDocker
Antesdetudo,vamostentarentenderoqueumdaemon.Emteoriadesistemasoperacionaisvemos
que,emsistemasoperacionaismultitask,isso,umsistemaoperacionalcapazdeexecutarmaisde
umatarefaporvez(notreally*),umdaemonumsoftwarequerodadeformaindependenteem
background,eleexecutacertasaespredefinidasemrespostaacertoseventos.Poisbem,odaemon
doDockerexatamenteisso,umaespciedeprocessopaiquecontrolatudo,containers,imagens,etc,
etc,etc.
AtoDocker1.7asconfiguraesreferentesespecificamenteaodaemonseconfundiambastantecom
configuraesglobais,issoporquequandovocdigitavalodockerhelpretornavaumaporradade
coisa,evocnosabiaoqueeraoque.Apartirdaverso1.8foiintroduzidoumnovocomando,o
dockerdaemon,queresolvedevezesseproblema,tratandoespecificamentedeconfiguraes
referente,obviamente,aodaemondodocker.
Comdockerdaemon:
youtube.com/linuxtips
LinuxTipsTrainingCenter
Semdockerdaemon:
*NarealoSOcontinuaprocessandoumataskporvez,masoprocessadoralternaentreprocessosto
rpidoquedaaimpressoenaprticapodemosassumirquequeeleestlidandocommaisde
umprocessoporvez.
OpesdeSockets
Socketssoendpointsondeduasoumaisaplicaesouprocessossecomunicamnumambiente,
geralmenteumIP:Portaouumarquivo,comonocasodounixdomainsockets.
AtualmenteoDockerconseguetrabalharcomtrstiposdesocket,unix,tcpefdepordefaulteleusa
unixsockets,vocdeveternotadoqueaostartarseudockerfoicriadoumarquivoem
/var/run/docker.sockeprafazeralteraesnessecaravocvaiprecisaroudepermissoderootoude
queousurioqueestexecutandoasaesestejanogrupodocker.
Pormaisprticoquesejaisso,existemalgumaslimitaes,comoporexemploodadaemonspoder
seracessadalocalmente.Praresolverissousamosgeralmenteotcp.Nessemodelonsdefinimosum
IP,quepodesertanto"qualquerum",a.k.a0.0.0.0eumaporta,ouumIPespecficoeumaporta.Nos
sistemasbaseadosemsystemdvocaindapodesebeneficiardosystemdsocketactivation,uma
tecnologiaquevisaeconomiaderecursos,elaconsistebasicamenteemativarumsocketsomente
enquantoumaconexonovachega,edesativarquandonoestsendomaisusado.
youtube.com/linuxtips
LinuxTipsTrainingCenter
Almdissotudo,dependendodoseuambiente,voctambmpodefazerodockerescutarem
diferentestiposdesockets,oqueconseguidoatravsdoparmetroHdocomandodockerdaemon.
Exemplos:
UnixDomainSocket
TCP
FD
youtube.com/linuxtips
LinuxTipsTrainingCenter
OpesdeStorage
Sendoocaraquecontrolatudo,naturalmentepossvelpassaropesquemudamaformacomoo
Dockersecomportanaformacomoeletrabalhacomstorages.Comofalamosanteriormente,no
capitulosobrestorage,oDockersuportaalgunsstoragedriver,todosbaseadosnoesquemadelayers.
Essasopessopassadasparaodaemonpeloparametrostorageopt,ondeitensrelacionadosao
devicemapperrecebemoprefixodm,ezfspara(advinha?)ozfs.Aseguireuvoudemonstraralgumas
opesmaiscomuns:
dm.thipooldeviceComessecaravocconsegueespecificarqualodeviceserusadopelodevice
mapperparacriarothinpoolqueeleusaparacriarossnapshotsusadosporcontainerseimagens.
Exemplo:
dm.basesizeEsseparametrodefineotamanhomximodocontainer.Ochatodissoquevoc
precisadeletartudodentrode/var/lib/docker(oqueimplicaemmatartodososcontainerseimagens)e
restartaroserviododocker.
dm.fsEspecificaofilesystemdocontainer,asopessuportadasso:ext4exfs
Opesderede
Tambmpossvelcontrolarcomoodaemonsecomportaremrelaoarede:
defaultgatewayAutoexplicativo,n?TodososcontainersreceberoesseIPcomogateway.
dnsTambmsemsegredo,oDNSqueserusadoparaconsultas.
dnssearchEspecificaodominioaserprocurado,assimvocconseguepesquisarmquinassem
usarofqdn.
ipforwardEssaopohabilitaoroteamentoentrecontainers,porpadroelajvemsetadacomo
true.
youtube.com/linuxtips
LinuxTipsTrainingCenter
Opesdiversas
defaultulimitPassandoissoprodaemontodososcontainersserostartadoscomessevalorparao
ulimit.Essaoposobrescritapeloparametroulimitdocomandodockerrun,quegeralmentevaidar
umvisomaisespecfica.
iccICCvemdeintercontainercomunication,porpadroelevemsetadocomotrue,casovocno
queiraessetipodecomunicaovocpodepassarnadaemoncomofalse.
loglevelpossvelalterartambmaformacomoodockertrabalhacomlog,emalgumassituaes
(geralmentetroubleshoot)vocpodeprecisardeumlogmaisverbose,porexemplo.
youtube.com/linuxtips