À medida que a abordagem de nuvem está ganhando popularidade, muitas empresas começaram a adotar práticas e conceitos de nuvem como a conteinerização. Com isso, ferramentas DevOps, como o Docker, estão em alta demanda.
Neste artigo, você vai descobrir o que é Docker, o que precisa saber para usá-lo e qual a sua função no universo de desenvolvimento, além de conhecer mais sobre contêineres e suas imagens.
A relevância disso?
De acordo com uma pesquisa do Gartner, mais de 75% das organizações globais estarão executando contêineres em produção em 2022. Atualmente, o Docker Hub contém mais de um milhão de imagens de contêiner, incluindo imagens certificadas e fornecidas pela comunidade.
Agora vamos aprender mais sobre esse universo.
Mas o que é Docker?
É uma ferramenta Open Source para desenvolvimento, envio e execução de aplicativos. Ele permite que você separe os aplicativos de sua infraestrutura, para que você possa entregar um software rapidamente.
Se Docker se tornou uma ferramenta padrão para pessoas desenvolvedoras de software e administradoras de sistemas é porque é uma maneira elegante de iniciar aplicativos rapidamente sem afetar o resto do seu sistema, pois permite gerenciar sua infraestrutura da mesma forma que gerencia seus aplicativos, usando o conceito de contêineres.
O conceito de contêineres
Um contêiner fornece um ambiente isolado semelhante a uma máquina virtual (VM). Mas ao contrário das VMs, os contêineres do Docker não executam um sistema operacional completo. Eles compartilham o kernel do seu host e o hardware da máquina host com, aproximadamente, a mesma sobrecarga dos processos iniciados diretamente na máquina host.
Observação: A ferramenta utiliza, na verdade, o kernel subjacente e não o sistema operacional. Portanto, mesmo que a máquina na qual o Docker está instalado use Ubuntu, Docker ainda pode instalar contêineres baseados no Fedora, etc., pois o kernel subjacente é o mesmo (neste caso, Linux).
Os contêineres encapsulam tudo o que é necessário para executar um aplicativo, desde as dependências do pacote do Sistema Operacional (SO), até seu próprio código-fonte.
Docker permite automatizar a implantação de aplicativos no ambiente do contêiner. Para isso, a pessoa usuária define as etapas de criação de um contêiner como instruções em um Dockerfile e Docker usa ele para construir uma imagem.
Tá, e o que são imagens?
As imagens definem o software disponível nos contêineres. Uma imagem do Docker contém código de aplicativo, bibliotecas, ferramentas, dependências e outros arquivos necessários para executar um aplicativo. Quando alguém executa uma imagem, ela pode se tornar uma ou várias instâncias de um contêiner.
Em outras palavras, se você criar uma imagem, qualquer user do poderá iniciar seu aplicativo através de um comando (docker run).
Vantagens de usar contêineres
Uma das principais vantagens de usar contêineres é a garantia de que todos os ambientes são idênticos:
- Uma nova pessoa na equipe poderia usar o Docker para configurar sua própria instância de desenvolvimento;
- É possível usar a mesma imagem do Docker para implantar localmente e em produção. Assim, o ambiente corresponderá exatamente à sua instância local, evitando cenários “funciona na minha máquina”.
Hoje, sem contêineres, as organizações entram em algo chamado “Matrix from Hell“, onde você tem diferentes tipos de aplicativos, dependências e ambientes, e todos esses elementos precisam trabalhar juntos para que seu software funcione com eficiência. Isso realmente é um inferno.
Em outras palavras, Docker permite que você economize muito tempo no processo de configuração, que em alguns casos pode ser muito longo e caro, tanto em termos de tempo quanto em termos de pessoal dedicado (consequentemente, também em nível econômico).
Usar Docker também pode ser mais conveniente do que usar uma máquina virtual completa. As VMs são ferramentas projetadas para oferecer suporte a todas as cargas de trabalho possíveis.
Por outro lado, os contêineres são leves, autossuficientes e mais adequados para casos de usos descartáveis. Como o Docker compartilha o kernel do host, os contêineres têm um impacto insignificante no desempenho do sistema. O tempo de inicialização do contêiner é quase instantâneo, pois você está apenas iniciando processos, não um sistema operacional inteiro.
Desafios de usar contêineres
Apesar das suas inúmeras vantagens, a ferramenta não é uma bala de prata. Ele também tem seus desafios, vamos abordar alguns deles aqui.
1. Foi projetado como solução para implantação de aplicativos de servidores, que não requerem uma interface gráfica. Embora existam algumas estratégias para poder executar um aplicativo GUI dentro de um contêiner, essas soluções são, na melhor das hipóteses, desajeitadas.
2. Persistir dados é complicado. Por design, todos os dados dentro de um contêiner desaparecem para sempre quando o contêiner é encerrado, a menos que você os salve em outro lugar primeiro. Contudo, existem maneiras de fazer isso no Docker, como usando o Docker Data Volumes, por exemplo.
3. Com o uso adequado, Docker pode aumentar o nível de segurança (em comparação com a execução de aplicativos diretamente no host). Por outro lado, algumas configurações incorretas podem levar ao downgrade do nível de segurança ou até mesmo introduzir novas vulnerabilidades.
Quer saber mais como manter sua operação com contêineres segura? Então assista a palestra “Vulnerabilidades em Imagens de Containers” retirada da trilha da Zup no TDC Connections 2021.
Orquestração de contêineres
Hoje em dia, é comum usar uma plataforma de orquestração como o Kubernetes ou Docker Swarm para usar Docker em produção. Essas ferramentas são projetadas para lidar com várias réplicas de contêiner, o que melhora a escalabilidade e a confiabilidade.
Docker se tornou um componente. Os orquestradores utilizam as mesmas tecnologias de tempo de execução de contêiner para fornecer um ambiente mais adequado à produção. O uso de várias instâncias de contêiner permitem atualizações contínuas, bem como distribuição entre máquinas, tornando sua implantação mais resiliente à mudanças e interrupções.
Resumindo a terminologia do Docker
Contêiner: ambiente isolado e leve que pode ter seus próprios processadores, interfaces de rede, etc., mas compartilham o mesmo kernel do sistema operacional. Criado a partir de uma versão de imagem específica.
Imagem: uma imagem é basicamente um pacote executável que possui tudo o que é necessário para executar aplicativos, o que inclui um arquivo de configuração, variáveis de ambiente, tempo de execução e bibliotecas.
Dockerfile: contém todas as instruções para criar uma imagem do Docker. É basicamente um arquivo de texto simples com instruções para construir uma imagem. Você também pode se referir a isso como a automação da criação de imagens do Docker.
Tag: versão de uma imagem. Cada imagem terá uma tag.
Docker Hub: repositório de imagens onde podemos encontrar diferentes tipos de imagens.
Docker Engine: o sistema que permite criar e executar contêineres.
Docker Registry: o registro do Docker é uma solução que armazena suas imagens. Este serviço é responsável por hospedar e distribuir as imagens. O registro padrão é o Docker Hub.
Docker CLI: interface de linha de comando (CLI) que permite à pessoa executar ações interagindo com Docker. É executado em uma arquitetura cliente-servidor, o que significa que clientes podem se conectar a hosts do Docker localmente ou remotamente. Tanto cliente quanto host do Docker (Daemon) podem ser executados no mesmo host, ou podem ser executados em hosts diferentes e se comunicar por meio de soquetes ou de uma API RESTful.
Uma plataforma poderosa para contêineres
Docker foi criado com pessoas desenvolvedoras, administradoras de sistemas, engenheiras de teste, de operações e arquitetas de TI em mente. Ele oferece tudo o que você precisa para trabalhar com contêineres.
Hoje em dia, é uma ferramenta chave para o desenvolvimento de software e administração de sistemas. Ele requer uma compreensão dos conceitos básicos de contêiner para criar suas imagens e ambientes especializados, para diminuir suas cargas de trabalho.
E aí? O que achou do nosso artigo? Esperamos que tenha curtido! Aproveite para continuar navegando no nosso blog e conhecendo mais conceitos de desenvolvimento.