O que é um container
Container é um pacote de uma aplicação que funciona de forma isolada do sistema operacional, com todas as suas dependências dentro de si. Uma aplicação autocontida que se comporta da mesma forma independente do ambiente em que está.
Conheça abaixo a definição de 2 grandes empresas de tecnologia de containers:
SUSE: Containers são pacotes de software que providenciam o ambiente de execução completo: a aplicação, mais suas dependências, bibliotecas de sistema, configurações e outros binários além dos arquivos de configuração necessários para seu funcionamento. Aplicações conteinerizadas funcionarão sempre da mesma forma, independente do ambiente.
RedHat: Containers Linux são tecnologias que nos permitem empacotar e isolar aplicações com seus ambientes de execução por completo somado a todos os arquivos necessários para funcionar. Desta forma facilitando a movimentação das aplicações conteinerizadas entre ambientes (desenvolvimento, teste, produção, etc.) enquanto mantêm o funcionamento completo.
Um container não é uma única tecnologia, como o Docker por exemplo, mas sim um conjunto de tecnologias presentes no kernel Linux que quando unidas nos permitem obter todas as vantagens citadas acima.
Tecnologias Envolvidas nos containers
Em 1979, a versão 7 do Unix criou os fundamentos da tecnologia, ou do isolamento, o chroot. O chroot isola o processo somente no nível de sistema de arquivos, mas ele ainda tem acesso a rede original ou aos usuários, por exemplo.
Em meados de 1980 um sistema operacional chamado Plan 9 passou a utilizar uma forma de combinar diretórios conhecida como union mounting.
Em 1986 a Sun Microsystems introduziu a primeira implementação de um sistema de arquivos baseado em camadas com “copy on write”, o Transluced File Service no SunOS 3.
Nos anos 2000 o FreeBSD 4 apresentou os jails, a evolução do chroot. Neste caso o processo continua isolado em seu sistema de arquivos, mas o acesso a outros recursos como usuários, rede e até mesmo outras partes do sistema de arquivos da máquina podem ser liberados e acessados de forma virtualizada, como se a máquina estivesse particionada em vários segmentos. Aqui surgiu o termo conhecido como virtualização em nível de sistema operacional.
Em 2001 o jails foi melhorado com o Linux VServer adicionando um particionamento quase que total, vários sistemas Linux poderiam rodar na mesma máquina sem a camada de emulação, todos em cima de um único sistema operacional, utilizando o mesmo Kernel.
Em 2002 surgem os namespaces, capaz de separar os recursos do Kernel do Linux de forma que cada processo dentro de um namespace diferente visualizasse um conjunto diferente de recursos, sendo assim, processos em um mesmo namespace veriam os mesmos recursos.
Em 2005 o OpenVZ adicionou oficialmente as capacidades do Linux VServer ao Kernel do Linux.
Em 2006 a tecnologia evoluiu mais ainda com o cgroups (control groups) que implementaram o isolamento e o limite a recursos como CPU e memória.
Em 2008 apareceu o LXC (Linux Containers), que definiu como seriam os containers de um futuro não tão distante, funcionavam no Kernel de forma completa, sem nenhum tipo de patch. O LXC era tão estável e simples que as outras duas próximas tecnologias surgiram utilizando-o como núcleo.
Em 2011 surge o Wardem, hoje o núcleo do Cloud Foundry. Neste ponto o interessante era criar uma ferramenta que não só fosse capaz de criar containers mas também gerenciá-los por conta própria.
Em 2013 aparece o tão conhecido Docker, que no momento era baseado em LXC e libcontainers, com o passar do tempo as coisas mudaram um pouco.
Transforme-se em um profissional em Containers requisitado pelo mercado.
Conheça nossa Assinatura de Cursos Containers:
Composta por
6 cursos
+180 horas de conteúdo
1 ano de acesso à plataforma
Acesso imediato aos cursos
Com 2 principais vantagens:
- Única plataforma de curso com cursos práticos e aula ao vivo.
- Única escola que também implementa projeto trazendo a experiência para sala de aula.
O que é Docker?
Docker é uma plataforma aberta para desenvolvimento e execução de aplicativos. O Docker permite que os aplicativos sejam separados da infraestrutura para que possam entregar o software rapidamente. Com o Docker, você pode gerenciar sua infraestrutura da mesma forma que gerencia seus aplicativos e com isso reduzir significativamente o atraso entre escrever o código e executá-lo na produção.
O Docker oferece a capacidade de empacotar e executar um aplicativo em um ambiente isolado denominado container. O isolamento e a segurança permitem que você execute vários containers simultaneamente em um determinado host. Os containers são leves e contêm tudo o que é necessário para executar o aplicativo, portanto, você não precisa depender do que está instalado atualmente no host.
Nem todas as tecnologias citadas acima estão presentes no Docker e além do mais muitas delas evoluíram. Diferentes ferramentas utilizam diferentes tecnologias, mas podemos citar três delas como as principais que estão presentes no Docker.:
Namespaces: É através dos namespaces que conseguimos o isolamento dos processos que rodam dentro dos containers, não somente dos processos em si mas também dos pontos de montagem como diretórios e dispositivos de disco, da rede e alguns outros.
Cgroups: É uma abreviação para control groups, através do cgroups é possível limitar e isolar o acesso a recursos da máquina como processador, memória e tráfego de rede.
Union Mount: São sistemas de arquivos baseados em camadas. Essas camadas podem ser compartilhadas entre diferentes containers, reduzindo o tamanho total da imagem em que o container é baseado. Alguns exemplos são UnionFS, overlay2, devicemapper, btrfs, zfs e aufs.
Imagens, Camadas e Containers
São as imagens que tornam os containers fáceis de se transportar. As imagens são imutáveis, como uma foto, contêm todo o ambiente de execução de um container, suas dependências e binários. Tudo isso junto em um único “pacote”, e a este pacote damos o nome de imagem. Uma imagem, ou uma foto, é a definição de algo naquele determinado instante no tempo e não podemos mudá-la (bem, ao menos não deveríamos) e uma vez que tenhamos criado esta imagem seu comportamento será o mesmo independente do ambiente, facilitando o trabalho dos programadores e dos responsáveis pelos provisionamentos.
Podemos fazer a analogia de que imagens de containers são exatamente como discos ópticos ou arquivos do tipo ISO, por exemplo, de uma distribuição Linux. Uma vez que tenhamos aquela imagem de uma distribuição Linux podemos realizar quantas instalações quisermos, cada instalação será um sistema de um usuário diferente e portanto, com o tempo de uso, apresentarão suas diferenças.
Mas a grande novidade para os containers não são as imagens, mas sim imagens baseadas em camadas.
Na maior parte das vezes os containers são baseados em imagens preexistentes, e estas imagens, por sua vez, podem ser baseadas em outras imagens e assim sucessivamente. Por exemplo, a imagem padrão do servidor web Apache é baseada em Debian. Se criarmos uma imagem de container com um site nosso teríamos uma imagem baseada na imagem do Apache que por sua vez é baseada em Debian.
Para simplificar, vamos imaginar que a imagem citada acima possui três camadas: a camada do nosso site, a camada do Apache e a camada do Debian. Com nossa imagem pronta para ir para produção pedimos para o servidor containers.example.com baixar esta imagem. O nosso servidor então baixa as três camadas, a do site, a do Apache e a camada do Debian. Alguns dias depois criamos uma imagem de um novo site e pedimos para o servidor containers.example.com baixá-la. Desta vez o servidor reconhece que possui as camadas Apache e Debian e baixa apenas a camada da imagem que representa o novo site.
Desta forma baixamos ou enviamos somente as camadas que não temos, fazendo com que novas aplicações ou atualizações cheguem mais rápido de um lugar ao outro.
Tudo isso soa um pouco mágico, mas são os containers rodando em cloud que estão permitindo a grande transformação digital pela qual as empresas estão passando. A automação da infraestrutura do mundo DevOps seria bem mais difícil sem a tecnologia de containers.
Por que esta tecnologia é chamada de container?
Com o que vimos até agora é fácil entender o nome container como sendo um recipiente para nossa aplicação. Porém podemos aprofundar um pouco mais e talvez essa analogia sirva para fixar os pontos fortes do por quê a adoção de containers está tão acelerada.
Para isso precisamos voltar para século XVIII, antes mesmo das ferrovias, no surgimento das primeiras utilizações de um processo conhecido como transporte intermodal de carga, que consiste em um recipiente capaz de transportar algo por meios variados de transporte. Nesta época, meados de 1780, a Inglaterra utilizou o que podemos chamar de primeiros containers para transportar carvão através de um canal conhecido como Bridgewater Canal. Esses containers de carvão eram feitos de madeira, conhecidos como caixas soltas, logo foram também utilizados nas estradas, puxados por cavalos. Em 1830 estes mesmos containers foram utilizados em ferrovias e em 1841, Isambard Kingdom Brunel, um engenheiro civil importante na revolução industrial, apresentou os containers de ferro para transportar o carvão. Em torno de 1900 os primeiros containers cobertos apareceram e a partir de então, entre 1910 e 1930 passaram a se padronizar. A partir desta data os containers passaram a ser carregados dos caminhões diretamente para os vagões e vice-versa. E em meados de 1950, Malcom McLean, considerado o desenvolvedor do transporte intermodal moderno de carga, ou o pai da “conteinerização”, revolucionou o transporte e o comércio internacional adaptando navios petroleiros para carregar containers, sendo o primeiro conhecido como SS Ideal X. A forma de carregar o navio era bastante simplificada e diminuía o tempo de carga, daí em diante as coisas são mais ou menos como já conhecemos.
Estes containers de aço são transportados através de estradas, ferrovias, navios e aviões sem modificações em sua estrutura, o transporte se modifica, mas o container não.
Olhando do futuro, tudo isso parece muito óbvio, padronizar para facilitar o transporte e manuseio, e por consequência, economizar investimento e tempo.