O que é o Docker?What is Docker?

O Docker é um projeto de software livre para automatizar a implantação de aplicativos como contêineres autossuficientes portáteis que podem ser executados na nuvem ou localmente.Docker is an open-source project for automating the deployment of applications as portable, self-sufficient containers that can run on the cloud or on-premises. O Docker é também uma empresa que promove e aprimora essa tecnologia, trabalhando em colaboração com fornecedores de nuvem, do Linux e do Windows, incluindo a Microsoft.Docker is also a company that promotes and evolves this technology, working in collaboration with cloud, Linux, and Windows vendors, including Microsoft.

Contêineres do Docker podem executar em qualquer lugar, localmente no datacenter do cliente, em um provedor de serviços externo ou na nuvem, no Azure.

Figura 2-2.Figure 2-2. O Docker implanta contêineres em todas as camadas da nuvem híbridaDocker deploys containers at all layers of the hybrid cloud

Os contêineres de imagem do Docker podem ser executados nativamente no Linux e no Windows.Docker image containers can run natively on Linux and Windows. No entanto, imagens do Windows podem executar somente em hosts do Windows e imagens do Linux podem executar em hosts do Linux e hosts do Windows (usando uma VM do Linux do Hyper-V, até o momento), em que o host significa um servidor ou uma VM.However, Windows images can run only on Windows hosts and Linux images can run on Linux hosts and Windows hosts (using a Hyper-V Linux VM, so far), where host means a server or a VM.

Os desenvolvedores podem usar ambientes de desenvolvimento no Windows, Linux ou macOS.Developers can use development environments on Windows, Linux, or macOS. No computador de desenvolvimento, o desenvolvedor executa um host Docker em que as imagens do Docker são implantadas, incluindo o aplicativo e suas dependências.On the development computer, the developer runs a Docker host where Docker images are deployed, including the app and its dependencies. Os desenvolvedores que trabalham no Linux ou no Mac usam um host do Docker que é baseado no Linux, e eles podem criar imagens apenas para contêineres do Linux.Developers who work on Linux or on the Mac use a Docker host that is Linux based, and they can create images only for Linux containers. (Os desenvolvedores que trabalham no Mac podem editar o código ou executar a CLI do Docker no macOS, mas no momento da redação deste artigo, contêineres não são executados diretamente no macOS.) Desenvolvedores que trabalham no Windows podem criar imagens para contêineres do Linux ou do Windows.(Developers working on the Mac can edit code or run the Docker CLI from macOS, but as of the time of this writing, containers don't run directly on macOS.) Developers who work on Windows can create images for either Linux or Windows Containers.

Para hospedar contêineres em ambientes de desenvolvimento e fornecer ferramentas para desenvolvedores adicionais, o Docker envia o Docker Community Edition (CE) para Windows ou para o macOS.To host containers in development environments and provide additional developer tools, Docker ships Docker Community Edition (CE) for Windows or for macOS. Esses produtos instalam a VM necessária (o host do Docker) para hospedar os contêineres.These products install the necessary VM (the Docker host) to host the containers. O Docker também disponibiliza o Docker Enterprise Edition (EE), que foi projetado para desenvolvimento empresarial e é usado por equipes de TI que criam, enviam e executam aplicativos de grande porte críticos para os negócios em produção.Docker also makes available Docker Enterprise Edition (EE), which is designed for enterprise development and is used by IT teams who build, ship, and run large business-critical applications in production.

Para executar contêineres do Windows, há dois tipos de tempos de execução:To run Windows Containers, there are two types of runtimes:

  • Os contêineres do Windows Server fornecem isolamento de aplicativos por meio da tecnologia de isolamento de processo e de namespace.Windows Server Containers provide application isolation through process and namespace isolation technology. Um contêiner do Windows Server compartilha um kernel com o host do contêiner e todos os contêineres em execução no host.A Windows Server Container shares a kernel with the container host and with all containers running on the host.

  • Os contêineres do Hyper-V expandem o isolamento fornecido pelos contêineres do Windows Server, executando cada contêiner em uma máquina virtual altamente otimizada.Hyper-V Containers expand on the isolation provided by Windows Server Containers by running each container in a highly optimized virtual machine. Nessa configuração, o kernel do host do contêiner não é compartilhado com os contêineres do Hyper-V, fornecendo melhor isolamento.In this configuration, the kernel of the container host isn't shared with the Hyper-V Containers, providing better isolation.

As imagens desses contêineres são criadas e funcionam da mesma maneira.The images for these containers are created the same way and function the same. A diferença está em como o contêiner é criado da imagem, executar um contêiner do Hyper-V exige um parâmetro extra.The difference is in how the container is created from the image running a Hyper-V Container requires an extra parameter. Para obter detalhes, consulte Contêineres do Hyper-V.For details, see Hyper-V Containers.

Comparando os contêineres do Docker com máquinas virtuaisComparing Docker containers with virtual machines

A Figura 2-3 mostra uma comparação entre VMs e contêineres do Docker.Figure 2-3 shows a comparison between VMs and Docker containers.

Máquinas virtuaisVirtual Machines Contêineres do DockerDocker Containers
Para VMs, há três camadas de base no servidor de host, de cima para baixo: infraestrutura, sistema operacional do host e um hipervisor e, acima disso tudo, cada VM tem seu próprio sistema operacional e todas as bibliotecas necessárias. Para o Docker, o servidor de host tem apenas a infraestrutura e o sistema operacional e, acima disso tudo, o mecanismo de contêiner que mantém contêiner isolado mas compartilhando os serviços do sistema operacional base.
As máquinas virtuais incluem o aplicativo, as bibliotecas ou binários necessários e um sistema operacional convidado completo.Virtual machines include the application, the required libraries or binaries, and a full guest operating system. A virtualização completa requer mais recursos do que a conteinerização.Full virtualization requires more resources than containerization. Os contêineres incluem o aplicativo e todas as suas dependências.Containers include the application and all its dependencies. No entanto, eles compartilham o kernel do sistema operacional com outros contêineres, executando como processos isolados no espaço do usuário no sistema operacional do host.However, they share the OS kernel with other containers, running as isolated processes in user space on the host operating system. (Exceto em contêineres do Hyper-V, em que cada contêiner é executado dentro de uma máquina virtual especial por contêiner.)(Except in Hyper-V containers, where each container runs inside of a special virtual machine per container.)

Figura 2-3.Figure 2-3. Comparação de máquinas virtuais tradicionais com contêineres do DockerComparison of traditional virtual machines to Docker containers

Como os contêineres requerem muito menos recursos (por exemplo, eles não precisam de um sistema operacional completo), eles iniciam rapidamente e são fáceis de implantar.Because containers require far fewer resources (for example, they don't need a full OS), they're easy to deploy and they start fast. Isso permite que você tenha maior densidade, o que significa que permite a você executar mais serviços na mesma unidade de hardware, reduzindo os custos.This allows you to have higher density, meaning that it allows you to run more services on the same hardware unit, thereby reducing costs.

Como um efeito colateral da execução no mesmo kernel, você obtém menos isolamento do que em VMs.As a side effect of running on the same kernel, you get less isolation than VMs.

A meta principal de uma imagem é que ela torne o ambiente (dependências) o mesmo entre diferentes implantações.The main goal of an image is that it makes the environment (dependencies) the same across different deployments. Isso significa que é possível depurá-la em seu computador e, em seguida, implantá-la em outro computador com o mesmo ambiente garantido.This means that you can debug it on your machine and then deploy it to another machine with the same environment guaranteed.

Uma imagem de contêiner é uma maneira de empacotar um aplicativo ou serviço e implantá-lo de maneira confiável e reproduzível.A container image is a way to package an app or service and deploy it in a reliable and reproducible way. Seria possível dizer que o Docker não é apenas uma tecnologia, mas também uma filosofia e um processo.You could say that Docker isn't only a technology but also a philosophy and a process.

Ao usar o Docker, você não escutará os desenvolvedores dizerem "Funciona no meu computador, por que não em produção?"When using Docker, you won't hear developers say, "It works on my machine, why not in production?" Eles podem simplesmente dizer: "É executado no Docker", porque o aplicativo empacotado do Docker pode ser executado em qualquer ambiente do Docker compatível, sendo executado da maneira pretendida em todos os destinos de implantação (tais como desenvolvimento, garantia de qualidade, preparação e produção).They can simply say, "It runs on Docker", because the packaged Docker application can be executed on any supported Docker environment, and it runs the way it was intended to on all deployment targets (such as Dev, QA, staging, and production).

Uma analogia simplesA simple analogy

Talvez uma analogia simples possa ajudar a obter o entendimento do conceito principal do Docker.Perhaps a simple analogy can help getting the grasp of the core concept of Docker.

Vamos voltar no tempo à década de 1950 por um momento.Let's go back in time to the 1950s for a moment. Não havia nenhum processador de palavras e as fotocopiadoras eram usadas em toda parte (ou quase).There were no word processors, and the photocopiers were used everywhere (kind of).

Imagine que você seja responsável por emitir lotes de cartas rapidamente conforme necessário, enviá-las aos clientes usando papel e envelopes de verdade, a serem entregues fisicamente ao endereço de cada cliente (não havia email naquela época).Imagine you're responsible for quickly issuing batches of letters as required, to mail them to customers, using real paper and envelopes, to be delivered physically to each customer's address (there was no email back then).

Em algum momento, você percebe que as cartas são apenas uma composição de um grande conjunto de parágrafos, que são separados e organizados conforme necessário de acordo com a finalidade da carta, então você elabora um sistema para emitir cartas rapidamente, esperando receber um aumento substancial.At some point, you realize the letters are just a composition of a large set of paragraphs, which are picked and arranged as needed, according to the purpose of the letter, so you devise a system to issue letters quickly, expecting to get a hefty raise.

O sistema é simples:The system is simple:

  1. Você começa com um maço de folhas transparentes, que contém um parágrafo cada.You begin with a deck of transparent sheets containing one paragraph each.

  2. Para emitir um conjunto de cartas, você escolhe as planilhas com os parágrafos que precisa e, em seguida, empilha-as e alinha-as para que elas possam ser lidas corretamente e fiquem aparência organizada.To issue a set of letters, you pick the sheets with the paragraphs you need, then you stack and align them so they look and read fine.

  3. Por fim, você coloca o conjunto na fotocopiadora e pressiona o botão de início para produzir tantas cartas quantas forem necessárias.Finally, you place the set in the photocopier and press start to produce as many letters as required.

Portanto, simplificando, essa é a ideia central do Docker.So, simplifying, that's the core idea of Docker.

No Docker, cada camada é o conjunto resultante de alterações que ocorrem no sistema de arquivos depois de executar um comando, tal como instalar um programa.In Docker, each layer is the resulting set of changes that happen to the filesystem after executing a command, such as, installing a program.

Assim, quando você "olha" para o sistema de arquivos depois que a camada é copiada, você vê todos os arquivos, incluindo a camada quando o programa foi instalado.So, when you "look" at the filesystem after the layer has been copied, you see all the files, included the layer when the program was installed.

Você pode pensar uma imagem como um auxiliar somente leitura disco rígido pronto para ser instalado em um "computador" em que o sistema operacional já está instalado.You can think of an image as an auxiliary read-only hard disk ready to be installed in a "computer" where the operating system is already installed.

Da mesma forma, você pode pensar em um contêiner como o "computador" com o disco rígido de imagem instalado.Similarly, you can think of a container as the "computer" with the image hard disk installed. O contêiner, assim como um computador, pode ser ativado ou desativado.The container, just like a computer, can be powered on or off.