Um contêiner Docker é um formato de compactação que compacta todo o código e dependências de uma aplicação em um formato padrão que permite sua execução rápida e confiável em ambientes de computação. Um contêiner Docker é um popular contêiner leve, autônomo e executável que inclui tudo o que é necessário para executar um aplicativo, incluindo bibliotecas, ferramentas de sistema, código e tempo de execução. Docker também é uma plataforma de software que permite aos desenvolvedores criar, testar e implementar aplicativos em contêineres rapidamente.
Containers as a Service (CaaS) ou Serviços de contêiner são serviços de nuvem gerenciados que gerenciam o ciclo de vida de contêineres. Os serviços de contêiner ajudam a orquestrar (iniciar, parar, dimensionar) o tempo de execução dos contêineres. Usando serviços de contêiner, você pode simplificar, automatizar e acelerar o desenvolvimento de aplicativos e ciclo de vida de implementação.
Docker e Serviços de contêiner tiveram uma rápida adoção e foram um tremendo sucesso nos últimos anos. De uma tecnologia de código aberto quase desconhecida e bastante técnica em 2013, o Docker evoluiu para um ambiente de tempo de execução padronizado agora com suporte oficial para muitos produtos Oracle Enterprise.
Uma plataforma de contêiner de software projetada para desenvolver, enviar e executar aplicativos aproveitando a tecnologia de contêiner. O Docker tem duas versões: a enterprise edition e a community edition
Ao contrário de uma VM que fornece virtualização de hardware, um contêiner fornece virtualização leve no nível do sistema operacional, abstraindo o “espaço do usuário”. Contêineres compartilham o kernel do sistema host com outros contêineres. Um contêiner, que é executado no sistema operacional do host, é uma unidade de software padrão que compacta o código e todas as suas dependências, para que as aplicações possam ser executadas de forma rápida e confiável de um ambiente para outro. Os contêineres não são persistentes e são gerados a partir de imagens.
O software de host de código aberto que cria e executa os contêineres. Os Docker Engines atuam como a aplicação cliente-servidor que oferece suporte a contêineres em vários servidores Windows e sistemas operacionais Linux, incluindo Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE e Ubuntu.
Coleção de software a ser executado como um contêiner que contém um conjunto de instruções para criar um contêiner que pode ser executado na plataforma Docker. As imagens são imutáveis e as alterações em uma imagem exigem a criação de uma nova imagem.
Local para armazenar e fazer download de imagens. O registro é uma aplicação do lado do servidor escalável e sem monitoramento de estado que armazena e distribui imagens do Docker.
O Docker é uma estrutura de desenvolvimento de aplicações aberta projetada para beneficiar DevOps e desenvolvedores. Usando o Docker, os desenvolvedores podem facilmente criar, empacotar, enviar e executar aplicativos como contêineres leves, portáteis e autossuficientes, que podem ser executados em praticamente qualquer lugar. Os contêineres permitem que os desenvolvedores empacotem um aplicativo com todas as suas dependências e o implantem como uma única unidade. Ao fornecer contêineres de aplicativos pré-construídos e autossustentáveis, os desenvolvedores podem se concentrar no código do aplicativo e usá-lo sem se preocupar com o sistema operacional ou sistema de implementação subjacente.
Além disso, os desenvolvedores podem aproveitar milhares de aplicativos de contêiner de código aberto que já foram projetados para serem executados em um contêiner Docker. Para equipes de DevOps, o Docker se presta à integração e ao desenvolvimento contínuos de conjuntos de ferramentas, e reduz as restrições e a complexidade necessárias dentro de sua arquitetura de sistema para implementar e gerenciar os aplicativos. Com a introdução de serviços em nuvem de orquestração de contêiner, qualquer desenvolvedor pode desenvolver aplicativos em contêiner localmente em seu ambiente de desenvolvimento e, em seguida, mover e executar esses aplicativos em contêineres em produção em serviços em nuvem, como serviços Kubernetes gerenciados.
Os contêineres podem ser compactados por qualquer tipo de desenvolvedor. As pessoas no setor de software geralmente separam os desenvolvedores por especialização – front-end, back-end etc. Embora seja possível ver principalmente desenvolvedores de back-end compactando contêineres, qualquer pessoa familiarizada com os conceitos básicos de CaaS pode ter sucesso nessa área específica do ciclo de vida de desenvolvimento de software. Antes de compactar as dependências da sua aplicação, confira developer.oracle.com e familiarize-se com as ferramentas que você pode usar para criar uma aplicação ou um programa.
Os contêineres Linux existem desde 2008, mas eles não eram bem conhecidos até o surgimento dos contêineres Docker em 2013. Com o início dos contêineres Docker, surgiu a explosão de interesse no desenvolvimento e na implantação de aplicativos em contêineres. Conforme o número de aplicativos em contêiner cresceu para abranger centenas de contêineres implantados em vários servidores, operá-los se tornou mais complexo. Como você coordena, dimensiona, gerencia e programa centenas de contêineres? Aqui é onde o Kubernetes pode ajudar. Kubernetes é um sistema de orquestração de código aberto que permite que você execute seus contêineres Docker e cargas de trabalho. Ele ajuda a gerenciar as complexidades operacionais ao mudar para escalar vários contêineres implantados em vários servidores. O mecanismo Kubernetes orquestra automaticamente o ciclo de vida do contêiner, distribuindo os contêineres de aplicativos pela infraestrutura de hospedagem. Kubernetes pode aumentar ou diminuir rapidamente os recursos, dependendo da demanda. Ele provisiona, agenda, exclui e monitora continuamente a integridade dos contêineres.
Os conceitos básicos de Docker são imagens e contêineres. Uma imagem do Docker contém tudo o que é necessário para executar o software: o código, um tempo de execução (por exemplo, Java Virtual Machine (JVM), drivers, ferramentas, scripts, bibliotecas, implantações e muito mais.
Um contêiner Docker é uma instância em execução de uma imagem do Docker. No entanto, ao contrário da virtualização tradicional com um hipervisor tipo 1 ou tipo 2, um contêiner Docker é executado no kernel do sistema operacional host. Em uma imagem do Docker, não há sistema operacional separado, conforme ilustrado na Figura 1.
Cada contêiner Docker tem seu próprio sistema de arquivos, sua própria pilha de rede (e, portanto, seu próprio endereço IP), seu próprio espaço de processo, e limitações de recursos definidas para CPU e memória. Como um contêiner Docker não precisa inicializar um sistema operacional, ele é inicializado instantaneamente. O Docker se trata de isolamento, ou seja, separar os recursos de um sistema operacional host, em oposição à virtualização, ou seja, fornecer um sistema operacional convidado sobre o sistema operacional host.
O sistema de arquivos de uma imagem do Docker é dividido em camadas, com semântica de cópia na gravação. Isso permite a herança e a reutilização, poupa recursos no disco e permite o download de imagens incrementais.
Conforme ilustrado na Figura 2, uma imagem do Docker com uma implementação WebLogic pode ser baseada em uma imagem com um domínio Oracle WebLogic Server, que pode ser baseada em uma imagem WebLogic, que é baseada em uma imagem Java Development Kit (JDK), que, por sua vez, é baseada em uma imagem base do Oracle Linux.
Embora as imagens do Docker sejam fáceis de criar e os desenvolvedores amem a simplicidade e a portabilidade das imagens do Docker, eles descobriram rapidamente que gerenciar milhares de imagens do Docker é muito desafiador. O Docker Registry resolve este desafio. O Docker Registry é uma forma padrão de armazenar e distribuir imagens do Docker. O Registry é um repositório baseado em código aberto sob a licença Apache permissiva.
O Docker Registry também ajuda a melhorar o controle de acesso e a segurança das imagens do Docker armazenadas em seu repositório. Ele gerencia a distribuição de imagens e também pode se integrar com fluxos de trabalho de desenvolvimento de aplicativos. Os desenvolvedores podem configurar seu próprio Docker Registry ou usar um serviço hospedado do Docker Hub, Oracle Container Registry, Azure Container Registry, etc.
O Docker Hub é um registro do Docker hospedado gerenciado por Docker. O Docker Hub tem mais de 100.000 imagens de contêiner de fornecedores de software, projetos de código aberto e da comunidade. O Docker Hub contém software e aplicativos de repositórios oficiais, como NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu e Oracle Linux.
Ao iniciar um contêiner, o Docker por padrão puxará automaticamente a imagem correspondente do Docker Hub público se não estiver disponível localmente. Além disso, você também pode criar suas próprias imagens e enviá-las para o Docker Hub em um repositório público ou privado.
A ideia de cortar aplicativos monolíticos em pedaços menores de microsserviços atrai muita atenção atualmente entre os desenvolvedores de software.
Os microsserviços são implantados de forma independente como um processo, usam protocolos leves para se comunicarem e cada serviço possui seus dados. Como os microsserviços seguem uma abordagem de governança descentralizada, eles exigem uma quantidade bastante alta de automação de infraestrutura, testes automatizados, pipelines de CD totalmente automatizados e equipes de DevOps habilidosas e ágeis.
Ainda há muita discussão sobre esse estilo de arquitetura, mas seria ingênuo supor que um aplicativo decomposto em microsserviços possa ser simplesmente operado como um conjunto de processos. Para citar apenas alguns requisitos, um microsserviço precisa ser independente do host e isolado no nível do sistema operacional. Ele deve ser executado dentro de seus limites de recursos, deve ser escalado para cima e para baixo, reiniciado se falhar e descoberto e conectado a outros microsserviços por meio de uma camada de rede definida por software.
Portanto, executar um microsserviço em um contêiner Docker coloca você em um excelente ponto de partida para atingir a maioria dessas metas.
O Docker muda a maneira como criamos, enviamos e executamos software em duas dimensões diferentes:
Ambas as dimensões são explicadas com mais detalhes nos parágrafos a seguir.
Criar uma imagem do Docker com todas as suas dependências resolve o problema "mas funcionou para mim na minha máquina de desenvolvimento". A ideia principal é que uma imagem do Docker seja criada automaticamente por um pipeline de construção de um repositório de código-fonte como o Git e inicialmente testada em um ambiente de desenvolvimento. Essa imagem imutável será então armazenada em um registro do Docker.
Conforme mostrado na Figura 4, a mesma imagem será usada para outros testes de carga, testes de integração, testes de aceitação e muito mais. Em todos os ambientes, a mesma imagem será usada. Pequenas, mas necessárias diferenças ambientais específicas, como um URL do JDBC para um banco de dados de produção, podem ser inseridas no contêiner como variáveis de ambiente ou arquivos.
As estatísticas mostram que 65% de todos os casos de uso do Docker atuais estão em desenvolvimento e 48% usam o Docker para integração contínua.
O docker alterou a adoção de nuvens públicas: por um lado, com uma imagem Docker, pela primeira vez na história, existe um formato de pacote comum que pode ser executado no local, bem como em todos os principais provedores de nuvem. Os contêineres do Docker são executados em um laptop da mesma forma que são executados na Oracle Cloud.
Por outro lado, como os contêineres do Docker são executados em todas as principais nuvens públicas, eles são uma grande contribuição para superar um preconceito de longa data contra nuvens públicas: a restrição de fornecedor. Cada grande provedor de nuvem agora oferece o Docker como uma PaaS.
O ritmo dos lançamentos do Docker é muito mais rápido do que o ciclo de lançamento do software empresarial tradicional. Às vezes, o ritmo absoluto dos lançamentos do Docker, junto com a novidade do projeto do Docker, levanta preocupações sobre a segurança e a estabilidade do Docker.
Embora o Docker e sua linha de comando, o Docker daemon, sua API e ferramentas como Docker Swarm, Docker Machine e Docker Compose tenham sido disponibilizadas apenas nos últimos três anos, os recursos subjacentes de kernel têm sido disponibilizados em cada kernel do Linux durante quase uma década.
Um exemplo proeminente de um dos primeiros a adotar a tecnologia de contêiner é a Google. A Google usa contêineres Linux desde antes do Docker existir. Além disso, a Google executa tudo em um contêiner. Estima-se que o Google lance vários bilhões de contêineres por semana.
Os recursos do kernel do Linux que o Docker usa são cgroups e namespaces. Em 2008, os cgroups foram apresentados ao kernel do Linux com base no trabalho realizado anteriormente por desenvolvedores da Google1. Os cgroups limitam e contabilizam o uso de recursos de um conjunto de processos do sistema operacional.
O kernel do Linux usa namespace para isolar os recursos do sistema dos processos uns dos outros. O primeiro namespace, ou seja, o namespace de montagem, foi introduzido já em 2002.2
A primeira parte deste artigo explicou alguns conceitos do Docker importantes. No entanto, em um ambiente de produção, não é suficiente simplesmente executar um aplicativo em um contêiner Docker.
Para configurar e operar um ambiente de produção, é necessário hardware para executar os contêineres. Um software como o Docker, juntamente com repositórios e gerenciadores de cluster, deve ser instalado, atualizado e corrigido. Se vários contêineres Docker se comunicarem entre os hosts, uma rede deverá ser criada. Os contêineres em cluster devem ser reiniciados se falharem. Além disso, um conjunto de contêineres vinculados entre si deve ser implantado tão facilmente quanto uma única instância de aplicativo lógica. Um exemplo disso poderia ser um balanceador de carga, alguns servidores da Web, algumas instâncias do Oracle WebLogic Server com um servidor admin, um servidor gerenciado e um banco de dados. Para gerenciar aplicativos em contêineres em escala, é necessário um sistema de orquestração de contêineres como Kubernetes ou Docker Swarm. Implementar, gerenciar e operar sistemas de orquestração como Kubernetes pode ser desafiador e demorado.
Para tornar mais fácil e mais eficiente para os desenvolvedores criarem aplicativos em contêineres, os provedores de nuvem oferecem Serviços em nuvem de contêineres ou Containers as a Service (CaaS). Os Serviços em nuvem de contêineres ajudam os desenvolvedores e as equipes de operações a otimizar e gerenciar o ciclo de vida dos contêineres de maneira automatizada. Esses serviços de orquestração, normalmente construídos usando Kubernetes, tornam mais fácil para as equipes de DevOps gerenciarem e operarem aplicativos em contêineres em escala. O Oracle Container Engine for Kubernetes e o Azure Kubernetes Service são dois exemplos de serviços de nuvem gerenciados por orquestração de contêineres populares.
Oracle Container Engine for Kubernetes é um serviço totalmente gerenciado, escalonável e altamente disponível que você pode usar para implementar seus aplicativos em contêineres na nuvem. Use o Container Engine for Kubernetes (às vezes abreviado para apenas OKE) quando sua equipe de desenvolvimento desejar criar, implementar e gerenciar de maneira confiável aplicativos nativos em nuvem.
Os contêineres podem ser compactados por qualquer tipo de desenvolvedor. As pessoas no setor de software geralmente separam os desenvolvedores por especialização – front-end, back-end etc. Embora seja possível ver principalmente desenvolvedores de back-end compactando contêineres, qualquer pessoa familiarizada com os conceitos básicos de CaaS pode ter sucesso nessa área específica do ciclo de vida de desenvolvimento de software. Antes de compactar as dependências da sua aplicação, confira developer.oracle.com e familiarize-se com as ferramentas que você pode usar para criar uma aplicação ou um programa.
Veja algumas fontes para obter ou criar imagens do Docker para produtos Oracle. O repositório do Oracle GitHub para imagens do Docker contém Dockerfiles e amostras para criar imagens do Docker para produtos comerciais Oracle e projetos de código aberto patrocinados pela Oracle.