Del curso: Fundamentos de Docker
O que é o Docker? - Tutorial de Docker
Del curso: Fundamentos de Docker
O que é o Docker?
E aí, pessoal. Tudo tranquilo? Então, nesse vídeo ele vai ser um aula mais teórica, tá? Porque a gente vai entender inicialmente o que é o Docker. Beleza? Mas antes de a gente poder falar especificamente sobre o que é o Docker, beleza? a gente precisa entender outros conceitos importantes, como o conceito de containers, né? Então, o que são containers? Para a gente conseguir entender bem detalhadamente o que é um container? Eu preciso falar sobre três conceitos para vocês processos, namespaces e Cgrupos. Então, primeiramente, o que são processos, né? Então, no contexto de sistemas operacionais, um processo, ele é um programa em execução, juntamente com todas as informações necessárias para controlar a execução desse programa. O processo, ele vai ser a unidade básica de alocação de recursos Gerenciamento de tarefas em um sistema operacional. Cada processo representa uma tarefa ou um programa em execução e o sistema operacional gerencia múltiplos processos de maneira concorrente. Tá? Então, basicamente, quando está no Windows, por exemplo, você pressiona CTRL+SHIFT+DELETE, ou CTRL+ALT+DELETE, e abre o gerenciador de tarefas, ou quando se está em um sistema Unix como Linux, macOS, e digita o comando top lá no terminal você abre o gerenciamento de tarefas e cada linha dele é um processo. Então, por exemplo, aqui no caso do gerenciador de tarefas do Windows, né? Então, cada programa que você tem aberto é um processo que está executando no sistema operacional. Da mesma maneira, aqui no Linux você tem tudo o que está sendo executado pelo sistema de maneira individual e um processo. Então, o processo é a unidade mínima de software que está sendo gerenciada pelo sistema operacional e que tem uma quantidade de recursos alocados para o seu funcionamento. Logo em seguida existem os namespaces. Então, os namespaces são um mecanismo que permite isolar recursos de sistema para processos individuais ou grupos de processos. Então, os namespaces são uma parte importante da tecnologia de containers, e eles são usados para criar ambientes isolados, nos quais os processos podem ser executados sem afetar o sistema hospedeiro ou outros processos. Então, os namespaces são uma maneira de agrupar diferentes processos. Então, por exemplo, eu posso ter um namespace ABC com três processos executados dentro desse namespace e um outro namespace DEF que coloquei como exemplo executando outros três processos. A partir do momento que eu o a utilizar os namespaces, esses processos estão isolados, ou seja, o processo dentro de um namespace não consegue afetar um processo que está executando dentro de um outro namespace, ou muito menos os processos que estão executando diretamente no sistema operacional ou está no sistema operacional que tá instalado na máquina. Então é basicamente uma maneira de conseguir isolar esses processos e organizar eles em grupos, de maneira que eles não consigam interferir um nos outros. Com esses dois pontos a gente já consegue ter um entendimento basicamente do que vai vir a ser um container, né? container é basicamente, nada mais é do que um conjunto de processos ali que estão isolados. Só ainda tem mais uma questão por mais que eu consiga isolar os processos a partir de namespaces, nada garante que um processo ainda não vai conseguir interferir em um outro processo por conta dos recursos de hardware que estão sendo utilizados. Então imagina o seguinte eu tenho aqui dois namespaces e cada namespace tem três processos, porém todos eles estão sendo executados na mesma máquina. Essa máquina tem recursos finitos, ela tem uma determinada quantidade de memória RAM, Ela tem uma determinada quantidade de poder de processamento. Se um namespace aqui, por exemplo, esse primeiro namespace, os processos que ele está executando estão extraindo demais recursos dessa máquina. Então, utilizando muito processamento, eu estou utilizando muito da memória RAM. Querendo ou não, isso vai acabar afetando a execução dos processos que estão em outro namespace. E aí, para resolver esse problema, a gente tem um terceiro conceito, que são os Cgroups, né? Então é um recurso dos sistemas operacionais Linux que permite o controle, a limitação e o monitoramento dos recursos de sistema alocados a processos ou grupos de processos. Os namespaces. Eles são utilizados principalmente para gerenciar o uso de recursos como U, memória, disco e largura de banda da rede, entre alguns outros, para que múltiplos processos possam ser executados de forma eficiente e justa em um sistema compartilhado. Então, quando a gente junta processos, namespaces e grupos, a gente tem um container e aí a gente pode ir para de fato a definição de container. Então, o container é um processo isolado em execução em uma máquina host, o sistema operacional que você tem instalado na tua máquina, que vai estar isolado de todos os outros processos em execução nessa mesma máquina. Esse, esse isolamento. Ele vai utilizar namespaces e os Cgroups. O Docker no caso, que é uma ferramenta de containers que a gente vai aprender durante o curso, ele torna essas capacidades íveis e fácil de usar. Então, para resumir um container, ele é uma instância executável de uma imagem no qual você pode utilizar o Docker para criar, iniciar, parar, mover ou excluir um container. Você pode. Ele pode ser executado em máquinas locais, máquinas virtuais ou implementado na nuvem. Um container é portátil, ou seja, ele pode ser executado em qualquer sistema operacional e ele está isolado de outros containers e executa seu próprio software binários e configurações. Então o container é uma maneira de a gente conseguir executar uma aplicação, digamos assim, de maneira isolada e dentro daquele container. Essa aplicação vai ter tudo o que ela precisa para poder funcionar e isso vai estar isolado, porque ele tem os seus próprios processos que estão isolados dos processos restantes da máquina do sistema operacional host por namespaces. E ele também vai ter ali uma quantidade de recursos de hardware alocado para o seu funcionamento a partir dos recursos de Cgroups, Beleza? E aí quando a gente fala em containers é muito comum a dúvida Container é a mesma coisa que máquina virtual ou não? Então, container é diferente de máquina virtual, porque quando ele está trabalhando com a máquina virtual, nós temos a nossa infraestrutura, que é ali a nossa máquina, né? E nessa nossa máquina a gente tem o nosso sistema operacional, que é o sistema operacional host. Acima disso, a gente tem uma camada que a camada de virtualização aqui, no caso, está sendo utilizado o Hypervisor né? Mas você poderia colocar aqui como por exemplo o O VirtualBox, esse hypervisor e essa camada de virtualização vai ter um outro sistema operacional, que é o sistema operacional que está sendo virtualizado, que é o que a gente chama de guest OS O sistema operacional convidado é acima desse sistema operacional convidado. A gente tem os binários e bibliotecas necessárias e a aplicação de fato que a gente está executando. No caso de contêiner, essa arquitetura é menor, porque a gente tem a nossa infraestrutura, o sistema operacional e a gente tem a engine do container Então veja, eu não tenho um sistema operacional guest. No caso da máquina virtual, eu preciso de todo o sistema operacional sendo executado, além do meu próprio sistema operacional. No caso de containers o container ele vai rodar em cima da própria do próprio sistema operacional host, porque ele vai utilizar o próprio conceito de processos, Cgroups e namespaces para conseguir reutilizar e reaproveitar os recursos do próprio sistema operacional host para evitar que ele seja muito grande, muito pesado e aí acima do Container Engine, que é aquilo que vai gerenciar essa questão dos processos namespaces, esse Cgroups e que a gente tem os binários necessários para executar a aplicação e a aplicação propriamente dita que vai estar sendo executada dentro daquele container. Com isso, os containers são menores do que máquinas virtuais. Eles conseguem executar em uma velocidade muito maior e eles são mais performáticos porque eles conseguem reaproveitar recursos que já existem no sistema operacional. Por exemplo, se você tem uma máquina que tem o sistema operacional Linux Ubuntu e você vai executar uma máquina virtual também Ubuntu, todo o sistema operacional Ubuntu vai ser baixado e executado para criar essa máquina virtual. No caso de um container, se você tem uma máquina que tem o sistema operacional Ubuntu e vai executar um contêiner com Ubuntu também, tudo aquilo que atua o teu sistema padrão, o teu sistema host já tem vai ser reutilizado pelo container. O container não vai baixar tudo isso de novo e não vai precisar executar isso, digamos assim, duas vezes, tá? E aí a gente vai falar um pouquinho sobre imagem. Na hora que eu tava explicando sobre o que são containers, então, o que são essas imagens? Então, isso aqui é uma descrição e uma definição que está diretamente no site do Docker. Tá na documentação do Docker, inclusive está aí o link. Então o container em execução ele vai utilizar um sistema de arquivos isolados e esse sistema de arquivos isolados é fornecido por uma imagem e a imagem. Ela deve conter tudo o que é necessário para executar um aplicativo, todas as dependências, configurações, scripts, binários, etc. A imagem também contém outras configurações para o container, como variáveis de ambiente. O comando padrão para execução e outros metadados. Então, a imagem é aquilo que vai de fato gerar os nossos containers. A imagem é o que vai definir como o container vai ser executado, qual o sistema operacional que ele deve utilizar, quais são os comandos que devem ser executados naquele container para que de fato ele funcione corretamente? Quais são as aplicações que devem estar instaladas e qual que é o script que deve ser executado para subir a aplicação que a gente está colocando dentro daquele container. O container. No final das contas, ele é uma instância da minha imagem e essas imagens são criadas a partir do caso do Docker, pelo que a gente chama de Dockerfile, que é um arquivo de definição das imagens. Então aqui, por exemplo, cada linha dessa aqui vai definir o que tem que ser feito para conseguir gerar o final. No final, aquela minha imagem a gente vai ver mais detalhamento de forma mais detalhado como é que funciona o Docker falho. Mas aqui eu estou utilizando o FROM para definir de qual imagem eu estou partindo. Sempre que a gente vai trabalhar com imagem de parte de alguma imagem padrão. Aqui no caso, eu estou partindo de uma imagem que tem um nome na versão 18. Eu to copiando também os arquivos da minha aplicação para dentro dessa imagem. Dentro dessa imagem tem que ser executado aqui o yarn install para instalar as dependências da minha aplicação e quando essa imagem for instanciada em um container, o comando final que tem que ser executado é o node source index js para de fato executar essa aplicação dentro do container. E eu também defendo que essa imagem aqui, ao ser instalada em um container, ela vai expor uma porta que a porta 3000 para onde eu vou conseguir ar essa aplicação? Então a imagem é basicamente aquilo que vai, no final das contas, ser instanciado a partir de um container. Como eu defino as coisas e essa imagem? Ela é criada a partir de Dockerfile. Existem outras maneiras, mas por enquanto a gente vai focar aqui apenas no Dockerfile, tá? Então, no final das contas, o que vem a ser o doc? O Docker é uma plataforma aberta para desenvolver, enviar e executar aplicativos. O docker Ele permite que você separe os seus aplicativos da sua infraestrutura para que você possa entregar software rapidamente. Com o Docker, você pode gerenciar a infraestrutura da mesma forma que gerencia seus aplicativos. Ao aproveitar as metodologias do Docker para enviar, testar, implantar código, você pode reduzir significamente o intervalo entre escrever código e executá lo em produção. Também uma definição tirada diretamente da documentação do Docker, tá? então o Docker Ele é uma plataforma que vai te entregar uma forma mais fácil de conseguir trabalhar com o conceito de containers e também entregar outras funcionalidades, como por exemplo a parte de gerenciamento de imagens, de volumes e também de redes, que são coisas que a gente vai ver também ao longo do curso, tá? E o Docker, Ele tem uma arquitetura, ele funciona a partir de determinada maneira. Então a gente tem basicamente quatro principais componentes aí na arquitetura do Docker, que é o Docker client, o Docker API, o Docker daemon também de Docker engine e o Docker registry o Docker. Ele funciona no conceito de client server cliente servidor, então ele tem na parte do servidor aquilo que de fato vai conseguir fazer todo o gerenciamento de containers e imagens e que está definido a partir desse docker daemon. Então o Docker daemon é o componente do Docker que vai conseguir de fato fazer todo o trabalho de gerar as imagens e startar containers a partir de uma determinada imagem. baixar uma imagem ou então fazer o de uma imagem para dentro de um determinado repositório. Esse Docker daemon é o que está na parte do servidor ou Docker Engine também. Para a gente conseguir se comunicar com o Docker daemon, a gente utiliza o client, o Docker client. Existem vários tipos de Docker client. No curso a gente vai ver basicamente a Docker CLI, que é a linha de comando do Docker, é esse Docker client. Ele se comunica a partir do A com o Docker daemon a partir de uma Docker API. Então essa comunicação se dá a partir do Docker API. Então, quando executado em um comando como o Docker, docker build ou docker pull, eu estou utilizando o Docker client que está se comunicando com o Docker daemon ou Docker engine, tá? E por fim, a gente tem a Docker Registry. A Docker Registry é basicamente um repositório onde a gente pode guardar e buscar novas imagens. Beleza? Então a Docker padrão do Docker é a Docker Hub, Então a gente vai pensar ali mais ou menos como uma espécie de GitHub, tá? Então, lá você tem imagens que foram criadas por outras pessoas e imagens que você pode criar e colocar lá dentro. Então aqui eu vou dar um exemplo quando a gente executa esse comando aqui, que é o Docker pull. É um comando para baixar uma imagem. Então, quando você executa aqui o Docker pool, ele vai se comunicar com o Docker daemon a partir da Docker API. O Docker daemon então vai verificar se a imagem que você quer baixar ela já está disponível ali na tua máquina localmente. Se ela não tiver o Docker daemon, então vai se comunicar com a Docker Registry para baixar essa imagem, então disponibilizá la para você. Beleza, Então, essa é mais ou menos a arquitetura do Docker. Então, por fim, alguns conceitos aqui importantes para te deixar na mente. Containers são instâncias em tempo de execução das imagens Docker, os containers são isolados uns dos outros e do sistema host, mas compartilham o kernel do sistema operacional subjacente, o que os torna leve e eficiente. Aquela questão que eu falei o container não é a mesma coisa que a máquina virtual, porque você não tem todo o sistema operacional. Ele vai conseguir reutilizar coisas do sistema operacional a qual ele está executando. Segundo ponto imutabilidade As imagens do Docker são imutáveis, o que significa que, uma vez que a imagem é criada, ela não pode ser alterada, a não ser que você crie uma nova imagem e gera uma nova versão daquela mesma imagem. Se você precisar fazer uma versão, você vai criar uma imagem nova ao ajustar a versão dela. Isso vai ajudar a garantir uma consistência e previsibilidade em ambiente de desenvolvimento, teste e produção. Reutilização As imagens do que elas podem ser reutilizadas em diferentes ambientes e por diferentes equipes. Isso vai facilitar a colaboração e implantação de aplicativos em vários ambientes, como desenvolvimento, teste e produção. O principal ponto nessa parte de reutilização, principalmente para a gente que desenvolve, é que, por exemplo, quando você entra em uma nova empresa, em vez de você ter que gastar todo o tempo ali, se preocupando em preparar o seu ambiente de desenvolvimento para conseguir executar a aplicação ao qual você vai trabalhar, você simplesmente pode utilizar uma imagem Docker que já existe ali, que a empresa tem, que tem toda a configuração necessária para conseguir rodar aquela aplicação. Então você não precisa gastar um tempão preparando um ambiente de desenvolvimento para isso. Depois a gente tem os registros Docker, né? Então, essas imagens doc Elas são armazenadas em registros do Docker ou Docker , que são repositórios online, onde as imagens podem ser compartilhadas e distribuídas. Como eu falei, o Docker padrão e o Docker hub, mas você pode utilizar outros ou até mesmo existem casos onde uma empresa ou organização tem o seu próprio Docker registro privado, digamos assim, aonde os funcionários vão apontar ali a sua Docker engine para utilizar aquele Docker nós temos o Dockerfile, que é o arquivo de configuração usado para definir como a imagem Docker deve ser construída. Ele vai listar as instruções para instalar as dependências, copiar arquivos, configurar as variáveis de ambiente e executar os comandos dentro do container. E por fim, o lettering. As imagens Docker são compostas por camadas, por layers e essas camadas elas são empilhadas umas sobre as outras. Cada instrução do Dockerfile cria uma nova camada dentro daquela imagem. Isso permite que as imagens sejam eficientes em termos de armazenamento, pois cada camada compartilhada entre imagens semelhantes são reutilizadas. Então, voltando nessa parte aqui das camadas, quando a gente tem, por exemplo, o Dockerfile, cada linha dessas aqui define uma camada da minha imagem Docker. Quando eu tenho camadas que são muito similares entre diferentes imagens que estão na minha máquina, essas imagens são reutilizadas. Nessas camadas são reutilizadas, o que garante um tamanho menor para as minhas imagens Docker. Então eu tenho mais eficiência na quantidade de armazenamento interno que eu estou consumindo para utilizar essas minhas imagens. E outro ponto interessante na questão dessas camadas é que se eu altero alguma dessas camadas, apenas a camada alterada vai ser modificada quando eu for regenerar a minha imagem, quando eu for gerar uma nova imagem a partir desse Dockerfile. Então, por exemplo, dentro desse, dentro desse conceito, aqui, dentro desse contexto, se eu mudo aqui, por exemplo, esse run em install para um comando diferente, quando eu for buildar essa imagem novamente, ele não vai executar tudo do zero. Ele vai reutilizar aquilo que ele já tinha e vai só mudar essa camada que especifica que faz esse rum. O resto permanece igual. Isso também traz performance porque há o processo de gerar novas imagens. Se torna muito mais rápido porque eu não preciso fazer tudo do zero, só preciso atualizar a camada que foi modificada. Beleza? Então é isso. Essa é a parte teórica que eu queria mostrar para vocês aqui em relação ao Docker, pra gente pelo menos entender o que é um container? O que, como é que, como é que ele funciona? O que são as imagens? E também tem um entendimento mais geral aí do que é o Docker e como é que ele funciona a partir do conhecimento da sua arquitetura, né? Esses conceitos vão ficar mais claros à medida que a gente vai utilizando o Docker. Beleza? Então, se você não entendeu tudo agora, não tem problema, recomendo dar uma assistida no vídeo ou até mesmo dar uma olhada nos links que eu deixei aqui no slide. O slide vai ficar como referência na aula para ver um pouquinho da documentação do blog e ali as explicações que a própria documentação fala sobre containers, imagens e o que é o Docker. Beleza, mas é isso. Vou ficando por aqui e até a próxima!