O Docker transformou a maneira como as aplicações são implementadas e é fundamental para o desenvolvimento corporativo contemporâneo. Neste manual, abordaremos desde a instalação e configuração do Docker até a criação de um contêiner Docker e a utilização de Dockerfiles para automatizar o processo de compilação de imagens Docker.

Os recipientes são uma alternativa mais leve e ágil às máquinas virtuais, permitindo a portabilidade de aplicativos e serviços entre diferentes ambientes, sem a sobrecarga característica das VMs.
Docker, desenvolvido pela Docker Inc., é um sistema que disponibiliza a funcionalidade de contêineres do Linux para usuários finais por meio de uma interface de linha de comando e APIs.
Muitos aplicativos comuns agora estão disponíveis como contêineres Docker pré-criados, facilitando a implantação de pilhas de software como componentes independentes – uma abordagem baseada em microservices. No entanto, é importante compreender como essas peças se integram. Neste guia, exploraremos o funcionamento do Docker, começando com a configuração em sistemas Linux, Windows e macOS. Em seguida, demonstraremos a instalação de um servidor web Apache em um contêiner Docker, além de como trabalhar com Dockerfiles para automatizar a construção de imagens Docker.
Selecione um contêiner Docker.
Em sua essência, o Docker se baseia no Docker Engine, um projeto de código aberto. O Docker Engine pode ser instalado e utilizado diretamente via linha de comando, porém somente no sistema operacional Linux (ou através do WSL no Windows).
A segunda escolha disponível é o Docker Desktop, um aplicativo com interface gráfica que facilita a utilização de contêineres em diferentes plataformas. Para desenvolvedores que usam o sistema operacional Microsoft Windows, o Docker Desktop é a opção mais prática.
O principal aspecto a ser considerado em relação ao Docker Desktop é sua política de licenciamento. Enquanto o uso individual, não comercial e educacional é gratuito, o uso em ambientes empresariais normalmente requer o pagamento de taxas de licenciamento, que variam de acordo com o porte da organização.

Docker Desktop oferece uma prática interface visual para a utilização do Docker, e conta também com uma interface de console integrada.
Por favor, forneça mais contexto ou detalhes sobre o texto que deseja parafrasear.
Você também pode baixar versões binárias separadas do Docker Engine para Windows, macOS e Linux. No entanto, será necessário configurar tudo manualmente, pois o Docker possui mais do que apenas um arquivo binário. Essas versões autônomas não possuem um sistema de atualização automática e podem não incluir todas as funcionalidades presentes na versão completa do Docker.
Utilizando o Docker no sistema operacional Linux.
O Docker teve início no ambiente Linux devido à dependência da tecnologia de contêineres dos recursos presentes no kernel do sistema operacional. No Linux, é possível utilizar os recursos de código aberto do Docker através do Docker Engine. A configuração do Docker Engine varia de acordo com a distribuição Linux utilizada, mas o mesmo se aplica à configuração do Docker Desktop no Linux. Após a instalação, o Docker Desktop no Linux oferece opções mais práticas para gerenciar uma configuração Docker em comparação com o uso exclusivo da linha de comando.
Utilizando o Docker no sistema operacional Windows.
No Windows, o Docker Desktop pode operar de duas maneiras: utilizando a virtualização nativa Hyper-V do Windows ou por meio de uma instância do Linux no WSL2. Ambas as abordagens proporcionam as mesmas capacidades e possuem requisitos de hardware semelhantes: processador de 64 bits com suporte SLAT, no mínimo 4GB de RAM e virtualização de hardware ativada na BIOS.
Entre as duas opções, o WSL2 é a escolha mais acessível e com menor demanda de recursos. Por outro lado, o Hyper-V é mais exigente e está disponível apenas nas edições profissionais ou empresariais do Windows 10 ou 11. Embora o Hyper-V ofereça recursos avançados de isolamento de processos a partir do Windows 11 e Windows Server 2022, esses recursos podem não ser essenciais para iniciantes.
Se desejar utilizar um sistema VM ou hipervisor diferente para executar contêineres Docker, como a VMware, o suporte do Docker está disponível apenas em suas versões empresariais.
Utilizando Docker no sistema operacional macOS.
Para instalar o Docker Desktop no macOS, o procedimento é semelhante ao de instalar qualquer outro aplicativo desktop. Basta abrir o arquivo Docker.dmg com um duplo clique e arrastar o ícone do Docker para a pasta de Aplicações. Também é possível realizar a configuração por meio da linha de comando.
Trabalhando com a interface de linha de comando do Docker.
O principal meio de interação com Docker é por meio do utilitário de linha de comando docker. Após a instalação, é possível acessá-lo a partir de qualquer console e listar os comandos disponíveis digitando simplesmente “docker”. Para obter informações atualizadas sobre os comandos, opções e descrições completas, recomenda-se consultar a documentação oficial do cliente de linha de comando.
Quando o Docker está configurado, um dos primeiros comandos que você pode executar é “docker info”, que fornece detalhes básicos sobre sua instalação. Os dados incluem o número de contêineres e imagens, bem como outras informações relevantes. Vale ressaltar que a saída pode ser extensa; o exemplo apresentado aborda apenas o conteúdo da última de várias páginas.

chsyys/KaboomPics
Trecho: Excerto do comando ‘docker info’, que fornece uma ampla gama de informações sobre a configuração atual do Docker, geralmente ocupando várias páginas no console.
Pode me fornecer mais detalhes sobre o conteúdo que deseja parafrasear?
Instruções Docker para o sistema operacional Linux
Observe que no sistema operacional Linux, pode ser necessário configurar previamente os comandos do Docker com o sudo. Esta recomendação é válida para todos os demais exemplos de comando mencionados neste artigo.
O cliente Docker Desktop não tem a intenção de substituir o docker CLI, mas sim complementá-lo. Ele oferece uma interface gráfica conveniente para realizar tarefas cotidianas com contêineres, como executar contêineres, verificar imagens instaladas, inspecionar volumes criados, listar compilações de imagens de contêiner e gerenciar as extensões do Docker Desktop. Além disso, o Docker Desktop inclui um console integrado para acesso rápido e fácil, sem a necessidade de desligar.
Vamos adotar o Docker CLI como a forma convencional de trabalhar com o Docker.
Atuando com contêineres e figuras no Docker.
Os contêineres Docker são mais eficazes do que as máquinas virtuais, pois quando não estão em uso, permanecem inativos, consumindo recursos mínimos, semelhantes a processos autônomos.
Os containers precisam ter uma imagem em execução, mas geralmente não há uma imagem presente de forma padrão em uma instalação do Docker. Se for necessário executar uma imagem ausente, será preciso baixá-la e adicioná-la ao repositório local de imagens. É possível baixar e adicionar imagens ao repositório de forma semi-automática, conforme será demonstrado no exemplo a seguir.
Colocação de um receptáculo em circulação.
Se desejarmos iniciar uma imagem simples do Ubuntu Linux no Docker e acessar o shell bash, podemos utilizar o comando a seguir.
A aparência da saída será semelhante a isto:
Isso demonstra o Docker buscando a imagem do Ubuntu e iniciando um contêiner com base nela. O comando final é o convite para o shell Bash em funcionamento no contêiner, permitindo que você insira comandos. É importante observar que quaisquer comandos inseridos nesse prompt serão executados no contêiner do Docker e não no sistema como um todo.
Analisando recipientes em funcionamento
Você pode ver contêineres ativos e inativos usando o comando docker ps. Lembre-se de executar este comando a partir do console do seu sistema, e não do prompt dentro de um contêiner. Se usar docker ps -a, serão exibidos todos os contêineres no sistema, independentemente do status; somente o comando docker ps mostrará os contêineres em execução.
A solução para os contêineres Docker pode se apresentar desta maneira:
Cada recipiente em funcionamento possui um identificador (ID) específico – neste caso, é a sequência de caracteres iniciando com 16fd – juntamente com detalhes sobre a imagem utilizada para sua criação e um nome fácil de identificar para o recipiente (aqui denominado stoic_gould). Esse nome amigável pode ser designado manualmente utilizando o parâmetro de nome no comando docker run, ou pode ser atribuído aleatoriamente durante a inicialização.
Contenedores con capacidad de ser arrastrados.
Ao executar o Docker, ele automaticamente baixou uma imagem do recipiente Ubuntu do Docker Hub. Geralmente, é recomendável baixar as imagens dos contêineres para o cache local antecipadamente, ao invés de fazer isso quando necessário. Para realizar essa ação antecipada, utilize o comando docker pull.
No Docker Hub, é possível encontrar uma ampla seleção de imagens e repositórios que podem ser facilmente pesquisados.
Comparação entre Imagens Docker e Contêineres.
Neste momento, é importante destacar como imagens, containers e a dinâmica de puxar/pushar interagem entre si.
Os containers do Docker são criados a partir de imagens, que funcionam como ambientes virtuais contendo os elementos necessários para a execução de aplicações.
As imagens possuem tags, que são como metadados, para auxiliar no armazenamento e na identificação de várias versões de uma imagem. Uma imagem pode ter diversas tags, como por exemplo ubuntu:16.04, ubuntu:xenial-20171201, ubuntu:xenial e ubuntu:latest.
O comando docker pull ubuntu baixa a imagem padrão do Ubuntu do repositório Ubuntu, que é a versão mais recente disponível. Em resumo, executar docker pull ubuntu é o mesmo que executar docker pull ubuntu:latest.
Perceba que se eu tivesse executado o comando docker pull -a ubuntu, teria baixado todas as imagens do repositório Ubuntu para meu sistema local. Isso poderia ser útil se eu quisesse usar várias imagens do Ubuntu sem precisar baixá-las uma por uma, porém ocuparia bastante espaço localmente.
Na maioria das situações, é provável que você deseje a imagem padrão ou uma versão específica. Por exemplo, se você precisar da imagem do Ubuntu Saucy Salamander, poderá utilizar o comando docker pull -a ubuntu:saucy para baixar a imagem com essa tag específica daquele repositório.
A mesma ideia por trás de repos e tags é válida para outras operações de imagem. Por exemplo, ao executar a imagem saucy como mostrado acima, você pode fazê-lo utilizando o comando docker run -i -t ubuntu:saucy /bin/bash. Se você deseja remover a imagem ubuntu digitando docker rm ubuntu, apenas a imagem marcada como a mais recente será removida. Para excluir imagens específicas, como o Ubuntu Saucy, é necessário incluir a tag apropriada: docker image rm ubuntu:saucy.
Processo de trabalho de imagem e recipiente Docker
Após a extração de uma imagem, inicia-se um recipiente em tempo real utilizando o seu conteúdo por meio da execução do comando docker run.
Paráfrase: As imagens permanecem inalteradas. Quando você inicia um contêiner, ele basicamente replica o conteúdo da imagem, e qualquer modificação feita será perdida ao encerrar o contêiner.
Se desejado, é possível efetuar modificações na imagem de diversas formas. Uma opção é editar o Dockerfile da imagem e gerar uma nova versão com as alterações. Outra alternativa é realizar as mudanças dentro do contêiner em execução e criar uma nova imagem que inclua tais alterações usando o comando de commit do docker. Em ambos os casos, a imagem original não é modificada; em vez disso, uma nova imagem é criada com as atualizações feitas.
É relevante destacar que o Docker armazena apenas as diferenças, ou mudanças, nas imagens que são criadas a partir de outras imagens. Ao criar suas próprias imagens, somente as modificações realizadas na imagem base são registradas na nova imagem, que se conecta de volta à imagem base para todas as suas necessidades. Dessa forma, é possível gerar imagens que aparentam ter 266MB de tamanho, mas ocupam apenas alguns megabytes no disco.
Os contêineres devidamente configurados podem ser transferidos para um local central para serem utilizados em diferentes áreas da empresa ou até mesmo compartilhados de forma pública. Dessa maneira, um desenvolvedor de aplicativos pode disponibilizar um contêiner publicamente para um aplicativo, ou é possível criar repositórios privados para armazenar todos os contêineres utilizados internamente pela organização.
Criar uma imagem Docker fresca de um contêiner.
Agora que você entende um pouco sobre o funcionamento de imagens e contêineres, vamos criar um contêiner permanente para um servidor web Apache.
Crie um recipiente Docker completamente novo.
Primeiramente, é necessário criar um recipiente novo. Existem várias maneiras de realizar essa tarefa, no entanto, devido à necessidade de executar alguns comandos, recomenda-se iniciar um shell raiz em um recipiente recém-criado.
Isso gera um novo contêiner com um identificador exclusivo e o nome apache_web. Além disso, concede acesso de administrador, já que foi indicado /bin/bash como o comando a ser executado. Em seguida, proceda à instalação do servidor web Apache utilizando o apt-get.
Observe que não é necessário utilizar o comando sudo, uma vez que você está operando como root dentro do container. É importante executar o comando apt-get update, pois a lista de pacotes dentro do container pode diferir da lista externa. As demais instruções no container não requerem o uso do sudo, a menos que seja especificamente indicado.
A opção apt-get usual de saída é exibida e o pacote Apache2 é instalado no novo contêiner. Após a conclusão da instalação, inicie o Apache, instale o curl e verifique a instalação, tudo dentro do contêiner.
Se estivesse realizando essa atividade em um ambiente de produção, você personalizaria as configurações do Apache e instalaria um aplicativo para ser executado por ele. O Docker possibilita que diretórios externos ao contêiner sejam conectados a caminhos internos, permitindo que você armazene seu aplicativo web em um diretório no servidor e o torne acessível ao contêiner por meio de um mapeamento.
Desenvolver um script de boot para um contêiner Docker.
Tenha em mente que um contêiner Docker permanece em execução somente enquanto seu processo ou processos estiverem ativos. Se o processo que você inicia quando o contêiner é executado for movido para segundo plano, como um daemon do sistema, o Docker irá interromper o contêiner. Portanto, é necessário executar o Apache em primeiro plano ao iniciar o contêiner para evitar que ele seja encerrado imediatamente após o lançamento.
Elaborar um script denominado startapache.sh dentro do diretório /usr/local/sbin:
Você não é obrigado a utilizar o editor nano para essa tarefa, mas é recomendado.
O que está incluído no arquivo startapache.sh:
Guardar o documento e habilitar sua execução.
O único propósito deste pequeno script é configurar as variáveis de ambiente necessárias para o Apache e iniciar o processo do Apache em primeiro plano.
Você está preparado para editar o conteúdo do recipiente de modo a poder sair do recipiente digitando a saída. Ao sair do recipiente, ele será encerrado.
Altere o recipiente para gerar uma nova representação do Docker.
Agora é necessário confirmar o recipiente para que as alterações realizadas sejam salvas.
O comando commit irá guardar o seu contêiner como uma imagem nova e fornecerá um identificador único. Ao adicionar o argumento local:apache_web, o commit será armazenado em um repositório local chamado local com a tag apache_web.
Você pode visualizar isso ao executar os comandos das imagens docker.
Observe que os detalhes específicos da sua imagem, como o ID da imagem e as dimensões do recipiente, serão distintos dos apresentados no meu exemplo.
Princípios fundamentais da infraestrutura de contêineres do Docker
Agora que você possui sua própria imagem, é possível começar a executar seu contêiner e disponibilizar páginas. Antes de prosseguir, vamos abordar a forma como o Docker trata a rede.
O Docker pode estabelecer diversas redes virtuais que os contêineres Docker utilizam para se comunicar entre si e com o ambiente externo.
- Texto parafraseado: A ponte é a conexão padrão entre os recipientes. Ela possibilita que os recipientes se comuniquem diretamente entre si, mas não com o sistema de host.
- O hospedeiro tem a capacidade de visualizar diretamente os recipientes nesta rede, como se os aplicativos neles contidos estivessem atuando como serviços de rede local.
- Não. Isso é basicamente uma rede vazia ou de retorno. Um recipiente ligado a nada não consegue visualizar mais do que a si mesmo.
Outras placas de rede também estão disponíveis, mas essas três são as mais essenciais para iniciar.
Quando deseja que um recipiente se comunique com outros recipientes e com o ambiente externo, é necessário configurar manualmente as portas do recipiente para o host. Por exemplo, isso pode ser feito através da linha de comando ao lançar o recipiente recém-criado.
O interruptor -p é empregado para realizar o redirecionamento de porta. Neste caso, redireciona a porta 8080 do host para a porta 80 dentro do contêiner.
Após realizar essa ação, é esperado que você consiga acessar o endereço IP do host utilizando um navegador web e visualizar a página padrão do servidor web Apache.
Você tem a possibilidade de visualizar o estado do recipiente e as associações de porta TCP ao utilizar o comando docker ps.
Você pode verificar os mapeamentos de rede utilizando o comando docker port, por exemplo, docker port apache.
Observe que é possível empregar a flag -P ao executar o comando docker run para expor todas as portas abertas no contêiner para o host e direcionar uma porta aleatória, como a 49153, de volta para a porta 80 no contêiner. Essa técnica pode ser útil em scripts conforme necessário, mas não é recomendável utilizá-la em ambientes de produção.
Neste momento, você possui um recipiente Docker em pleno funcionamento com o processo Apache. Ao parar o recipiente, ele continuará presente no sistema e poderá ser reiniciado a qualquer momento usando o comando docker restart.
Utilize os arquivos Dockerfiles para automatizar o processo de construção de imagens no Docker.
Paráfrase do texto: Embora seja instrutivo construir manualmente recipientes Docker, pode ser tedioso fazê-lo várias vezes. Para simplificar, padronizar e tornar o processo de construção mais fácil, Docker oferece uma maneira automatizada de criar imagens Docker chamadas Dockerfiles.
Os Dockerfiles são documentos de texto guardados em um repositório junto com as imagens Docker. Eles explicam como um contêiner específico é criado, permitindo que o Docker realize o processo de compilação automaticamente. Um exemplo de Dockerfile para um contêiner básico é apresentado nas etapas iniciais desta demonstração.
Se você optar por salvar este arquivo com o nome dftest no seu diretório local, será possível criar uma imagem denominada ubuntu:testando a partir do dftest através do comando a seguir:
No Shell de comando, você empregaria esta instrução:
O Docker criará uma nova imagem usando a versão mais recente do Ubuntu. Em seguida, no contêiner, será realizada uma atualização usando o apt-get e o curl será instalado através do apt-get. Por fim, o comando padrão a ser executado ao iniciar o contêiner será definido como /bin/bash.
Aqui está! Você obteve um shell raiz em um recipiente recém-criado com essas configurações. Importante notar que também é possível iniciar o recipiente com este comando:
Diversos operadores podem ser utilizados em um Dockerfile, como por exemplo, a vinculação de diretórios do host para os containers, a definição de variáveis de ambiente e a configuração de gatilhos para serem empregados em compilações posteriores. Consulte a página de referência do Dockerfile para ter acesso a uma lista completa de operadores disponíveis.
Próximas etapas com Docker
Existem mais aspectos do Docker para explorar além do que foi abordado neste guia, no entanto é importante ter conhecimento básico sobre o funcionamento do Docker, compreender os conceitos principais e estar familiarizado o suficiente para construir contêineres em funcionamento. Para obter mais informações, é possível acessar o site do Docker, onde há um tutorial detalhado sobre os recursos disponíveis.