{"id":91905,"date":"2020-08-20T07:42:23","date_gmt":"2020-08-20T05:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii"},"modified":"2020-08-20T07:42:23","modified_gmt":"2020-08-20T05:42:23","slug":"chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","title":{"rendered":"O que \u00e9 Docker: um breve hist\u00f3rico e as principais abstra\u00e7\u00f5es","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>10 de agosto come\u00e7ou em Sloerm <noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/2patKQ\">um curso em v\u00eddeo sobre Docker<\/a><\/noindex>, onde analisamos completamente \u2014 desde as abstra\u00e7\u00f5es b\u00e1sicas at\u00e9 par\u00e2metros de rede. <\/p>\n<p><\/p>\n<p>Neste artigo, vamos falar sobre a hist\u00f3ria do Docker e suas principais abstra\u00e7\u00f5es: Image, CLI, Dockerfile. A palestra \u00e9 voltada para iniciantes, por isso dificilmente ser\u00e1 interessante para usu\u00e1rios experientes. N\u00e3o haver\u00e1 sangue, apendicite ou mergulhos profundos. Apenas o b\u00e1sico.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O que \u00e9 Docker: um breve hist\u00f3rico e as principais abstra\u00e7\u00f5es\" src=\"\/wp-content\/uploads\/2020\/08\/f01af417f24c838577b09bdf90f02fb9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"chto-takoe-docker\">O que \u00e9 Docker<\/h2>\n<p><\/p>\n<p>Vamos conferir a defini\u00e7\u00e3o do Docker na Wikip\u00e9dia.<\/p>\n<p><\/p>\n<blockquote><p>Docker \u00e9 um software para automa\u00e7\u00e3o do deploy e gest\u00e3o de aplica\u00e7\u00f5es em ambientes que suportam containeriza\u00e7\u00e3o.<\/p><\/blockquote>\n<p>Dessa defini\u00e7\u00e3o, nada \u00e9 claro. Especialmente o que significa 'em ambientes que suportam containeriza\u00e7\u00e3o'. Para entender, vamos voltar no tempo. Come\u00e7aremos na \u00e9poca que chamo de 'Era Monol\u00edtica'.<\/p>\n<p><\/p>\n<h2 id=\"monolitnaya-era\">Era Monol\u00edtica<\/h2>\n<p><\/p>\n<p>A Era Monol\u00edtica \u00e9 o in\u00edcio dos anos 2000, quando todas as aplica\u00e7\u00f5es eram monol\u00edticas, com muitas depend\u00eancias. O desenvolvimento era demorado. Naquela \u00e9poca, havia poucos servidores, conhec\u00edamos todos pelo nome e monitor\u00e1vamos. H\u00e1 uma compara\u00e7\u00e3o interessante:<\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"Od7e6hqis7A\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/Od7e6hqis7A\/hqdefault.jpg\" alt=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Pets \u2014 s\u00e3o animais de estima\u00e7\u00e3o. Na era monol\u00edtica, trat\u00e1vamos nossos servidores como animais de estima\u00e7\u00e3o, cuid\u00e1vamos e os zel\u00e1vamos, tirando a poeira. E para melhor gest\u00e3o dos recursos, utiliz\u00e1vamos virtualiza\u00e7\u00e3o: peg\u00e1vamos um servidor e divid\u00edamos em v\u00e1rias m\u00e1quinas virtuais, garantindo assim o isolamento do ambiente.<\/p>\n<p><\/p>\n<h2 id=\"sistemy-virtualizacii-na-baze-gipervizora\">Sistemas de virtualiza\u00e7\u00e3o baseados em hipervisor<\/h2>\n<p><\/p>\n<p>Certamente, todos j\u00e1 ouviram falar de sistemas de virtualiza\u00e7\u00e3o: VMware, VirtualBox, Hyper-V, Qemu KVM etc. Eles fornecem isolamento de aplica\u00e7\u00f5es e gest\u00e3o de recursos, mas t\u00eam suas desvantagens. Para fazer a virtualiza\u00e7\u00e3o, \u00e9 necess\u00e1rio um hipervisor. E um hipervisor significa um overhead de recursos. Al\u00e9m disso, a pr\u00f3pria m\u00e1quina virtual geralmente \u00e9 grande \u2014 uma imagem pesada, com sistema operacional, Nginx, Apache e possivelmente MySQL. A imagem \u00e9 grande, operar com a m\u00e1quina virtual pode ser inconveniente. Como consequ\u00eancia, o trabalho com m\u00e1quinas virtuais pode ser lento. Para resolver esse problema, foram criados sistemas de virtualiza\u00e7\u00e3o em n\u00edvel de kernel.<\/p>\n<p><\/p>\n<h2 id=\"sistemy-virtualizacii-na-urovne-yadra\">Sistemas de virtualiza\u00e7\u00e3o em n\u00edvel de kernel<\/h2>\n<p><\/p>\n<p>A virtualiza\u00e7\u00e3o em n\u00edvel de kernel \u00e9 suportada por sistemas como OpenVZ, Systemd-nspawn, LXC. Um exemplo claro dessa virtualiza\u00e7\u00e3o \u00e9 o LXC (Linux Containers). <\/p>\n<p><\/p>\n<p>LXC \u2014 um sistema de virtualiza\u00e7\u00e3o no n\u00edvel do sistema operacional que permite executar v\u00e1rias inst\u00e2ncias isoladas do sistema operacional Linux em um \u00fanico n\u00f3. LXC n\u00e3o utiliza m\u00e1quinas virtuais, mas cria um ambiente virtual com seu pr\u00f3prio espa\u00e7o de processos e pilha de rede.<\/p>\n<p><\/p>\n<p>Basicamente, o LXC cria cont\u00eaineres. Qual \u00e9 a diferen\u00e7a entre m\u00e1quinas virtuais e cont\u00eaineres?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O que \u00e9 Docker: um breve hist\u00f3rico e as principais abstra\u00e7\u00f5es\" src=\"\/wp-content\/uploads\/2020\/08\/55afdcfd700d4869c9de488033a8e314.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um cont\u00eainer n\u00e3o \u00e9 adequado para isolar processos: em sistemas de virtualiza\u00e7\u00e3o no n\u00edvel do kernel, foram encontradas vulnerabilidades que permitem escapar do cont\u00eainer para o host. Portanto, se voc\u00ea precisa isolar algo, \u00e9 melhor usar uma m\u00e1quina virtual.<\/p>\n<p><\/p>\n<p>As diferen\u00e7as entre virtualiza\u00e7\u00e3o e conteineriza\u00e7\u00e3o podem ser vistas no esquema.<br \/>\nExistem hipervisores de hardware, hipervisores sobre o sistema operacional e cont\u00eaineres. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O que \u00e9 Docker: um breve hist\u00f3rico e as principais abstra\u00e7\u00f5es\" src=\"\/wp-content\/uploads\/2020\/08\/a0c06e9adc1fab3b4b5e9e1b05b51d66.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Os hipervisores 'de ferro' s\u00e3o uma \u00f3tima solu\u00e7\u00e3o, se voc\u00ea realmente quer isolar algo. Porque existe a possibilidade de isolar no n\u00edvel das p\u00e1ginas de mem\u00f3ria e dos processadores.<\/p>\n<p><\/p>\n<p>Existem hipervisores como programas, e h\u00e1 cont\u00eaineres, que ser\u00e1 nosso foco a seguir. Em sistemas de conteineriza\u00e7\u00e3o, n\u00e3o h\u00e1 hipervisor, mas existe um Container Engine, que cria e gerencia os cont\u00eaineres. Essa abordagem \u00e9 mais leve, portanto, devido \u00e0 intera\u00e7\u00e3o com o kernel, a sobrecarga \u00e9 menor ou inexistente.<\/p>\n<p><\/p>\n<blockquote>\n<h2 id=\"chto-ispolzuetsya-dlya-konteynerizacii-na-urovne-yadra\">O que \u00e9 usado para conteineriza\u00e7\u00e3o no n\u00edvel do kernel<\/h2>\n<p>As principais tecnologias que permitem criar cont\u00eaineres isolados de outros processos s\u00e3o o Namespaces e os Control Groups.<\/p>\n<p>Namespaces: PID, Networking, Mount e User. Existem outros, mas para simplificar, vamos nos concentrar nesses.<\/p>\n<p>O Namespace de PID limita os processos. Quando, por exemplo, criamos um Namespace de PID e colocamos um processo nele, ele se torna PID 1. Normalmente, em sistemas, o PID 1 \u00e9 o systemd ou init. Portanto, ao colocarmos um processo em um novo namespace, ele tamb\u00e9m recebe o PID 1.<\/p>\n<p>O Networking Namespace permite limitar\/isolacionar a rede e dentro dele, alocar suas pr\u00f3prias interfaces. Mount \u00e9 a limita\u00e7\u00e3o do sistema de arquivos. User \u00e9 a limita\u00e7\u00e3o de usu\u00e1rios.<\/p>\n<p>Control Groups: Mem\u00f3ria, CPU, IOPS, Rede \u2014 cerca de 12 configura\u00e7\u00f5es no total. Tamb\u00e9m s\u00e3o conhecidos como Cgroups ('C groups').<\/p>\n<p>Os Control Groups gerenciam os recursos para o cont\u00eainer. Atrav\u00e9s dos Control Groups, podemos especificar que o cont\u00eainer n\u00e3o deve consumir mais do que uma certa quantidade de recursos.<\/p>\n<p>Para que a containeriza\u00e7\u00e3o funcione plenamente, s\u00e3o utilizadas tecnologias adicionais: Capabilities, Copy-on-write e outras.<\/p>\n<p>Capabilities s\u00e3o quando informamos ao processo o que ele pode ou n\u00e3o pode fazer. No n\u00edvel do kernel, isso \u00e9 apenas uma m\u00e1scara de bits com uma s\u00e9rie de par\u00e2metros. Por exemplo, o usu\u00e1rio root tem plenas permiss\u00f5es e pode fazer tudo. Um servidor de tempo pode alterar a hora do sistema: ele tem capabilities sobre o Time Capsule, e \u00e9 isso. Com as permiss\u00f5es, \u00e9 poss\u00edvel configurar restri\u00e7\u00f5es de forma flex\u00edvel para os processos, garantindo assim a seguran\u00e7a.<\/p>\n<p>O sistema Copy-on-write nos permite trabalhar com imagens Docker, tornando seu uso mais eficiente.<\/p>\n<p><em>Atualmente, o Docker tem problemas de compatibilidade com Cgroups v2, por isso, este artigo se concentra especificamente em Cgroups v1.<\/em><\/p><\/blockquote>\n<p>Mas vamos voltar \u00e0 hist\u00f3ria. <\/p>\n<p><\/p>\n<p>Quando os sistemas de virtualiza\u00e7\u00e3o no n\u00edvel do kernel surgiram, come\u00e7aram a ser amplamente utilizados. O overhead do hypervisor desapareceu, mas alguns problemas permaneceram:<\/p>\n<p><\/p>\n<ul>\n<li>imagens grandes: no OpenVZ, por exemplo, empurram o sistema operacional, bibliotecas e uma s\u00e9rie de softwares, e no final, a imagem ainda acaba sendo consider\u00e1vel;<\/li>\n<li>n\u00e3o h\u00e1 um padr\u00e3o adequado para empacotamento e entrega, portanto, a quest\u00e3o das depend\u00eancias continua. \u00c0s vezes, duas partes de c\u00f3digo usam uma biblioteca, mas com vers\u00f5es diferentes. Entre elas pode ocorrer um conflito.<\/li>\n<\/ul>\n<p><\/p>\n<p>Para resolver todos esses problemas, chegou a era seguinte.<\/p>\n<p><\/p>\n<h2 id=\"era-konteynerov\">A Era dos Cont\u00eaineres<\/h2>\n<p><\/p>\n<p>Quando a Era dos Cont\u00eaineres chegou, a filosofia de trabalho com eles mudou:<\/p>\n<p><\/p>\n<ul>\n<li>Um processo \u2014 um cont\u00eainer.<\/li>\n<li>Todas as depend\u00eancias necess\u00e1rias para o processo s\u00e3o entregues no seu cont\u00eainer. Isso requer desmembrar mon\u00f3litos em microsservi\u00e7os.<\/li>\n<li>Quanto menor a imagem, melhor \u2014 menor a possibilidade de vulnerabilidades, mais r\u00e1pido a implanta\u00e7\u00e3o, e assim por diante.<\/li>\n<li>As inst\u00e2ncias tornam-se ef\u00eameras. <\/li>\n<\/ul>\n<p><\/p>\n<p>Lembre-se, eu mencionei sobre pets vs cattle? Antes, as inst\u00e2ncias eram como animais de estima\u00e7\u00e3o, agora tornaram-se como gado. Antes, havia um mon\u00f3lito \u2014 um \u00fanico aplicativo. Agora s\u00e3o 100 microsservi\u00e7os, 100 cont\u00eaineres. Algumas cont\u00eaineres podem ter 2-3 r\u00e9plicas. N\u00e3o \u00e9 t\u00e3o importante controlar cada cont\u00eainer. O que importa mais \u00e9 a disponibilidade do servi\u00e7o em si: o que esse conjunto de cont\u00eaineres faz. Isso muda as abordagens de monitoramento.<\/p>\n<p><\/p>\n<p>Entre 2014-2015, houve um auge do Docker \u2014 a tecnologia da qual falaremos agora.<\/p>\n<p><\/p>\n<p>Docker mudou a filosofia e padronizou o empacotamento de aplica\u00e7\u00f5es. Com o Docker, podemos empacotar uma aplica\u00e7\u00e3o, envi\u00e1-la para um reposit\u00f3rio, baix\u00e1-la e implant\u00e1-la. <\/p>\n<p><\/p>\n<p>Em um cont\u00eainer Docker, inclu\u00edmos tudo o que \u00e9 necess\u00e1rio, portanto, o problema das depend\u00eancias \u00e9 resolvido. O Docker garante a reprodutibilidade. Acredito que muitos j\u00e1 enfrentaram problemas de reprodutibilidade: tudo funciona para voc\u00ea, voc\u00ea faz o push para a produ\u00e7\u00e3o e l\u00e1 para de funcionar. Com o Docker, esse problema desaparece. Se o seu cont\u00eainer Docker inicia e faz o que precisa, h\u00e1 uma grande probabilidade de que ele inicie na produ\u00e7\u00e3o e fa\u00e7a a mesma coisa.<\/p>\n<p><\/p>\n<blockquote>\n<h2 id=\"otstuplenie-pro-overhed\">Uma digress\u00e3o sobre overhead<\/h2>\n<p>Sobre o overhead, h\u00e1 constantes debates. Alguns acreditam que o Docker n\u00e3o introduz carga adicional, pois utiliza o n\u00facleo do Linux e todos os seus processos necess\u00e1rios para a contenoriza\u00e7\u00e3o. Dizem: 'se voc\u00ea afirma que o Docker \u00e9 um overhead, ent\u00e3o o n\u00facleo do Linux tamb\u00e9m \u00e9 um overhead'.<\/p>\n<p>Por outro lado, se olharmos mais de perto, h\u00e1 realmente algumas coisas no Docker que podem ser discutidas como overhead.<\/p>\n<p>A primeira \u00e9 o namespace PID. Quando colocamos um processo em um namespace, ele recebe o PID 1. Ao mesmo tempo, esse processo tem outro PID, que est\u00e1 no namespace do host, fora do cont\u00eainer. Por exemplo, se iniciarmos o Nginx em um cont\u00eainer, ele se torna o PID 1 (processo mestre). E no host, seu PID \u00e9 12623. E \u00e9 dif\u00edcil dizer qu\u00e3o significativo \u00e9 esse overhead.<\/p>\n<p>A segunda quest\u00e3o s\u00e3o os Cgroups. Vamos considerar os Cgroups de mem\u00f3ria, ou seja, a capacidade de limitar a mem\u00f3ria de um cont\u00eainer. Quando isso \u00e9 ativado, contadores s\u00e3o ativados, contabiliza\u00e7\u00e3o de mem\u00f3ria: o n\u00facleo precisa entender quantas p\u00e1ginas foram alocadas e quantas ainda est\u00e3o livres para este cont\u00eainer. Isso pode ser overhead, mas n\u00e3o encontrei estudos precisos sobre como isso afeta o desempenho, e eu mesmo n\u00e3o percebi que uma aplica\u00e7\u00e3o executada no Docker subitamente perdesse desempenho. <\/p>\n<p>E mais uma observa\u00e7\u00e3o sobre desempenho. Alguns par\u00e2metros do n\u00facleo s\u00e3o passados do host para o cont\u00eainer. Em particular, alguns par\u00e2metros de rede. Portanto, se voc\u00ea quiser executar algo de alto desempenho no Docker, como algo que utilize intensivamente a rede, pelo menos voc\u00ea precisar\u00e1 ajustar esses par\u00e2metros. Alguma coisa como nf_conntrack, por exemplo. <\/p><\/blockquote>\n<p><\/p>\n<h2 id=\"o-koncepcii-docker\">Sobre o conceito de Docker<\/h2>\n<p><\/p>\n<p>O Docker consiste em v\u00e1rios componentes: <\/p>\n<p><\/p>\n<ol>\n<li>Docker Daemon \u2014 o pr\u00f3prio Container Engine; executa cont\u00eaineres. <\/li>\n<li>Docker CII \u2014 ferramenta para gerenciar Docker.<\/li>\n<li>Dockerfile \u2014 instru\u00e7\u00e3o sobre como construir uma imagem.<\/li>\n<li>Imagem \u2014 a imagem a partir da qual o cont\u00eainer \u00e9 criado.<\/li>\n<li>Cont\u00eainer.<\/li>\n<li>Docker registry \u2014 reposit\u00f3rio de imagens.<\/li>\n<\/ol>\n<p><\/p>\n<p>Esquematicamente, isso se parece com isso:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O que \u00e9 Docker: um breve hist\u00f3rico e as principais abstra\u00e7\u00f5es\" src=\"\/wp-content\/uploads\/2020\/08\/73ccc02c14485f72cfd7c64e3074f3b9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>No Docker_host, o Docker daemon executa cont\u00eaineres. H\u00e1 um Cliente que envia comandos: crie uma imagem, baixe uma imagem, inicie um cont\u00eainer. O Docker daemon consulta o registro e executa-os. O cliente Docker pode se conectar localmente (ao socket Unix) e via TCP a um host remoto.<\/p>\n<p><\/p>\n<p>Vamos passar por cada componente.<\/p>\n<p><\/p>\n<p><u>Docker daemon (daemon)<\/u> \u2014 \u00e9 a parte do servidor, ela opera na m\u00e1quina host: baixa imagens e inicia cont\u00eaineres a partir delas, cria redes entre cont\u00eaineres, coleta logs. Quando dizemos 'crie uma imagem', isso tamb\u00e9m \u00e9 feito pelo daemon.<\/p>\n<p><\/p>\n<p><u>Docker CLI<\/u> \u2014 parte do cliente do Docker, uma ferramenta de linha de comando para trabalhar com o daemon. Reitero, ela pode funcionar n\u00e3o apenas localmente, mas tamb\u00e9m pela rede. <\/p>\n<p><\/p>\n<p><strong>Comandos b\u00e1sicos:<\/strong><\/p>\n<p><\/p>\n<p>docker ps \u2014 mostrar cont\u00eaineres que est\u00e3o atualmente em execu\u00e7\u00e3o no host Docker.<br \/>\ndocker images \u2014 mostrar imagens baixadas localmente.<br \/>\ndocker search  \u2014 procura por uma imagem no registro.<br \/>\ndocker pull  \u2014 baixa uma imagem do registro para a m\u00e1quina.<br \/>\ndocker build &lt;&gt; \u2014 constr\u00f3i uma imagem.<br \/>\ndocker run  \u2014 inicia um cont\u00eainer.<br \/>\ndocker rm  \u2014 remove um cont\u00eainer.<br \/>\ndocker logs  \u2014 logs do cont\u00eainer.<br \/>\ndocker start\/stop\/restart  \u2014 manuseio do cont\u00eainer.\n<\/p>\n<p>Se voc\u00ea dominar esses comandos e os usar com confian\u00e7a, considere que voc\u00ea dominou 70% do Docker no n\u00edvel do usu\u00e1rio.<\/p>\n<p><\/p>\n<p><u>Dockerfile<\/u> \u2014 instru\u00e7\u00e3o para criar uma imagem. Quase cada comando dentro da instru\u00e7\u00e3o \u00e9 uma nova camada. Vamos ver com um exemplo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"O que \u00e9 Docker: um breve hist\u00f3rico e as principais abstra\u00e7\u00f5es\" src=\"\/wp-content\/uploads\/2020\/08\/4d61b58d0d0d8b2e4ddbbfe573f34f7e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais ou menos assim parece um Dockerfile: \u00e0 esquerda os comandos, \u00e0 direita \u2014 os argumentos. Cada comando que est\u00e1 presente aqui (e \u00e9 escrito no Dockerfile) cria uma nova camada na Imagem. <\/p>\n<p><\/p>\n<p>Mesmo olhando para a parte esquerda, \u00e9 poss\u00edvel entender aproximadamente o que est\u00e1 acontecendo. Estamos dizendo: \"crie uma pasta para n\u00f3s\" \u2014 este \u00e9 um n\u00edvel. \"Torne a pasta ativa\" \u2014 este \u00e9 mais um n\u00edvel, e assim por diante. O bolo em camadas facilita a vida. Se eu criar outro Dockerfile e mudar algo na \u00faltima linha \u2014 em vez de executar \"python\" \"main.py\", eu posso executar algo diferente ou instalar depend\u00eancias de outro arquivo \u2014 ent\u00e3o os n\u00edveis anteriores ser\u00e3o reutilizados, como cache.<\/p>\n<p><\/p>\n<p><u>Imagem<\/u> \u2014 \u00e9 a embalagem do cont\u00eainer, a partir da qual os cont\u00eaineres s\u00e3o iniciados. Se olharmos para o Docker como um gerenciador de pacotes (como se estiv\u00e9ssemos lidando com pacotes deb ou rpm), a imagem \u00e9, na ess\u00eancia, um pacote rpm. Atrav\u00e9s do yum install, podemos instalar o aplicativo, remov\u00ea-lo, encontr\u00e1-lo no reposit\u00f3rio, baix\u00e1-lo. Aqui \u00e9 aproximadamente a mesma coisa: cont\u00eaineres s\u00e3o iniciados a partir da imagem, eles s\u00e3o armazenados no Docker registry (analogamente ao yum, no reposit\u00f3rio), e cada imagem possui um hash SHA-256, nome e tag.<\/p>\n<p><\/p>\n<p>A imagem \u00e9 criada a partir das instru\u00e7\u00f5es do Dockerfile. Cada instru\u00e7\u00e3o no Dockerfile cria uma nova camada. As camadas podem ser reutilizadas.<\/p>\n<p><\/p>\n<p><u>Docker registry<\/u> \u2014 \u00e9 o reposit\u00f3rio de imagens Docker. Analogamente aos sistemas operacionais, o Docker possui um registro p\u00fablico padr\u00e3o \u2014 dockerhub. Mas \u00e9 poss\u00edvel construir seu pr\u00f3prio reposit\u00f3rio, seu pr\u00f3prio Docker registry. <\/p>\n<p><\/p>\n<p><u>Cont\u00eainer<\/u> \u2014 \u00e9 o que \u00e9 iniciado a partir da imagem. A partir das instru\u00e7\u00f5es do Dockerfile, criamos a imagem e ent\u00e3o iniciamos a partir dessa imagem. Este cont\u00eainer \u00e9 isolado dos outros cont\u00eaineres, e deve conter tudo o que \u00e9 necess\u00e1rio para o funcionamento do aplicativo. Nesse contexto, um cont\u00eainer corresponde a um \u00fanico processo. \u00c0s vezes, \u00e9 necess\u00e1rio ter dois processos, mas isso contraria um pouco a ideologia do Docker.<\/p>\n<p><\/p>\n<p>A exig\u00eancia de \"um cont\u00eainer \u2014 um processo\" est\u00e1 relacionada ao PID Namespace. Quando um processo com PID 1 \u00e9 iniciado no Namespace, se ele morrer de repente, todo o cont\u00eainer tamb\u00e9m morrer\u00e1. No entanto, se houver dois processos em execu\u00e7\u00e3o: um permanece ativo e o outro morre, o cont\u00eainer continuar\u00e1 vivo. Mas isso diz respeito \u00e0s Melhores Pr\u00e1ticas; falaremos sobre elas em outros materiais.<\/p>\n<p><\/p>\n<p>Para estudar mais detalhadamente as caracter\u00edsticas e o conte\u00fado completo do curso, voc\u00ea pode acessar o link: \"<noindex><a rel=\"nofollow\" href=\"http:\/\/to.slurm.io\/2patKQ\">Curso em v\u00eddeo sobre Docker<\/a><\/noindex>\u00bb. <\/p>\n<p><\/p>\n<p><em>Autor: Marcel Ibraev, administrador do Kubernetes certificado, engenheiro em atividade na empresa Southbridge, palestrante e desenvolvedor de cursos da Slurm.<\/em><\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/515508\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e\u0431 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f Docker \u0438 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u0445: Image, Cli, Dockerfile. \u041b\u0435\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0430 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c. \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u043e\u0432\u0438, \u0430\u043f\u043f\u0435\u043d\u0434\u0438\u043a\u0441\u0430 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91906,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91905","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker: \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u044d\u043a\u0441\u043a\u0443\u0440\u0441 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-20T05:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-20T05:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47O que \u00e9 Docker: um breve resumo da hist\u00f3ria e das principais abstra\u00e7\u00f5es | ProHoster","description":"Em 10 de agosto, a Slurm iniciou um curso em v\u00eddeo sobre Docker, no qual abordamos tudo \u2014 desde as abstra\u00e7\u00f5es b\u00e1sicas at\u00e9 os par\u00e2metros de rede.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker: \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u044d\u043a\u0441\u043a\u0443\u0440\u0441 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 | ProHoster","og:description":"10 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 \u0421\u043b\u0451\u0440\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b \u0432\u0438\u0434\u0435\u043e\u043a\u0443\u0440\u0441 \u043f\u043e Docker, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u0434\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0438.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/chto-takoe-docker-kratkij-ekskurs-v-istoriyu-i-osnovnye-abstrakczii","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-20T05:42:23+00:00","article:modified_time":"2020-08-20T05:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91905","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:18:28","updated":"2022-10-01 05:09:53","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/91905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=91905"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/91905\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/91906"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=91905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=91905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=91905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}