Como são os processos dentro de um contêiner Docker?

32

Eu já ouvi uma confusão várias vezes sobre o que é um contêiner do Docker e, mais especificamente, o que está acontecendo dentro dele, no que diz respeito a comandos & processos que invoco dentro de um contêiner Docker.

Alguém pode fornecer uma visão geral de alto nível do que está acontecendo?

    
por slm 17.07.2015 / 06:50

2 respostas

50

O Docker é jogado no intervalo de virtualização, porque as pessoas supõem que, de alguma forma, estão virtualizando o hardware por baixo. Isso é um equívoco que permeia a terminologia usada pelo Docker, principalmente o termo container.

No entanto, o Docker não está fazendo nada de mágico com relação à virtualização do hardware de um sistema. Em vez disso, está fazendo uso da capacidade do Kernel Linux de construir "cercas" em torno de recursos-chave, o que permite que um processo interaja com recursos como rede, sistema de arquivos e permissões (entre outras coisas) para dar a ilusão de que você está interagindo com um sistema totalmente funcional.

Veja um exemplo que ilustra o que está acontecendo quando iniciamos um contêiner do Docker e, em seguida, o inserimos por meio da invocação de /bin/bash .

$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#

Agora de dentro desse contêiner, se executarmos ps -eaf :

MudandoparaoutraguiadoterminalondeestamosconectadosaosistemahostquehospedaocontêinerdoDocker,podemosveroespaçodoprocessoqueocontêinerestá"realmente" ocupando:

Agora,sevoltarmosàabadoDockerelançarmosváriosprocessosdentrodelaecontextualizá-los,poderemosverqueagoratemosváriosprocessos-filhosemexecuçãonoprocessoBashprimárioqueiniciamosoriginalmentecomopartedolançamentodocontêinerDocker.

OBSERVAÇÃO:Osprocessossão4%doscomandossleep1000queestãosendousadosemsegundoplano.

Observecomo,dentrodocontêinerDocker,osprocessossãoatribuídosaIDsdeprocesso(PIDs)de48-51.Veja-osnasaídaps-eafemseustambém:

Noentanto,comessapróximaimagem,grandeparteda"mágica" que o Docker está realizando é revelada.

Vejacomoosprocessosde4sleep1000sãorealmenteprocessosfilhosparaonossoprocessoBashoriginal?ObservetambémqueonossocontêinerDockeroriginal/bin/bashé,naverdade,umprocessofilhoparaodaemondoDockertambém.

Agora,seesperarmosmaisde1.000segundosparaqueoscomandossleep1000originaissejamconcluídose,emseguida,executemosmais4novos,einiciaremosoutrocontêinerdoDockerassim:

$dockerrun-itubuntu:latest/bin/bashroot@450a3ce77d32:/#

Asaídadocomputadorhostdeps-eafficariaassim:

EoutroscontêineresdoDockerserãoexibidosapenascomoprocessosnodaemondoDocker.

Então,oDockerrealmentenãoestávirtualizando(nosentidotradicional),estáconstruindo"cercas" em torno dos vários recursos do Kernel e limitando a visibilidade a eles para um determinado processo + filhos. / p>     

por 17.07.2015 / 06:50
3

Dentro do contêiner, seus processos devem ser isolados (em quarentena). Na verdade, você não deve ver nenhum processo, exceto aqueles que você especificar (pelo menos um shell). Não é para testes de "sociabilidade". A única semelhança com o chroot é que o kernel do host é usado. O Docker é ótimo se você precisar isolar algo ou usar versões diferentes do software de arquitetura de plataforma do que o executado no host. (versões muito antigas do Java ou uma bifurcação diferente do Python dizem). Esteja ciente de que as pastas e binários com os quais você está lidando podem não ser os mesmos que os do host. Não é a mesma pasta / bin etc.

EDIT: similaridade com o chroot em vez de VMs.

    
por 17.07.2015 / 09:25