O que é Docker?
Tags: devops, docker, beginners, codenewbie
Published: 2023-07-07 12:03:47

O Docker não inventou os contêineres, mas tornou-os mais fáceis de usar com três etapas:

1. Imagens: Ajuda você a empacotar um aplicativo (com *todas* as suas dependências).
2. Registros: Ajudam a distribuir o aplicativo em todos os locais que você precisa para executá-lo.
3. Contêineres: Executam o aplicativo de uma forma altamente reproduzível.

O Docker chama isso esse ciclo de vida de "Construir, Enviar e Executar".

![Docker Build, Ship and Run](https://github.com/diegodmitry/annotation/raw/main/courses/Docker%20Mastery/images/build-ship-run.excalidraw.png)

Esses são os princípios básicos sobre os quais todas as outras tecnologias de contêineres são construídas.

Observe que essas inovações agora têm padrões e são regidas pela [Open Container Initiative (OCI)] (https://opencontainers.org/about/overview/), que faz parte da Linux Foundation.

## A Imagem Docker

![The Docker Image](https://github.com/diegodmitry/annotation/raw/main/courses/Docker%20Mastery/images/image-basics.excalidraw.png)

1. É chamado de "imagem do Docker", o nome padrão é: "Imagem OCI" ou apenas "imagem".
2. O Docker usa uma lista de instruções, chamada de Dockerfile, que é semelhante a um script em shell, e coloca essas instruções em camadas umas sobre as outras até ter tudo o que você precisa para executar o aplicativo, inclusive todas as dependências do sistema.
3. A inclusão das dependências é um diferencial importante entre o Docker e muitos sistemas de empacotamento. Isso ajuda a evitar o problema: "funciona na minha máquina".
4. Se fosse um aplicativo Python para compilar, a imagem conteria o próprio aplicativo e todas as dependências Python de que precisa.
5. A principal distinção é ela também inclui a versão exata do Python e as bibliotecas do sistema para executar corretamente o Python.
6. Tudo está incluído, exceto o kernel do sistema operacional e os drivers de hardware. Até mesmo metadados sobre como iniciar o aplicativo, variáveis de ambiente padrão e quais portas ele escuta estão incluídos.

## O Registro
![The Docker Registry](https://github.com/diegodmitry/annotation/raw/main/courses/Docker%20Mastery/images/registry-basics.excalidraw.png)

1. Chamado de "registro do Docker", ou apenas "registro", para abreviar.
2. Essa inovação foi a chave para conectar nossa criação de imagens em uma máquina para executar nossos contêineres em outra.
3. Agora que criamos uma imagem e a executamos em nossa máquina local, como a colocamos em todas as outras máquinas?
4. Como posso ter certeza de que o restante da minha equipe, meu teste de CI e todos os meus servidores executam exatamente a mesma imagem?
5. O registro é um gerenciador de pacotes baseado em HTTP que funciona como o apt, yum, npm e outros gerenciadores de pacotes.
6. Você pode fazer *upload* de uma imagem e, em seguida, *downlaod* da imagem em outro lugar.
7. O protocolo de registro é eficiente. Ele só faz upload e download das partes alteradas (camadas) e armazena a imagem no cache local das máquinas para a execução rápida de novos contêineres.

> Pense nas imagens e no registro como o gerenciador de pacotes, onde podemos criar, baixar e executar qualquer aplicativo em qualquer sistema. Isso inclui a criação e a execução no Linux, macOS, Windows, na nuvem, no seu data center, em um mainframe ou em um pequeno Raspberry Pi. O Docker funciona em todos eles.

## O Docker Container

![The Docker Container](https://github.com/diegodmitry/annotation/raw/main/courses/Docker%20Mastery/images/container-basics.excalidraw.png)

 1. Chamado de "Docker contêiner", o nome padrão "Contêiner OCI" ou apenas "contêiner". Ele **não** é chamado de "docker" ou "dockers". Docker são muitas coisas.
 2. O Docker iniciará sua imagem de contêiner em um novo contêiner em execução e usará o comando especificado no Dockerfile para iniciá-lo.
 3. Usa dois recursos do kernel Linux, chamados namespaces e cgroups (grupos de controle), para isolar seu aplicativo de modo que ele não possa ver o restante do host. Para o aplicativo, os únicos arquivos que ele vê são os que estão na imagem do contêiner. Ele não vê nenhum outro processo fora do contêiner e até mesmo tem sua própria interface de rede e IP privado.
 4. Agora, deixe-me enfatizar: isso *NÃO* é virtualização. Trata-se de isolamento de aplicativos, semelhante ao chroot.
 5. Você pode iniciar muitos desses contêineres a partir da mesma imagem de contêiner, no mesmo sistema, e todos eles estarão isolados uns dos outros. As alterações de arquivos em um contêiner não afetam os arquivos em outro.

## Leitura adicional
- [Kubernetes vs Docker](https://dev.to/diegodmitry/kubernetes-vs-docker-8mg)