Você está na página 1de 3

Introdução

O que são containers?


Definição do oficial

Um container é um padrão de unidade de software que empacota código e todas as


dependências de uma aplicação fazendo que a mesma seja executada rapidamente
de forma confiável de um ambiente computacional para o outro.

Como funcionam os containers?


Namespaces
Um computador roda processos. Podemos isolar um conjunto de processos com a
mesma origem em um namespace. Assim, processos filhos terão o mesmo
namespace do pai. Um container tem um processo principal. Todos os processos
filhos rodarão dentro do container. Se matarmos o processo principal, destruímos o
container. Assim, um container emula todo o funcionamento do sistema
operacional, porém acessando apenas os seus processos filhos.
Como em um SO, dentro de um container podemos ter:

Pid

User

Network

File system

Um container é um processo, com sub-processos, emulando um


sistema operacional.

Cgroups

Cgroups controlam os recursos computacionais de um container. Assim, além de


isolar processoes, podemos isolar também os recursos computacionais usados por
um container. Dessa forma, os processos de um container não afetam os outros
recursos da mesma máquina. Por exemplo, podemos definir que um container usará
apenas 512MB de RAM.

File System

Introdução 1
Containers trabalham com OFS (Overlay File System). Isso significa que suas
dependências são criadas por meio de camadas. Por exemplo: em um container
estamos rodando o app 1. Nele temos a dependência 1 e a dependência 2. Então,
queremos criar uma cópia desse app. Nesse caso, não criamos uma cópia das
dependências 1 e 2. Como os arquivos das dependências estão em uma camada
separada, podemos reaproveitá-los, sem ter que criar uma cópia deles. Isso torna
os containers bem leves, visto que ele não precisa criar cópias de tudo.

Imagens

As imagens são criadas a partir de camadas. Uma imagem é uma união de


dependências, cada uma dessas dependências sendo uma camada que pode ser
reutilizada em outras imagens. Imagens têm um nome e podem ter uma versão.

Dockerfile

Uma das formas de criar imagens no Docker é usar um arquivo declarativo, que
descreve como será a imagens que queremos construir. Geralmente, ao criar um
Dockerfile, partimos de uma imagem pré-existente.

FROM: ImageName # nome da image


RUN: Comandas ex: apt-get install # comandos a serem rodados
EXPOSE: 8000 # portas a serem expostas

Imagens são imutáveis. Isso permite subir containers de forma


rápida. Embora as imagens sejam imutáveis, podemos criar
arquivos dentro de um container. Ao subir um container, é criada
uma camada de leitura e escrita que nos permite criar arquivos.
No entanto, a camada de escrita não altera a imagem. Se
matarmos o processo que roda um container, tudo o que foi
escrito na camada de escrita e leitura também é destruído.

Outra forma de gerar imagens, além de usar o Dockerfile, é dar um commit em um


container que está rodando. Com isso, geramos uma nova versão da imagem que
deu origem ao container. Dessa forma, tudo o que foi escrito na camada de leitura e
escrita passa a fazer parte da nova versão da imagem.

As imagens ficam dentro do Image Registry que é um repositório de imagens,


semelhante ao Github. Podemos dar um pull no registry para pegar uma imagem

Introdução 2
e podemos dar um push para enviar alterações (após buildar a imagem) na imagem
para o registro.
Docker

O docker é uma solução que integra namespaces, cgroups e file system. O


docker usa o conceito de docker host, que é onde ele roda. Nesse host, um
processo (daemon) disponibiliza uma API. Por meio de um client, podemos fazer
chamadas nessa API que nos permite criar containers, destruir, rodar etc. Além
disso, o docker host possui um cache. Nesse cache ficam registradas as imagens
que já acessamos (a partir do registry), de modo que não precisamos baixá-las a
cada vez que queremos usá-las. O docker host também possui a capacidade de
gerenciar volumes. Com isso, podemos mapear, por exemplo, um diretório do
container e um diretório do nosso computador. Dessa forma, criamos uma camada
de persistência que permite manter arquivos criados no container, após destruí-lo. O
docker também abstrai a parte de network, possibilitando a comunicação entre
containers. Visto que cada container é um processo, precisamos de uma forma para
comunicar esses processos. A network do docker é o que nos permite fazer com
que um container com uma aplicação se comunique com um container com um
banco de dados.

Introdução 3

Você também pode gostar